任何建议将不胜感激。我的 Web 应用程序中有一个 json 变量,我想通过预签名的 URL 将其 gzip 并上传到 S3。
我能够成功上传 JSON,但我无法压缩 JSON 然后上传它。
我尝试构建 gzip json 的三种不同的方法是:
// example json
const someJson = { testOne: 'a', testTwo: 'b' };
// Attempt one
const stringUtf16 = JSON.stringify(someJson);
const resultAsBinString = pako.gzip(stringUtf16);
// Attempt two
const stringUtf16 = JSON.stringify(someJson);
const resultAsBinString = pako.gzip(stringUtf16, { to: 'string' });
// Attempt three
const stringUtf16ThatWeNeedInUtf8 = JSON.stringify(someJson);
const stringUtf8 = unescape(encodeURIComponent(stringUtf16ThatWeNeedInUtf8));
const resultAsBinString = pako.gzip(stringUtf8);
对于每次尝试,我都通过Angular的HTTP客户端上传resultAsBinString,带有标题内容类型:"application/x-gzip"和内容编码:"gzip">
但是,当(如果它经常给出网络错误(文件之后从 S3 下载时,当尝试在终端中使用 gzip 或 gunzip 解压缩时,会给出一条错误消息:"不是 gzip 格式">
我试图关注的来源:
https://github.com/nodeca/pako/issues/55https://github.com/nodeca/pako/blob/master/examples/browser.html
设置Content-Encoding: gzip
不正确,如果您希望有效负载在下载后保持压缩状态。 这仅在您希望浏览器透明地解码 gzip 编码时使用 - 例如在提供 gzip 的 HTML、JavaScript、CSS 等时。
如果使用Content-Encoding: gzip
,则应将Content-Type
设置为与实际有效负载匹配,例如 Content-Type: application/json
。
如果使用Content-Type: application/x-gzip
,则不应使用Content-Encoding
,除非您使用不同类型的压缩来重新压缩 gzip 有效负载(不太可能(。
Content-Type: application/x-gzip
与Content-Encoding: gzip
相结合意味着您已将 gzip 文件包装在另一层 gzip 压缩中,并且您希望浏览器删除外层,这在实践中不会这样做。
以下过程对我有用:
生成内容类型为"application/json"的预签名 URL。提供的文件名末尾应包含.gz。在返回的预签名 URL 中,扫描 URL 应验证内容类型是否为应用程序/json。
因为我确定我的 JSON 不包含会破坏到 UTF-8 转换的字符串,所以我执行以下操作(Angular 代码,但它传达了结构(:
const headers = new HttpHeaders({
'Content-Type': 'application/json',
'Content-Encoding': 'gzip'
}); //1
const httpOptions = {
headers: headers
};
const str = JSON.stringify(geoJson); //2
const utf8Data = unescape(encodeURIComponent(str)); //3
const geoJsonGz = pako.gzip(utf8Data); //4
const gzippedBlob = new Blob([geoJsonGz]); //5
upload = this.httpClient.put(presignedUploadUrl, gzippedBlob, httpOptions); //6
代码中遵循的步骤:
- 内容类型标头是应用程序/json,内容编码是 gzip。
- 字符串化 JSON
- 将字符串转换为 UTF-8
- 压缩字符串
- 从压缩数据创建文件
- 将文件上传到预签名网址
然后,您可以从 S3 下载 gzip 文件(浏览器应自动解压缩该文件(并打开它以验证它是否包含相同的结果。