PHP ZipArchive не добавляет никаких файлов (Windows)

Я не могу поместить даже один файл в новый zip-архив.

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();

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

Что не так?

3 ответа

Решение

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

ZipArchive:: AddFile

параметры

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

Документация PHP: ZipArchive::addFile

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

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

Вам необходимо дать права доступа серверу в папке, в которой они создают zip-архив. Вы можете создать tmp папка с разрешением на запись 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()

Отметьте этот класс, чтобы добавить файлы и подкаталоги в папке в zip-файл, а также проверьте права доступа к папке перед запуском кода, например, 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(); 
} 
} 
Другие вопросы по тегам