У меня есть следующий код для загрузки zip-файла для загрузки.
$filename = "ResourcePack_".time().".zip"; $destination = $basepath."downloads/$filename"; if($this->createdownload($files,$destination,false)){ header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Length: ". filesize("$destination").";"); header("Content-Disposition: attachment; filename='$filename'"); header("Content-Type: application/octet-stream; "); header("Content-Transfer-Encoding: binary"); ob_end_flush(); @readfile($destination); if(file_exists($destination)){ unlink($destination); } }
Я знаю, что функция createdownload работает для генерации zip-файла просто отлично, потому что я вижу, что файл создается на сервере. Проблема заключается в том, что файл записывается в браузер как куча мусора вместо открытия потока загрузки. Я что-то пропустил в своих заголовках?
Я был прав. Моя проблема заключается не в php, а в вызове php-файла, который генерирует этот код с помощью вызова JQuery $ .ajax, является проблема. Использование $ .ajax автоматически устанавливает заголовок запроса Accept-Encoding в значения, несовместимые с zip-файлами. Итак, вместо использования $ .ajax я просто использовал простую команду window.open javascript для вызова одной и той же php-страницы, и она отлично работает с заголовками.
попробуйте поместить штамп после @readfile и удалить @, чтобы узнать, есть ли у вас другая ошибка, связанная с чтением файла.
У меня есть код, делающий то же самое, и это работает для меня:
header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private", false); // required for certain browsers header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-type: application/zip'); //header("Content-Transfer-Encoding: binary"); header("Content-Length: " . filesize($destination)); readfile($destination); die();
попробуйте передать соответствующий тип для этого файла. Я думаю, что его тип mime fileinfo см. http://www.php.net/manual/en/ref.fileinfo.php
header("Content-Type: $file_type");
Также у вас есть точка с запятой после октетного потока
header("Content-type: application/octet-stream");