PHP: принуждение загрузки не работает

У меня есть следующий код для загрузки 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");