Я использую ZipArchive для создания zip-файла. Все это работает хорошо, за исключением одной вещи — загрузка в качестве вложения. Когда я пытаюсь открыть загруженный файл, 7-zip говорит: «Не удается открыть файл …. как архив». Там все в порядке с файлом, сохраненным на сервере. Когда я пытался сравнить загруженный файл с файлом, хранящимся на сервере, в конце файла была небольшая разница.
Проще говоря: архив на сервере открывается, но после загрузки его нет
Код, который я использую:
$file='Playlist.zip';
if (headers_sent()) {
echo 'HTTP header already sent';
} else {
if (!is_file($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
echo 'File not found';
} else if (!is_readable($file)) {
header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
echo 'File not readable';
} else {
header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
header("Content-Type: application/zip");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".basename($file)."");
header("Pragma: no-cache");
header("Expires: 0");
set_time_limit(0);
$handle = fopen($file, "rb");
while (!feof($handle)){
echo fread($handle, 8192);
}
fclose($handle);
}
}
Попробуйте использовать fpassthru()
:
$file="Playlist.zip";
if (headers_sent()) {
echo "HTTP header already sent";
} else {
if (!is_file($file)) {
header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found");
echo "File not found";
} else if (!is_readable($file)) {
header($_SERVER['SERVER_PROTOCOL'] . " 403 Forbidden");
echo "File not readable";
} else {
header($_SERVER['SERVER_PROTOCOL'] . " 200 OK");
header("Content-Type: application/zip");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=" . basename($file));
header("Pragma: no-cache");
$handle = fopen($file, "rb");
fpassthru($handle);
fclose($handle);
}
}
Других решений пока нет …