Создайте 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;
}




?>

Я проверил значения всех переменных, которые передаются в функцию, все в порядке.поэтому, пожалуйста, взгляните на это.Заранее спасибо.

Author: Legionar, 2012-09-01

7 answers

Добавьте заголовок 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');
 29
Author: Kuba Wyrostek, 2012-09-01 10:37:50
// 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);

Я нашел это решение здесь и оно работает для меня

 4
Author: vitams, 2015-06-13 22:40:24
$zip = new ZipArchive;
$tmp_file = 'assets/myzip.zip';
    if ($zip->open($tmp_file,  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!';
   }
 4
Author: M Arfan, 2018-04-09 04:28:10

Я только что столкнулся с этой проблемой. Для меня проблема заключалась в следующем:

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 МБ. Возможно, это поможет кому-то еще с подобной проблемой.

 2
Author: David Rodriguez, 2014-10-09 02:22:24

Я столкнулся с точно такой же проблемой. В моем случае источником этого были разрешения папки, в которой я хотел создать zip-файл, которые были настроены только для чтения. Я изменил его на чтение и запись, и это сработало.

Если файл не создан на вашем локальном сервере при запуске скрипта, у вас, скорее всего, та же проблема, что и у меня.

 1
Author: user2752793, 2013-09-16 03:04:41

Одной из ошибок может быть то, что файл не читается в формате "архив". проверьте ZipArchive не открывает файл - Код ошибки: 19. Откройте загруженный файл в текстовом редакторе, если у вас есть какие-либо теги html или инструкции отладки в начале, очистите буфер перед чтением файла.

ob_clean();
flush();
readfile("$archive_file_name");
 1
Author: Avinav, 2017-05-23 12:02:58

Но файл, который я получаю с сервера после загрузки, имеет размер 226 байт

Это размер заголовка почтового индекса. По-видимому, в загруженном 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 (фактическая ошибка заключается в том, что нет каталога и файлов).

 0
Author: LSerni, 2012-09-01 11:25:25