【问题标题】:PHP ZipArchive addFile stopped workingPHP ZipArchive addFile 停止工作
【发布时间】:2016-08-29 06:41:41
【问题描述】:

我已经运行了相当长一段时间的以下代码:

$thisdir = "$_SERVER[DOCUMENT_ROOT]/webroot/uploads/user_uploaded_files/";

    if( !empty( $files ) ){

     $destination = 'uploads/zip_files/meeting_' . $meetingId .'.zip';

     $zip = new ZipArchive();

     $zip->open( $destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );

     //Add all the uploaded files ( $file = filename.ext )

         foreach( $files as $file ){

             if(file_exists( $thisdir . $file )){

                $zip->addFile('/uploads/user_uploaded_files/' . $file, $file);

         }
}

但是,它最近刚刚停止工作(不确定以前的版本,但当前版本是 7.0.9 )。

foreach 循环像以前一样运行,file_exists 总是返回 true,但没有文件被添加到存档中。

有人也经历过吗?非常感谢任何帮助或指导。

【问题讨论】:

  • 你检查文件权限了吗?

标签: php ziparchive php-zip-archive


【解决方案1】:

你应该测试一下 $zip->open 是否有效:

$res = $zip->open($destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($res) {
    foreach ($files as $file) {
        if (file_exists($thisdir . $file)) {
            $zip->addFile('/uploads/user_uploaded_files/' . $file, $file);
        }
    }
}

你可以添加

error_reporting(E_ALL);
ini_set('display_errors', true);

在脚本的开头,看看是否有任何错误。

【讨论】:

    【解决方案2】:

    刚刚找到了解决这个问题的方法,希望将来能对某人有所帮助。

    $files 是一个字符串数组,因此像下面这样循环遍历它:foreach( $files as $file ) 我总是得到一个字符串。

    至少我是这么认为的,但是 addFile() 显然没有把它读成字符串。

    这个问题通过简单地在addFile() 之前强制转换每个项目来解决。解决方案如下所示:

    foreach( $files as $file ){
    
        if(file_exists( $thisdir . $file )){
    
            $file = (string)$file;
    
            $zip->addFile('uploads/user_files/' . $file, $file);
    
        }
    
    }
    

    【讨论】:

    • 出于好奇,您能否发布 var_dump($files); 的输出?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多