У меня есть архив на стороне сервера, который я хотел бы передать в качестве загрузки. Я использую настраиваемое расширение для связывания этих конкретных архивов с некоторым программным обеспечением клиента (например, CustomArchive.bwz).
Chrome и FireFox отлично справляются с этим настраиваемым расширением, но Internet Explorer продолжает использовать «.zip» в конце имени файла (например, CustomArchive.bwz.zip).
Вот мой метод файла загрузки:
function downloadFile($file) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; }
В качестве примера я называю это следующим образом:
downloadFile( "CustomArchive.bwz" );
Где CustomArchive.bwz – это просто zip-файл с пользовательским расширением.
После игры с удалением различных битов из моего метода downloadFile я смог сузить его до моего вызова ob_clean (). К сожалению, удаление этого вызова приводит к повреждению загрузок.
Есть ли работа вокруг, что я могу заставить IE использовать расширение .bwz и не придерживаться на .zip?
На моем сервере работает PHP 5.3.5 на IIS 7.5.
От marcelebrate: использование application/force-download
вместо application/octet-stream
– это то, что помешало IE предположить, что мой файл был zip-архивом.
function downloadFile($file){ $file_name = $file; $mime = 'application/force-download'; header('Pragma: public'); // required header('Expires: 0'); // no cache header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Cache-Control: private',false); header('Content-Type: '.$mime); header('Content-Disposition: attachment; filename="'.basename($file_name).'"'); header('Content-Transfer-Encoding: binary'); header('Connection: close'); header('Content-Length: ' . filesize($file)); //from Christian Sciberras: There may (often) be multiple levels of output buffering. while(ob_get_level()) ob_end_clean(); ob_implicit_flush(true); readfile($file_name); // push it out exit(); }