提前感谢的帮助
这发生在Ubuntu 20.10机器和带有apache和php 5.2 的服务器上
让我粘贴代码:
$elementsToDownload = array(
'productTableCSV' => $productTableCSVString,
'productTableLangCSV' => $productTableLangCSVString,
'productTableShopCSV' => $productTableShopCSVString
);
// var_dump($elementsToDownload);
$zipname = 'productCSVs.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($elementsToDownload as $key => $csvString) {
if (! $zip->addFromString("$key.csv", $csvString)) {
echo 'Could not add file to ZIP: ' . "$key.csv";
die();
}
}
$zip->close();
ob_clean();
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
unlink($zipname);
看起来这里应该有问题,因为我可以随机下载zip。浏览器不时抱怨无法下载该文件。尽管这种情况并不总是发生,但这是Firefox显示的信息:
/tmp/mozilla_manu0/h03iaHVG.zip.part无法保存,因为无法读取源文件。
请稍后重试,或与服务器管理员联系。
这种情况发生在Firefox中。
Mate Engrampa Archive Manager和XArhiver都无法打开文件。令人惊讶的是,如果我在命令行中运行unzip-t productCSVs.zip,它不会报告任何错误。如果我在终端中这样做,我也可以在没有-t选项的情况下解压缩文件,但没有桌面应用程序可以打开它
为了添加一些额外的信息,我用来生成文件的PHP版本很旧,5.2,但在我的公司更新他们的系统之前,这是我所拥有的,这是预期的。
有人能想到为什么会发生这种情况吗?
编辑:
我刚刚意识到,尽管我在终端中解压缩文件时没有错误,但我在开始或zipfile中有一个关于额外1个字节的警告:
manu@manu-NUC8i7BEH:/tmp/mozilla_manu0$ unzip -t productCSVs.zip
Archive: productCSVs.zip
warning [productCSVs.zip]: 1 extra byte at beginning or within zipfile
(attempting to process anyway)
testing: productTableCSVString.csv OK
testing: productTableLangCSVString.csv OK
testing: productTableShopCSVString.csv OK
testing: productTableCSV.csv OK
testing: productTableLangCSV.csv OK
testing: productTableShopCSV.csv OK
No errors detected in compressed data of productCSVs.zip.
我仍然不明白里面发生了什么
好的,所以我解决了这个问题。我的问题是,我在代码中打开和关闭了两次php标记,在其间留下了一个空格。类似这样的东西:
?>
<?php
因此,该空间被添加到下载流中。
我删除了结束标签和开始标签,因为它们在一起,现在我从服务器下载的每个文件都被我所有的zip工具识别
谢谢你读我的书!