PHP ZipArchive не сохраняется

Я создаю автоматический загрузчик PHP для заархивированных изображений. Однако загруженный ZIP-файл пуст! Надеюсь, кто-нибудь узнает об этой проблеме - это обязательно будет просто.

Большое спасибо, Ник.

PHP

    foreach($_SESSION["photoBasket"] as $id){
       $files[] = array(
               "loc" => "../photos/$id.png",
               "name" => "$id.png"
                );
    }

    $zipname = tempnam(sys_get_temp_dir(), 'zip');
        $zip = new ZipArchive();
        $zip->open($zipname, ZipArchive::CREATE);
        foreach ($files as $file) {
          $zip->addFile($file["loc"],$file["name"]);
          //$zip->addFromString($file["name"],"something here"); WORKS FINE
        }
        $zip->close();

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename=test.zip');
    readfile($zipname);
    unlink($zipname);

person Nick Price    schedule 15.12.2012    source источник
comment
Вы уверены, что все каталоги в вашем zip-пути существуют? PHP Zip не создает каталоги.   -  person Flot2011    schedule 16.12.2012
comment
@ Flot2011 нет дополнительных каталогов - тот же каталог - примечание 'file.zip' не имеет дополнительных каталогов.   -  person Nick Price    schedule 16.12.2012
comment
как насчет имен файлов тогда? какие-нибудь специальные символы в них?   -  person Flot2011    schedule 16.12.2012
comment
Кажется, проблема с самим ZIP-файлом - загруженный ZIP-файл пуст. См. Исправленный код и комментарии ниже.   -  person Nick Price    schedule 16.12.2012


Ответы (1)


Вы должны создать свой файл в папке с возможностью записи; Кроме того, ваше имя файла должно быть уникальным, чтобы два человека, загружающие ZIP-файл одновременно, не перезаписывали друг друга. Позвольте PHP решить эту проблему, используя tempnam () и sys_get_temp_dir (). И не забудьте удалить временный файл после того, как отправили его по сети!

$zipname = tempnam(sys_get_temp_dir(), 'zip');
...
unlink($zipname);
person webaware    schedule 15.12.2012
comment
Разобрался, спасибо. Сейчас проблем не возникает, но в zip-файле нет файлов - есть идеи? - person Nick Price; 16.12.2012
comment
Я вижу, вы отредактировали свой вопрос. Вам нужно указать пути к файлам, чтобы ZipArchive действительно мог их найти (вероятно, в этом ошибка). - person webaware; 16.12.2012
comment
Я удалил пути по запросу клиента. Ссылки на файлы в PHP все еще в порядке. Если бы мы работали с этим «на лету», как бы изменился код? - person Nick Price; 16.12.2012
comment
Кстати, вам может быть лучше использовать PclZip вместо ZipArchive. Я использую его в плагине WordPress, потому что он позволяет указать это вам не нужно сжатие - отлично, когда вы просто создаете архив сжатых изображений. - person webaware; 16.12.2012
comment
Интересный. Спасибо! Вы знаете, встроено ли это в PHP? - person Nick Price; 16.12.2012
comment
Re: PclZip, нет, вам нужно загрузить его. Он поставляется с WordPress, поэтому мне это было удобно (к тому же ZipArchive устанавливается не на всех серверах, это еще одна причина для меня использовать PclZip!) - person webaware; 16.12.2012
comment
Что вы имеете в виду под словом «на лету»? - person webaware; 16.12.2012
comment
«На лету», например, я не хочу создавать ZIP-файлы. PclZip, похоже, не имеет никаких преимуществ перед ZipArchive, поэтому можно придерживаться ZipArchive. - person Nick Price; 16.12.2012
comment
Нет, вам нужно создать файл, затем загрузить его и отменить связь. Re: Преимущества PclZip, повторное сжатие файлов JPEG требует времени, поэтому возможность указать PclZip не беспокоиться означает значительное улучшение скорости. Один парень, использующий мой плагин, получил более 1000 изображений в архиве размером 700 МБ, созданном за 6 секунд (он сказал мне). - person webaware; 16.12.2012
comment
Хм, не объясняет проблемы с пустой папкой ZIP - есть идеи? - person Nick Price; 16.12.2012
comment
Что вы сделали для того, чтобы у вас были правильные полные пути к изображениям? например добавьте отладочный код для проверки file_exists (). - person webaware; 16.12.2012
comment
Обновили код и дважды проверили, существуют ли изображения, используя file_exist. Они это делают, а ZIP-файл все еще пуст. - person Nick Price; 16.12.2012
comment
1. ZipArchive :: open () возвращает статус; если! == true, сообщите об этом и сравните с константами статуса - person webaware; 16.12.2012
comment
2. можете ли вы прочитать какую-либо информацию об изображении из изображений, например используя getimagesize ()? - person webaware; 16.12.2012
comment
3. addFile () принимает второй параметр, имя файла без пути; попробуйте добавить это на случай, если он не хочет добавлять ваш путь в Zip-архив (ps: хост Linux / клиент Windows случайно? см. этот комментарий) - person webaware; 16.12.2012
comment
С изображениями все в порядке - могу отобразить их на странице. Кроме того, $zip->addFromString($file["name"],"something here"); внутри foreach добавляет все файлы. Сейчас попробую 3. - person Nick Price; 16.12.2012
comment
Большое спасибо за помощь. Оказалось, что один из файлов фотографий был поврежден в ZipArchive - не знаю, почему, когда он открывается / отображается нормально, file_exists работает, но удаление этой фотографии позволяет коду работать. - person Nick Price; 16.12.2012
comment
Я надеюсь, что ../photos/$id.png - это только пример; вы должны указать абсолютный путь к изображению. например dirname(dirname(__FILE__)) . "/photos/$id.png" - person webaware; 16.12.2012