我正在尝试运行我期望的一个非常常见的用例:
我需要从 Amazon S3 下载一个 gzip 文件(包含复杂的 JSON 数据集),然后用 Javascript 解压缩(gunzip)它。除了最后的“充气”步骤外,我的一切工作正常。
我正在使用 Amazon Gateway,并确认网关正在正确传输压缩文件(使用 Curl 和 7-zip 来验证生成的数据是否来自 API)。不幸的是,当我尝试使用 Pako 对 Javascript 中的数据进行膨胀时,我遇到了错误。
这是我的代码(注意:response.data 是从 AWS 传输的二进制数据):
apigClient.dataGet(params, {}, {})
.then( (response) => {
console.log(response); //shows response including header and data
const result = pako.inflate(new Uint8Array(response.data), { to: 'string' });
// ERROR HERE: 'buffer error'
}).catch ( (itemGetError) => {
console.log(itemGetError);
});
还尝试了一个版本,通过在 inflate 之前添加以下内容将二进制数据输入拆分为数组:
const charData = response.data.split('').map(function(x){return x.charCodeAt(0); });
const binData = new Uint8Array(charData);
const result = pako.inflate(binData, { to: 'string' });
//ERROR: incorrect header check
我怀疑我的数据编码存在某种问题,并且我没有将其转换为正确的格式,以使 Uint8Array 有意义。
谁能指出我正确的方向来完成这项工作?
为了清楚起见:
- 正如上面列出的代码,我得到一个缓冲区错误。如果我删除 Uint8Array,并尝试处理“result.data”,我会收到错误:“不正确的标头检查”,这让我怀疑这是我的数据的编码/格式问题。
原始文件在Java 中使用带有UTF-8 的GZIPOutputStream 进行压缩,然后存储为静态文件(即randomname.gz)。
该文件作为二进制文件通过 AWS 网关传输,因此它与原始文件完全相同,因此 'curl --output filename.gz {URLtoS3Gateway}' === 从 S3 下载的文件。
当我使用网关将二进制数据编码为“base64”时,我遇到了同样的基本问题,但并没有尝试很多,因为使用“真实”二进制数据似乎比添加 base64 更容易在中间进行编码/解码。如果这是需要的步骤,我可以将其重新添加。
我还尝试了在这个问题中途发现的一些示例处理:https ://github.com/nodeca/pako/issues/15 ,但这没有帮助(我可能误解了二进制格式 v.array v base64 )。