数据是存放在OSS 里面的log文件,需要用nodejs 下的http协议读取发现是 Content-Encoding:deflate ,看官方的例子 使用zlib 进行解压 报Error: incorrect header check 的错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到 "Error: incorrect header check" 错误通常意味着在使用 zlib 解压缩时,输入的数据不匹配预期的 zlib 头部信息。这可能是因为数据在传输或存储过程中被错误处理,或者使用的解压方法与实际的压缩算法不匹配。
针对您提到的情况,OSS 中的文件使用了 Content-Encoding: deflate
,这意味着文件是使用 Deflate 算法压缩的。在 Node.js 中使用 zlib 解压缩 Deflate 格式的数据时,需要注意的是,Deflate 压缩格式有原始的 Deflate raw format 和带 zlib 头部的格式之分。根据您的错误提示,看起来您可能需要直接处理原始 Deflate 数据,而不是带有 zlib 头部的数据。
您可以尝试以下方法来解压从 OSS 下载的 Deflate 压缩的日志文件:
const http = require('http');
const https = require('https');
const fs = require('fs');
const zlib = require('zlib');
// 假设这是从 OSS 获取文件的示例 URL
const url = 'http://your-oss-bucket-url-to-log-file';
const outputFilePath = './output.log';
// 自定义请求处理以获取原始的 Buffer 数据
function requestWithCallback(url, callback) {
const protocol = url.startsWith('https') ? https : http;
protocol.get(url, (res) => {
let data = [];
res.on('data', (chunk) => {
data.push(chunk);
}).on('end', () => {
callback(null, Buffer.concat(data));
});
}).on('error', (err) => {
callback(err);
});
}
// 解压缩并写入文件
requestWithCallback(url, (err, buffer) => {
if (err) {
console.error('Error fetching file:', err);
return;
}
// 尝试直接解压原始Deflate数据,不使用zlib.createInflate(),因为这通常期望有zlib头
zlib.inflateRaw(buffer, (err, decompressed) => {
if (err) {
console.error('Error decompressing:', err);
} else {
fs.writeFile(outputFilePath, decompressed, (err) => {
if (err) {
console.error('Error writing to file:', err);
} else {
console.log('Decompressed and saved to', outputFilePath);
}
});
}
});
});
这段代码首先发起 HTTP(S) 请求获取文件内容,然后使用 zlib.inflateRaw()
方法尝试解压原始的 Deflate 数据,最后将解压后的内容写入到本地文件中。请注意替换示例中的 url
为您的实际 OSS 文件 URL,并确保您有权访问该文件。