Принудительно загружать файлы сломанных заголовков неправильно? - PullRequest
0 голосов
/ 08 декабря 2011
if($_POST['mode']=="save") {
$root = $_SERVER['DOCUMENT_ROOT'];
$path = "/mcboeking/";
$path = $root.$path;
$file_path = $_POST['path'];
$file = $path.$file_path;

if(!file_exists($file)) {
    die('file not found');
} else {
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header('Content-Type: application/force-download');
    header("Content-Disposition: attachment; filename=\"".basename($file)."\";" );
    header("Content-Length: ".filesize($file));
    readfile($file);}}

Как только я загружаю файл и открываю его, я получаю сообщение об ошибке.Когда я пытаюсь открыть файл .doc, я получаю сообщение: структура файла неверна.И когда я пытаюсь открыть файл .jpg: Этот файл не может быть открыт.Это может быть поврежденный файл или формат файла, который Preview не распознает.

Но когда я загружаю файлы PDF, они открываются без проблем.

Может ли кто-нибудь мне помочь?

PS я пробовал разные заголовки, включая: header ('Content-Type: application / octet-stream');

Ответы [ 4 ]

0 голосов
/ 06 июня 2015

Открыть файл PHP в NOTEPAD. Нажмите «Сохранить как» и выберите формат файла «ASCI». Это помогло в моем случае, потому что файл был в формате UTF8, и это было причиной.

0 голосов
/ 08 декабря 2011

Убедитесь, что вы ничего не выводите, кроме данных readfile(): убедитесь, что код PHP начинается с <? в самом первом символе файла PHP, и что после закрывающего ?> нет символовконец файла, например пробел или символ новой строки (или вообще удалите ?>).

0 голосов
/ 08 декабря 2011
$fsize = filesize($yourFilePath); 
$allowed_ext = array (

  // archives
  'zip' => 'application/zip',

  // documents
  'pdf' => 'application/pdf',
  'doc' => 'application/msword',
  'xls' => 'application/vnd.ms-excel',
  'ppt' => 'application/vnd.ms-powerpoint',

);
$mtype = mime_content_type($file_path);
if ($mtype == '') {
    $mtype = "application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$asfname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);
//then ur rest code
0 голосов
/ 08 декабря 2011

Ваши заголовки не имеют отношения к реальному контенту, поэтому проблема в том, что с фактическим контентом что-то не так.

Кроме того, вам не следует пытаться форсировать загрузку, изменяя заголовок Content-Type. Оставьте это, как это должно быть. Пусть клиент решит, что с ним делать.

...