2013-02-09 9 views
6

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

код является:

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); 
    } 
} 
+0

его дает мне ложь. это означает, что каталог $ zipname не создан. Но m не получает msg из «Nothing in Basket» вместо того, чтобы загружать zip-файл. –

ответ

3

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

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

5

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

$filename = $zip->filename; 

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

+0

@Pony Проверьте это также .. Все еще получая такую ​​же проблему. Я думаю, что директория для файла не создается. Также я проверил 'var_dump ($ filename)' показывает точный путь. –

+0

Вы назначили эту переменную перед вызовом '$ zip-> close()'? –

+0

Работал как шарм! Благодаря :) – Scott

0

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

При создании почтового архива вы часто будете отлаживать с 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); 
    } 
} 
1

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

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

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

0

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