Получение поврежденного или пустого zip от ZipArchive php

Я получаю zip-файл, загруженный следующим кодом без каких-либо ошибок, но загруженный zip-файл пуст или поврежден, а размер всегда составляет около 200 байт. т. е. я не могу открыть этот zip-файл. Также ZipArchive:: getStatusString () также показывает "нет ошибки"

код :

public function getzip(){
    global $config;
    $files=array();
    if(isset($_COOKIE['hashes'])){
        $hashes=explode(',',$_COOKIE['hashes']);
        for ($i=0; $i <count($hashes); $i++) {
            array_push($files,$config["domain"]."/download/".$hashes[$i]); 
        }
    }
    if(count($files)){
        $zipname='basket.zip';
        $zip = new ZipArchive;
        $zip->open($zipname,ZipArchive::CREATE);
        foreach ($files as $key=>$value ) {
            $zip->addFile($value);
        }
        $status=$zip->getStatusString();
        $zip->close();

    if(!$zipname)
    {
        echo "Nothing in Basket";
    }
    else
    {   header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition:attachment; filename='.basename($zipname));
        header('Content-Length:'.filesize($zipname));
        readfile($zipname);
    }
}

5 ответов


Это моя лучшая догадка. Что здесь не так, так это то, что в вашем массиве $files значения, которые вы храните, вероятно, не являются фактическими путями к файлам.

помните: вы не можете передавать URL-адреса в $zip->addfile(), вам нужны ваши файлы.


попробуй полный путь и имя файла перед $zip->close();

$filename = $zip->filename;

и используйте это вместо $zipname при чтении файла и получении размера файла


добавление в эту тему, хотя исходная проблема была решена, так как я только что провел пару часов с аналогичной проблемой.

оказывается, все файлы должны существовать при выполнении $zip - >close (), независимо от того, когда вы используете $zip->addFile (), чтобы добавить их.

поэтому, если вы создадите временные файлы, добавьте их в свой zip, а затем удалите их до того, как вы использовали close (), вы можете получить пустой/поврежденный архив.


даже жесткий этот вопрос был выяснен, я опубликую то, что я узнал, как могут быть созданы поврежденные молнии:

при создании zip-архива вы часто будете отлаживать команды echo/print_r. Если вы не очистите их, выходной zip-файл будет поврежден.

пример, основанный на вопросе:

public function getzip(){
    global $config;
    $files=array();
    if(isset($_COOKIE['hashes'])){
        $hashes=explode(',',$_COOKIE['hashes']);
        for ($i=0; $i <count($hashes); $i++) {
            array_push($files,$config["domain"]."/download/".$hashes[$i]); 
        }
    }
    if(count($files)){
        $zipname='basket.zip';
        $zip = new ZipArchive;
        $zip->open($zipname,ZipArchive::CREATE);
        foreach ($files as $key=>$value ) {
            $zip->addFile($value);
        }
        $status=$zip->getStatusString();
        $zip->close();

    if(!$zipname)
    {
        echo "Nothing in Basket";
    }
    else
    {   
        // to fix your corrupt zip file, remove this line.
        echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname;
        header('Content-Description: File Transfer');
        header('Content-Type: application/zip');
        header('Content-Disposition:attachment; filename='.basename($zipname));
        header('Content-Length:'.filesize($zipname));
        readfile($zipname);
    }
}

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