Я пытаюсь загрузить 2 файла, создав zip-файл на локальном сервере. Файл загружается в формате zip, но когда я пытаюсь извлечь it.it, вы получите ошибку: подпись в конце-центральной директории не найдена. Либо этот файл не является zip-файлом, либо представляет собой один диск из многочастного архива. В последнем случае центральный каталог и комментарий к zip-файлу будут найдены на последнем диске (дисках) этого архива.
следующий код, который я использую для этого:
<?php $file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf'); //Archive name $archive_file_name=$name.'iMUST_Products.zip'; //Download Files path $file_path=$_SERVER['DOCUMENT_ROOT'].'/Harshal/files/'; zipFilesAndDownload($file_names,$archive_file_name,$file_path); function zipFilesAndDownload($file_names,$archive_file_name,$file_path) { //echo $file_path;die; $zip = new ZipArchive(); //create the file and throw the error if unsuccessful if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==TRUE) { exit("cannot open <$archive_file_name>\n"); } //add each files of $file_name array to archive foreach($file_names as $files) { $zip->addFile($file_path.$files,$files); //echo $file_path.$files,$files." } $zip->close(); //then send the headers to force download the zip file header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=$archive_file_name"); header("Pragma: no-cache"); header("Expires: 0"); readfile("$archive_file_name"); exit; } ?>
Я проверил значения всех переменных, которые переходят в функцию, все это прекрасно. Пожалуйста, смотрите это. Спасибо заранее.
Добавьте заголовок Content-length
описывающий размер zip-файла в байтах.
header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=$archive_file_name"); header("Content-length: " . filesize($archive_file_name)); header("Pragma: no-cache"); header("Expires: 0"); readfile("$archive_file_name");
Также убедитесь, что перед тем, как <?
и после ?>
. Я вижу здесь пробел:
↓
<?php $file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
$zip = new ZipArchive; if ($zip->open('assets/myzip.zip', ZipArchive::CREATE)) { $zip->addFile('folder/bootstrap.js', 'bootstrap.js'); $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js'); $zip->close(); echo 'Archive created!'; header('Content-disposition: attachment; filename=files.zip'); header('Content-type: application/zip'); readfile($tmp_file); } else { echo 'Failed!'; }
Я просто столкнулся с этой проблемой. Для меня проблема заключалась в следующем:
readfile("$archive_file_name");
Это привело к ошибке из памяти.
Allowed memory size of 134217728 bytes exhausted (tried to allocate 292982784 bytes)
Я смог исправить проблему, заменив readfile () следующим:
$handle = fopen($zipPath, "rb"); while (!feof($handle)){ echo fread($handle, 8192); } fclose($handle);
Не уверен, что это ваша проблема или вы не видите, что ваш файл составляет всего 1,2 МБ. Возможно, это поможет кому-то еще с подобной проблемой.
Я столкнулся с одной и той же проблемой. В моем случае источником этого были разрешения папки, в которой я хотел создать zip-файл, который был настроен только на чтение. Я изменил его, чтобы читать и писать, и это сработало.
Если файл не создается на локальном сервере при запуске скрипта, скорее всего, у вас такая же проблема, как и у меня.
// http headers for zip downloads header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"".$filename."\""); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize($filepath.$filename)); ob_end_flush(); @readfile($filepath.$filename);
Здесь я нашел это решение, и оно работает для меня
Одна из ошибок может заключаться в том, что файл не читается как формат «архив». проверить ZipArchive не открытие файла – Код ошибки: 19 . Откройте загруженный файл в текстовом редакторе, если у вас есть какие-либо html-теги или отладочные инструкции при запуске, очистите буфер перед чтением файла.
ob_clean(); flush(); readfile("$archive_file_name");
но файл, который я получаю с сервера после загрузки, дает размер 226 байт
Это размер ZIP-заголовка. По-видимому, в загруженном ZIP-файле нет данных . Итак, можете ли вы проверить, что файлы, которые будут добавлены в ZIP-файл, действительно есть (относительно пути к скрипту загрузки PHP)?
Рассмотрите возможность добавления проверки на addFile
:
foreach($file_names as $file) { $inputFile = $file_path . $file; if (!file_exists($inputFile)) trigger_error("The input file $inputFile does not exist", E_USER_ERROR); if (!is_readable($inputFile)) trigger_error("The input file $inputFile exists, but has wrong permissions or ownership", E_USER_ERROR); if (!$zip->addFile($inputFile, $file)) trigger_error("Could not add $inputFile to ZIP file", E_USER_ERROR); }
Наблюдаемое поведение согласуется с некоторой проблемой (ошибка пути, проблемы с разрешением, …), предотвращающая добавление файлов в ZIP-файл. При получении «пустого» ZIP-файла клиент выдает ошибку, относящуюся к отсутствующему центральному каталогу ZIP (фактическая ошибка заключается в отсутствии директории и файлов).