PHP ZipArchive没有添加任何文件(Windows)

时间:2015-08-12 05:03:23

标签: php windows ziparchive

我没有将一个文件放入新的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();

zip已创建,但为空。然而,没有触发错误。

出了什么问题?

3 个答案:

答案 0 :(得分:11)

在某些配置中,当将文件添加到zip存档时,PHP无法正确获取localname,并且必须手动提供此信息。因此,使用addFile()的第二个参数可能会解决此问题。

  

<强> ZipArchive :: addFile

     

参数

     
      
  • 文件名
      要添加的文件的路径。
  •   
  • 的localName
      如果提供,这是ZIP存档中将覆盖文件名的本地名称。
  •   

PHP documentation: ZipArchive::addFile

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

您可能必须调整代码才能获得正确的树结构,因为basename()将从文件名旁边的路径中删除所有内容。

答案 1 :(得分:1)

您需要在创建zip存档的文件夹中授予服务器权限。您可以使用写入权限创建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()

的目标位置
e ==> v

答案 2 :(得分:1)

检查此类是否将文件夹中的文件和子目录添加到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(); 
} 
}