Я использую php ZipArchive для создания zip-файла на лету и отправки его пользователю. Я временно храню zipped-файл в папке над корнем документа и затем отправляю его с кодом
header('Content-type:application/zip'); header('Content-Disposition: inline; filename="'.("file.zip").'"'); header("Content-Transfer-Encoding: binary"); header("Content-Length:".filesize($file)); $fh = fopen($file,'rb'); fpassthru($fh);
после того, как
$zip->close()
чтобы файл не был открыт. Проблема, с которой я столкнулся, заключается в том, что хранящийся zip-файл является допустимым архивом, который я могу открыть в Windows 7, 7Zip, WinZIP и т. Д. Однако, когда я отправляю файл вниз с кодом выше, он заканчивается с помощью пары 0xD 0xA в начале файла, которого достаточно, чтобы сделать его коррумпированным. Я не могу понять, откуда эти персонажи. Это известная ошибка с fopen / fpassthru? Любая помощь приветствуется.
Как выглядит ваш полный сценарий?
Вообще говоря, вы должны удалить любые закрывающие теги PHP в конце ваших файлов сценариев, так как это, вероятно, вывод, идущий с конца вашего скрипта или включенный скрипт.
Я обнаружил, что при удалении header("Content-Length:".filesize($file));
линия исправила мою ту же проблему …
После многих попыток загрузить zip-файл, решение было:
$result = create_zip($files_to_zip,$fileZip,true,$path_parts['dirname']); ob_clean(); ob_end_flush(); // more important function - (without - error corrupted zip) header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header('Content-Type: application/zip;\n'); header("Content-Transfer-Encoding: Binary"); header("Content-Disposition: attachment; filename=\"".basename($fileZip)."\""); readfile($fileZip); unlink($fileZip); exit();
-$result = create_zip($files_to_zip,$fileZip,true,$path_parts['dirname']); ob_clean(); ob_end_flush(); // more important function - (without - error corrupted zip) header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header('Content-Type: application/zip;\n'); header("Content-Transfer-Encoding: Binary"); header("Content-Disposition: attachment; filename=\"".basename($fileZip)."\""); readfile($fileZip); unlink($fileZip); exit();