JSZip 在读回以前上传的 zip 文件时报告丢失的字节

JSZip reports missing bytes when reading back previously uploaded zip file

我正在开发一个网络应用程序,用户可以在其中提供图像文件文本序列。我正在将序列压缩成一个 ZIP 文件 uisng JSZip。

在检查文件上传错误状态后,我在服务器上简单地使用 PHP move_uploaded_file 到所需位置。

以这种方式创建的测试 ZIP 文件可以是 found here。我已经下载了文件,在 Windows Explorer 中将其展开并验证其内容(在本例中为两张图片和一些 HTML 标记)均存在且正确。

到目前为止一切顺利。当我尝试获取相同的 ZIP 文件并使用 JSZip.loadAsync 扩展它时,问题就开始了,它始终报告 Corrupted zip: missing 210 bytes。我用于喷回 ZIP 文件的 PHP 代码实际上非常简单。除了我已实施的各种安全检查之外,下面列出了该代码的基本部分

if (file_exists($file)) 
{
 ob_clean(); 
 readfile($file);
 http_response_code(200);
 die();
} else http_response_code(399);

其中 399 代码在我的 webapp 中被解释为需要在本地创建新资源而不是尝试读取现有资源数据。当我使用结果文本(在 200 的 HTTP 响应上)并将其提供给 JSZip.loadAsync.

时,问题就发生了

我在这里做错了什么?我认为我在 PHP 端使用 readfile 的方式有些太天真了,但我无法弄清楚那可能是什么。

我们打算做什么

  • 尝试从 JavaScript
  • 获取服务器端 ZIP 文件
  • 如果它不存在,则发回回复(我只是将自定义 HTTP 响应代码设置为 399 并对其进行解释)告诉客户端去准备它自己的该资源的新本地副本
  • 如果确实存在,请发回该 ZIP 文件

到目前为止还不错。然而,将现有的 ZIP 文件读入 PHP 并将其发回是没有意义的 + 充满了问题。我现在的方法是发回 302 的 http_response_code,客户端将其解释为“直接为自己获取 ZIP”的指令。

此时要“直接”获取 ZIP,只需遵循 MDN 上的 instructions in this tutorial