无法识别存档格式。 PHP 中的 ZipArchive 未返回有效格式

Archive format is not recognised. ZipArchive in PHP not returning a valid format

在此先感谢您的帮助

这发生在 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 could not be saved, because the source file could not be read.

Try again later, or contact the server administrator.

这发生在 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 标签,中间留下了 space。像这样:

?>

<?php

因此 space 被添加到下载流中。

我删除了结束标签和开始标签,因为它们在一起,现在我从服务器下载的每个文件都可以被我所有的压缩工具识别

感谢您阅读我!