NodeJS: zlib.gunzip() on file contents returns Error: incorrect header check
NodeJS: zlib.gunzip() on file contents returns Error: incorrect header check
我的脚本获取文件数据,对其进行解释,然后以不同的格式输出。用户可以输入 URL 或上传文件,其中任何一个的文件引用可以是 XML 或 GZIP(我随后解压)。
什么有效:
- 解析 XML + 来自 URL
的 GZIP
- 正在上传文件
- 正在从上传的文件中解析 XML 正文
什么不起作用
- 从上传的文件中解压缩 + 解析 GZIP 正文
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.
与您之前的问题一样,当您添加 'utf8'
作为编码类型时,fs.readFile
是 returning 字符串。
删除它,readFile
将 return 一个缓冲区,zlib.gunzip
可以使用它。
fs.readFile(tmp_path, function(err, body) {
fs.unlink(tmp_path, function(err) { if (err) throw err; });
prepareBody(req, res, body);
});
我的脚本获取文件数据,对其进行解释,然后以不同的格式输出。用户可以输入 URL 或上传文件,其中任何一个的文件引用可以是 XML 或 GZIP(我随后解压)。
什么有效:
- 解析 XML + 来自 URL 的 GZIP
- 正在上传文件
- 正在从上传的文件中解析 XML 正文
什么不起作用
- 从上传的文件中解压缩 + 解析 GZIP 正文
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.
与您之前的问题一样,当您添加 'utf8'
作为编码类型时,fs.readFile
是 returning 字符串。
删除它,readFile
将 return 一个缓冲区,zlib.gunzip
可以使用它。
fs.readFile(tmp_path, function(err, body) {
fs.unlink(tmp_path, function(err) { if (err) throw err; });
prepareBody(req, res, body);
});