【问题标题】:JSZip reports missing bytes when reading back previously uploaded zip fileJSZip 在读取之前上传的 zip 文件时报告缺少字节
【发布时间】:2021-12-08 21:27:50
【问题描述】:

我正在开发一个用户提供图像文件-文本序列的 web 应用程序。我正在将序列压缩成单个 ZIP 文件 uisng JSZip。

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

以这种方式创建的测试 ZIP 文件可以是 found here。我已经下载了文件,在 Windows 资源管理器中展开它并验证了它的内容(在这个实例中是两个图像和一些 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 代码在我的 web 应用程序中被解释为需要在本地创建新资源而不是尝试读取现有资源数据。当我使用结果文本(在 200 的 HTTP 响应上)并将其提供给 JSZip.loadAsync 时,就会出现问题。

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

【问题讨论】:

    标签: php-7 readfile jszip


    【解决方案1】:

    我们打算做什么

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

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

    此时要“直接”获取 ZIP,只需按照 MDN 上的 instructions in this tutorial 即可。

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2023-03-31
      • 2018-08-14
      • 2020-09-30
      相关资源
      最近更新 更多