当我尝试打开由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;
}
}
答案 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)