Создайте zip файл и загрузите его
Я пытаюсь загрузить 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;
}
?>
Я проверил значения всех переменных, которые переходят в функцию, все они прекрасны. Пожалуйста, смотрите это. Спасибо заранее.
Ответы
Ответ 1
Добавить заголовок 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');
Ответ 2
$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!';
}
Ответ 3
Я столкнулся с этой проблемой. Для меня проблема заключалась в следующем:
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 МБ. Возможно, это поможет кому-то еще с подобной проблемой.
Ответ 4
У меня возникла точно такая же проблема. В моем случае источником этого были разрешения папки, в которой я хотел создать zip файл, который был настроен только на чтение. Я изменил его, чтобы читать и писать, и это сработало.
Если файл не создан на вашем локальном сервере при запуске script, у вас, скорее всего, будет такая же проблема, как и я.
Ответ 5
// 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);
Я нашел это решение здесь, и он работает для меня
Ответ 6
Одна из ошибок может заключаться в том, что файл не читается как формат "архив". проверить ZipArchive не открыть файл - Код ошибки: 19. Откройте загруженный файл в текстовом редакторе, если у вас есть какие-либо теги html или инструкции отладки при запуске, очистите буфер перед чтением файла.
ob_clean();
flush();
readfile("$archive_file_name");
Ответ 7
но файл, который я получаю с сервера после загрузки, дает размер из 226 байт
Это размер ZIP-заголовка. По-видимому, в загруженном ZIP файле нет данных. Итак, можете ли вы проверить, что файлы, которые будут добавлены в ZIP файл, действительно существуют (относительно пути загрузки PHP script)?
Сложите также проверку на 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 (фактическая ошибка в том, что нет директории и нет файлов).