2015-08-12 4 views
4

Я не могу поместить хотя бы один файл в новый ZIP-архив.PHP ZipArchive не добавляет файлы (Windows)

makeZipTest.php:

<?php 

$destination = __DIR__.'/makeZipTest.zip'; 
$fileToZip = __DIR__.'/hello.txt'; 

$zip = new ZipArchive(); 
if (true !== $zip->open($destination, ZIPARCHIVE::OVERWRITE)) { 
    die("Problem opening zip $destination"); 
} 
if (!$zip->addFile($fileToZip)) { 
    die("Could not add file $fileToZip"); 
} 
echo "numfiles: " . $zip->numFiles . "\n"; 
echo "status: " . $zip->status . "\n"; 
$zip->close(); 

почтовый индекс получает создан, но пусто. Однако никаких ошибок не возникает.

Что происходит не так?

+0

код работает - так что я хотел бы посмотреть на разрешениях почтового файл а nd это каталог. –

+0

Спасибо, но скрипт создает временный каталог, делает подкаталог помещает файл в zip-каталог в этот подкаталог, а затем запечатывает этот файл из ZIP-файла во временный каталог. Поэтому я не могу понять, почему у него должны быть какие-либо проблемы с разрешением, так как он не создает проблем с созданием каталогов или помещением файлов в них ?! – Jodes

+0

Хммм ... может быть, вам следует опубликовать остальную часть скрипта, так как эта часть работает * (по крайней мере, на Linux). Единственное, что я могу вспомнить в данный момент, учитывая информацию, которую вы только что упомянули, это то, что может быть состояние гонки ... –

ответ

9

Похоже, что при некоторой конфигурации PHP не может правильно получить localname при добавлении файлов в zip-архив, и эта информация должна быть предоставлена ​​вручную. Поэтому возможно, что использование второго параметра addFile() может решить эту проблему.

ZipArchive :: AddFile

Параметры

  • имя файла
    Путь к файлу для добавления.
  • localname
    Если указано, это локальное имя внутри ZIP-архива, которое переопределит имя файла.

PHP documentation: ZipArchive::addFile

$zip->addFile(
    $fileToZip, 
    basename($fileToZip) 
); 

Вы, возможно, придется адаптировать код, чтобы получить правильную структуру дерева, так как basename() удалит все с пути, кроме имени файла.

1

Вам необходимо предоставить разрешение на право сервера в папке, где они создают ZIP-архив. Вы можете создать tmp папку с записью permision chmod 777 -R tmp/

Кроме того, необходимо изменить назначения, где сценарий попытаться найти hello.txt файлу $zip->addFile($fileToZip, basename($fileToZip))

<?php 

$destination = __DIR__.'/tmp/makeZipTest.zip'; 
$fileToZip = __DIR__.'/hello.txt'; 

$zip = new ZipArchive(); 
if (true !== $zip->open($destination, ZipArchive::OVERWRITE)) { 
    die("Problem opening zip $destination"); 
} 
if (!$zip->addFile($fileToZip, basename($fileToZip))) { 
    die("Could not add file $fileToZip"); 
} 
echo "numfiles: " . $zip->numFiles . "\n"; 
echo "status: " . $zip->status . "\n"; 
$zip->close() 
+0

Было бы неплохо проверить, если zip-файл уже существует, поэтому вы решаете, используете ли ZipArchive :: OVERWRITE или ZipArchive :: CREATE –

+2

@AedixRhinedale документы, подразумевающие, что обе команды OVERWRITE и CREATE должны работать независимо от того, существует ли файл или нет. Разница заключается только в том, заменено или добавлено существующее содержимое zip, если оно существует. – Jodes

1

проверить этот класс, чтобы добавить файлы и подкаталоги в папку для архива, а также проверить права доступа к папке перед запуском кода, т.е. CHMOD 777 -R zipdir/

HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip'); 

<?php 
class HZip 
{ 

private static function folderToZip($folder, &$zipFile, $exclusiveLength) { 
$handle = opendir($folder); 
while (false !== $f = readdir($handle)) { 
    if ($f != '.' && $f != '..') { 
    $filePath = "$folder/$f"; 
    // Remove prefix from file path before add to zip. 
    $localPath = substr($filePath, $exclusiveLength); 
    if (is_file($filePath)) { 
     $zipFile->addFile($filePath, $localPath); 
    } elseif (is_dir($filePath)) { 
     // Add sub-directory. 
     $zipFile->addEmptyDir($localPath); 
     self::folderToZip($filePath, $zipFile, $exclusiveLength); 
    } 
    } 
} 
closedir($handle); 
} 


public static function zipDir($sourcePath, $outZipPath) 
{ 
$pathInfo = pathInfo($sourcePath); 
$parentPath = $pathInfo['dirname']; 
$dirName = $pathInfo['basename']; 

$z = new ZipArchive(); 
$z->open($outZipPath, ZIPARCHIVE::CREATE); 
$z->addEmptyDir($dirName); 
self::folderToZip($sourcePath, $z, strlen("$parentPath/")); 
$z->close(); 
} 
}