NodeJS:文件内容上的zlib.gunzip()返回错误:不正确的标题检查

时间:2015-03-06 13:37:45

标签: javascript node.js gzip zlib fs

我的脚本获取文件数据,解释它并以不同的格式将其吐出。用户可以输入URL或上传文件,其中任何一个的文件refence都可以是XML或GZIP(然后我会解压缩)。

什么有效:

  • 从URL解析XML + GZIP
  • 上传文件
  • 从上传的文件中解析XML正文

什么不起作用

  • 从上传的文件中解压缩+解析GZIP< body;

虽然zlib.gunzip(fileX_bodyFromUpload)失败,zlib.gunzip(fileX_bodyFromURL)完美无缺。奇怪的是,ZLIB对同一文件的文件上传版本感到沮丧,声称[Error: incorrect header check]

那么,我怎样才能让ZLIB正确解压缩文件内容?

功能

var tmp_path = req.files.file.path;
fs.readFile(tmp_path, 'utf8', function(err, body) {
    fs.unlink(tmp_path, function(err) { if (err) throw err; });
    prepareBody(req, res, body);
});

function prepareBody(req, res, body) {
    if (req.body.isGzip == 'on') {
        zlib.gunzip(body, function(err, dezipped) {
            if (typeof dezipped != 'undefined') {
                var xmlData = dezipped.toString('utf-8');
                parseAndOffload(req, res, xmlData);
            } else {
                console.log(err);
                console.error("TERMINATING: Could not decompress as GZIP file.");
                res.status(400).send('Could not decompress as GZIP file.')
            }
        });
    } else {
        parseAndOffload(req, res, body);
    }
}

上传GZIP文件 - >控制台日志:

 { file:
    { fieldname: 'file',
      originalname: '0c8fae64645fef5bf6f32c494cdde6b2.gz',
      name: 'b95686fb9f205e253c41dd96ccd41c24.gz',
      encoding: '7bit',
      mimetype: 'application/x-gzip',
      path: 'uploads/b95686fb9f205e253c41dd96ccd41c24.gz',
      extension: 'gz',
      size: 35898,
      truncated: false,
      buffer: null } }
 loadFile: 78ms
 { [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
 TERMINATING: Could not decompress as GZIP file.

1 个答案:

答案 0 :(得分:2)

与上一个问题类似,fs.readFile在添加'utf8'作为编码类型时返回一个字符串。

删除此内容,readFile将返回zlib.gunzip可以使用的缓冲区。

fs.readFile(tmp_path, function(err, body) {
    fs.unlink(tmp_path, function(err) { if (err) throw err; });
    prepareBody(req, res, body);
});