You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用new Response(decompressedStream).blob()报Failed to fetch错误的解决

错误原因与修复方案

错误原因

你使用DecompressionStream('deflate')直接解压ZIP文件是错误的——ZIP是包含文件目录、元数据的容器格式,内部文件可能用deflate压缩,但整个ZIP文件并非单纯的deflate流。这种错误的解压方式导致流处理失败,浏览器抛出Failed to fetch(这是流处理异常时的通用提示)。

修复方案

原生API无法直接解析ZIP容器,需要使用专门的ZIP处理库(比如JSZip)。以下是修复后的完整代码:

步骤1:准备JSZip库

先从JSZip官方仓库下载最新的库文件(如jszip.min.js),放在项目目录中。

完整代码

<html>
  <body>
    <input id="open" type="file" />
    <!-- 引入本地的JSZip库文件 -->
    <script src="./jszip.min.js"></script>
    <script>
      const unzip = async (file) => {
        const zip = await JSZip.loadAsync(file);
        // 提取ZIP内的第一个文件,可根据需求修改为遍历所有文件
        const firstFileName = Object.keys(zip.files)[0];
        const fileBlob = await zip.files[firstFileName].async('blob');
        // 为Blob设置正确的MIME类型,适配后续readAsDataURL处理
        return new Blob([fileBlob], { type: zip.files[firstFileName].options.type || 'application/octet-stream' });
      };

      const opener = document.getElementById('open');
      opener.addEventListener('change', async () => {
        let [file] = opener.files;
        if (!file) return;
        
        if (file.type === 'application/zip') {
          try {
            file = await unzip(file);
          } catch (err) {
            console.error('ZIP解压失败:', err);
            return;
          }
        }

        const reader = new FileReader();
        reader.addEventListener('load', () => {
          const data = reader.result.split(',')[1];
          console.log('文件内容:', data);
        });
        reader.readAsDataURL(file);
      });
    </script>
  </body>
</html>

修复要点

  • 用JSZip库解析ZIP容器,正确处理内部的文件结构与解压逻辑
  • unzip函数提取ZIP内的文件并转为Blob格式,保留文件的MIME类型
  • 添加错误捕获逻辑,避免解压失败导致后续流程中断
  • 保留原有的readAsDataURL处理逻辑,确保解压后的文件能正常转为Data URL

内容的提问来源于stack exchange,提问作者patrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:19