无法在PHP Zip Archive生成的Windows资源管理器中打开zip文件

时间:2012-11-30 13:41:44

标签: php windows zip ziparchive

当我尝试打开由PHP Zip Archive生成的zip文件时,会显示一条警告

  

“Windows无法打开文件夹。压缩(zipped)文件夹   'filename'无效。“在Windows资源管理器中打开错误。

但我可以通过7-zip打开文件。出于某种原因,我必须确保Windows资源管理器可以打开zip文件。生成zip文件时有什么问题吗?请帮忙!

function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) {
        if(file_exists($dest) && !$overwrite) {
            return false;
        }
        $valid_files = array();
        if(is_array($files)) {
            foreach($files as $file) {
                if(file_exists($file)) {
                    $valid_files[] = $file;
                }
            }
        }

        if(count($valid_files)) {
            $zip = new ZipArchive();
            if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
                return false;
            }
            foreach($valid_files as $valid_file) {
                if(is_dir($valid_file) === true){
                    foreach(glob($valid_file . '/*') as $file){
                        $zip->addFile($file, $root_folder . $file);
                    }

                }else if (is_file($valid_file) === true){
                    $zip->addFile($valid_file, $root_folder . $valid_file);
                }
            }
            $zip->close();

            return file_exists($dest);
        }
        else
        {
            return false;
        }
    }

5 个答案:

答案 0 :(得分:6)

对我来说,解决方法是在输出zip文件内容之前使用ob_end_clean()(正如@Ywis在评论中所指出的那样)......

ob_end_clean();
readfile($zipfilename); // outputs zip file's content

...即使你之前没有输出任何字符。

答案 1 :(得分:1)

我认为问题源于:

$zip->addFile($file,$file);

除非您的php脚本与要添加到zip的文件位于同一目录中,否则您需要包含文件路径。 addFile中的第二个参数是zip中文件的名称,因此如果你的$ file var包含路径,那么这个问题可能来自。尝试将代码更改为:

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file);
$zip->addFile($file,$filenameonly );

将删除文件路径(如果有的话),只留下addFile中第二个变量的文件名。

如果这样可以解决您的问题,您就会确定问题出在您的文件名中,并且可以轻松查明问题。

答案 2 :(得分:0)

只需将参数作为参数发送到绝对路径,例如$abspath。然后在

中使用它
$filenameonly = str_replace($abspath,"",$file);
$zip->addFile($file, $filenameonly);

即使在Window 8中它也能100%工作,甚至你压缩的文件都在文件夹中。

答案 3 :(得分:0)

您可以使用内置的文件系统函数,而不是使用str_replace字符串函数。

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME));

答案 4 :(得分:0)

Windows zip无法识别以“/”开头的路径

只需删除文件路径中的第一个“/”。

像这样:

n <- 100
palletes <- c(x = "Blues", y = "Reds")

ys <- list(x = round(rnorm(n = n, sd = 5, mean = 100)), 
           y = round(rnorm(n = n, sd = 7, mean = 50)),
           z = round(rnorm(n = n, sd = 3, mean = 75)), 
           a = round(rnorm(n = n, sd = 10, mean = 75)), 
           b = round(rnorm(n = n, sd = 15, mean = 55)), 
           c = round(rnorm(n = n, sd = 10, mean = 35)))

sizes <- list(x = rtruncnorm(n = n, sd = 10, mean = 50, a = 0), 
              y = rtruncnorm(n = n, sd = 5, mean = 100, a = 0), 
              z = rtruncnorm(n = n, sd = 25, mean = 75, a = 0), 
              a = rtruncnorm(n = n, sd = 1, mean = 10, a = 0),
              b = rtruncnorm(n = n, sd = 11, mean = 80, a = 0), 
              c = rtruncnorm(n = n, sd = 10, mean = 30, a = 0))

df <- data.frame(y = unlist(ys), size = unlist(sizes), 
                 class = rep(names(ys), each = n), 
                 col = rep(brewer.pal(length(sizes), "Dark2"), each = n),
                 stringsAsFactors = FALSE)

path <- "~/Desktop/teste.png"
png(path, width = 2000, height = 2000)
plot_circle_packings(df)
dev.off()

# This is because I could not remove the 
# margin ploting a SpatialPolygon
image_read(path) %>% image_trim %>% image_write(path)