2013-04-22 3 views
2

Я пытаюсь отлаживать this script для запуска на localhost. $zip->status возвращает 0, который, согласно The Manual означает «без ошибок», но file_exists() все еще возвращает false.Невозможно создать zip-архив

Я проверил вручную, и файл на самом деле не существует. Я запускаю WAMP на localhost.

Почему это ведет себя так? Как я могу это исправить?

Вот мой точный код:

$destination = "C:\wamp\www\temp\temp.zip"; 
$zip = new ZipArchive(); 
echo var_dump($zip); 
echo "<br />"; 
$zzz = $zip->open($destination, ZipArchive::CREATE); 
if($zzz === true) { 
    echo "created archive<br />"; 
}else{ 
    //Var dump says it's true.. is that not a contradiction?? 
    echo var_dump($zzz)."<br />Couldn't create zipArchive<br />"; 
} 
//add the files 
foreach($_SESSION['images'] as $file) { 
    $zip->addFile($file); 
} 

echo "Files ".$zip->numFiles."<br />Status ".$zip->status."<br />"; 

$zip->close(); 

if(!file_exists($destination)){ 
    echo "destination doesnt exist";   
} 

А вот выход этой страницы ..

object(ZipArchive)[1] 
    public 'status' => int 0 
    public 'statusSys' => int 0 
    public 'numFiles' => int 0 
    public 'filename' => string '' (length=0) 
    public 'comment' => string '' (length=0) 


created archive 
Files 16 
Status 0 
destination doesnt exist 
+0

'echo var_dump();' избыточно. Вам нужно использовать 'var_dump();' Кроме того, когда вы перебираете через $ _SESSION, подумайте о добавлении 'var_dump ($ file);' для вывода имен файлов, чтобы узнать, являются ли они законными, читаемыми файлами. Предположительно, пустой почтовый файл не будет/не может быть написан, поэтому я подозреваю, что добавляемые файлы могут быть недействительными. –

+0

@cale_b У меня есть 'if (false! == file_get_contents ($ fullimgpath, 0, null, 0,1)) {$ _SESSION ['images'] [$ n] = $ fullimgpath; } 'на другой странице, подтверждающей существование файла. –

+0

@cale_b Должны ли файлы быть локальными? –

ответ

4

Update: После некоторого обсуждения в чате, мы выяснили, что $_SESSION['images'] содержит http:// URLs но ZipArchive сам по себе не поддерживает добавление файлов из удаленных источников. Если вы хотите добавить удаленные изображения, вам придется загрузить их раньше. Таким образом, мы изменили соответствующую часть addFile() к:

//add the files 
foreach($images as $file) { 
    $tmpname = tempnam(sys_get_temp_dir(), 'test'); 
    file_put_contents($tmpname, file_get_contents($file)); 
    $zip->addFile($tmpname, basename($file)); 
    unlink($tmpname); 
} 

Также есть логическая ошибка, или лучше, опечатка. Заменить

$zzz = $zip->open($destination, ZipArchive::CREATE); 
if($zzz !== true) { 
    echo "created archive<br />"; 
} ... 

по

$zzz = $zip->open($destination, ZipArchive::CREATE); 
if($zzz === true) { 
    echo "created archive<br />"; 
} ... 

Далее отметить, что застежка-молния создается в памяти и не будут записаны на диск не до вызова ZipArchive::close(). Проверьте первый комментарий на странице руководства:

Если вы создали почтовый файл и добавил файл к нему без ошибок, однако ZipArchive :: волосок терпит неудачу (с ER_TMPOPEN: «Ошибка создания временного файла») и zip-файл не создается, проверьте, не указывает ли ваш ZipArchive :: open вызов путь, содержащий несуществующие каталоги. Если вы ожидаете наличия иерархии одного или нескольких каталогов, вы должны создать их самостоятельно, прежде чем использовать ZipArchive. Вы можете написать простую функцию для рекурсии, используя dirname, чтобы найти каждый родительский каталог, создавая те, которые не существуют, используя mkdir при выходе из рекурсии.

+0

Ah .. woops, ладно, я отредактировал мой вопрос. Он все еще не работает. –

+0

Пожалуйста, не редактируйте вопрос. Это делает ответы устаревшими – hek2mgl

+0

Что делает 'var_dump ($ zip-> close()),' say? – hek2mgl

0

Возможно, потому что у вас есть if($zzz !== true), когда это должно быть if($zzz === true). xD

+0

Вы правы, но почему он не создает архив ? –