Kei*_*ddy 1 javascript gzip amazon-s3 pako
我正在尝试运行我期望的一个非常常见的用例:
我需要从 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);
});
Run Code Online (Sandbox Code Playgroud)
还尝试了一个版本,通过在膨胀之前添加以下内容将二进制数据输入拆分为数组:
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
Run Code Online (Sandbox Code Playgroud)
我怀疑我的数据编码存在某种问题,并且我没有将其转换为 Uint8Array 有意义的正确格式。
任何人都可以指出我正确的方向以使其正常工作吗?
为清楚起见:
原始文件在 Java 中使用 GZIPOutputStream 和 UTF-8 进行压缩,然后存储为静态文件(即 randomname.gz)。
该文件以二进制形式通过 AWS 网关传输,因此它与原始文件完全相同,因此 'curl --output filename.gz {URLtoS3Gateway}' === 从 S3 下载的文件。
当我使用网关将二进制数据编码为“base64”时,我遇到了同样的基本问题,但并没有尝试过很多围绕这项工作,因为使用“真实”二进制数据似乎比添加 base64 更容易在中间编码/解码。如果这是必要的步骤,我可以将其重新添加。
我还尝试了在此问题中途发现的一些示例处理:https : //github.com/nodeca/pako/issues/15,但这没有帮助(我可能误解了二进制格式 v.array v base64 )。
我能够弄清楚我自己的问题。它与 Javascript 读取的数据格式有关(Javascript 本身或 Angular HttpClient 实现)。我正在阅读“二进制”格式,但它与 pako 识别/使用的格式不同。当我以 base64 格式读取数据,然后使用 'atob' 转换为二进制文件时,我能够让它正常工作。这是我实际实现的(从 S3 文件存储中获取)。
1) 构建 AWS API Gateway,它将从 S3 读取先前存储的 *.gz 文件。
此时,您应该能够通过 URL 下载二进制文件的 base64 版本(在浏览器中或使用 Curl 测试)。
2) 然后我让 API Gateway 生成 SDK 并使用相应的 apiGClient.{get} 调用。
3) 在调用中,翻译 base64->binary->Uint8,然后解压/膨胀它。我的代码:
apigClient.myDataGet(params, {}, {})
.then( (response) => {
// HttpClient result is in response.data
// convert the incoming base64 -> binary
const strData = atob(response.data);
// split it into an array rather than a "string"
const charData = strData.split('').map(function(x){return x.charCodeAt(0); });
// convert to binary
const binData = new Uint8Array(charData);
// inflate
const result = pako.inflate(binData, { to: 'string' });
console.log(result);
}).catch ( (itemGetError) => {
console.log(itemGetError);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4194 次 |
| 最近记录: |