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

Node.js从AWS S3读取Gzip文件解压时出现Z_DATA_ERROR报错求助

解决Node.js解压S3 Gzip文件时的Z_DATA_ERROR错误

我之前也碰到过一模一样的问题!这个Z_DATA_ERROR(incorrect header check)通常说明你要处理的数据要么不是标准的gzip格式,要么在获取过程中出了问题,或者用错了解压逻辑。咱们一步步来排查和解决:

1. 先确认S3里的文件本身是合法的gzip文件

先手动从S3控制台下载这个文件,然后用本地的gzip工具(比如gzip -d filename.gz)试试能不能正常解压。如果本地解压也报错,那问题出在文件本身——你需要重新上传正确的gzip压缩文件。

2. 检查S3返回的Content-Encoding响应头

有时候S3会自动帮你处理gzip压缩(比如开启了静态网站托管的自动压缩,或者上传时设置了Content-Encoding),这时候data.Body可能已经是解压后的内容了!

你可以先打印data.ContentEncoding的值,如果它等于gzip,再进行解压;否则直接写入文件即可:

S3Client.getObject(params, (err, data) => {
  if(err) {
    console.error('Error getting Object:: ', err);
  } else {
    const processContent = (content) => {
      fs.writeFileSync(`folder/${name}.mht`, content);
    };

    if (data.ContentEncoding === 'gzip') {
      zlib.gunzip(data.Body, (err, buff) => {
        if(err) {
          console.error('Error decompressing:: ', err);
        } else {
          processContent(buff);
        }
      });
    } else {
      // 内容已经是未压缩的,直接写入
      processContent(data.Body);
    }
  }
});

3. 改用流式处理(更可靠,尤其适合大文件)

用Buffer一次性处理整个文件容易出现内存问题,也可能因为Buffer不完整导致解压失败。改用流式处理,边下载、边解压、边写入文件,会更稳定:

const fs = require('fs');
const zlib = require('zlib');
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); // 假设用v3 SDK

const s3Client = new S3Client({ /* 你的配置 */ });
const params = { /* 你的Bucket和Key */ };

const outputStream = fs.createWriteStream(`folder/${name}.mht`);
const s3Stream = s3Client.send(new GetObjectCommand(params)).Body;

// 创建解压缩流
const unzipStream = zlib.createGunzip();

// 管道连接:S3流 → 解压流 → 文件流
s3Stream.pipe(unzipStream).pipe(outputStream);

// 监听完成和错误事件
outputStream.on('finish', () => {
  console.log('文件成功解压并写入!');
});

unzipStream.on('error', (err) => {
  console.error('解压出错:: ', err);
  outputStream.close();
});

s3Stream.on('error', (err) => {
  console.error('获取S3对象出错:: ', err);
  outputStream.close();
});

如果你的S3 SDK是v2版本,把createReadStream()方法用上就行,逻辑是一样的。

4. 尝试用zlib.unzip自动识别压缩格式

如果文件是用deflate而不是gzip压缩的,gunzip就会报错。zlib.unzip方法可以自动识别gzip和deflate格式,你可以试试替换:

zlib.unzip(data.Body, (err, buff) => {
  if(err) {
    console.error('Error decompressing:: ', err);
  } else {
    fs.writeFileSync(`folder/${name}.mht`, buff);
  }
});

先从第一步开始排查,大概率是文件本身的问题或者S3自动处理了压缩导致的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:17:46