任何意见,将不胜感激。我的 Web 应用程序中有一个 json 变量,我想对其进行 gzip 压缩并通过预签名 URL 上传到 S3。
我能够成功上传 JSON,但无法对 JSON 进行 gzip 压缩然后上传。
我尝试构建 gzipped 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);
Run Code Online (Sandbox Code Playgroud)
对于每次尝试,我都通过 Angular 的 HTTP 客户端上传 resultAsBinString,标头为 Content-Type: …
我正在尝试压缩字典以访问 API。
我阅读了某人用 JavaScript 和一个名为“pako”的库压缩数据的代码,并自己尝试了。它工作完美:
var myDictionary = {...}
var b = pako.deflate(JSON.stringify(a), {
to: "string",
gzip: !0
});
return b = btoa(b)
}
var compressed = b(n)
Run Code Online (Sandbox Code Playgroud)
现在我想用Python做同样的事情:我尝试了以下方法,但结果不同并且不起作用:
my_dictionary = {...}
data_json = json.dumps(my_dictionary, ensure_ascii=False)
data_gzip = zlib.compress(bytes(data_json, "utf-8"))
compressed = base64.b64encode(bytes(str(data_gzip), "utf-8"))
Run Code Online (Sandbox Code Playgroud)
有谁知道如何用Python解决这个问题吗?Python 是否有类似 pako 的库?
我使用以下代码从python生成gzip文件:(使用python 3)
file = gzip.open('output.json.gzip', 'wb')
dataToWrite = json.dumps(data).encode('utf-8')
file.write(dataToWrite)
file.close()
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试使用Pako库在Javascript中读取此文件(我使用的是Angular 2):
this.http.get("output.json.gzip")
.map((res:Response) => {
var resText:any = new Uint8Array(res.arrayBuffer());
var result = "";
try {
result = pako.inflate(resText, {"to": "string"});
} catch (err) {
console.log("Error " + err);
}
return result;
});
Run Code Online (Sandbox Code Playgroud)
但我在控制台中收到此错误:unknown compression method.我应该做些什么来正确地夸大gzip文件吗?
我正在将一些“遗留”(非打字稿)js 库导入我的 angular SPA。
通常我只是从 cdn 添加一个负载到 index.html 像:
<script src="//cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
在角分量中,我只是进行了 decal
declare var pako: any;
Run Code Online (Sandbox Code Playgroud)
这通常有效。现在我喜欢在本地“托管”这个库。我可以将它添加到 angular 项目中
npm install pako
Run Code Online (Sandbox Code Playgroud)
但是我如何将它添加到 angular 应用程序中?
我测试了向 polyfills.ts 添加导入(这适用于hammerjs 但不适用于 pako)
这也应该适用于 ng build(并且可能会被添加到编译/打包的 runtime.js
顺便说一句:这是一个测试 stackblitz https://stackblitz.com/edit/ng-load-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: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 javascript 来膨胀来自第三方 websocket 的消息,但是收到了pako.js
“无效的存储块长度”错误。
我用来实现网络套接字的示例代码可以在这里找到:
https://github.com/okcoin-okex/API-docs-OKEx.com/tree/master/demo
可以在此处找到代码的完整工作版本:
https://github.com/Tucsky/SignificantTrades/blob/master/src/exchanges/okex.js ( https://aggr.trade )
我尝试使用zlib.js而不是Pako.js使用该库,但遇到了更困难的问题。我尝试过在 stackoverflow 上找到的其他替代解决方案,但它们似乎没有满足我的需要。
这是我正在运行的显示错误的代码。 https://jsfiddle.net/fwkgmvjr/
let myAPI = new WebSocket('wss://real.okex.com:10442/ws/v3');
//When the connection is first opened
myAPI.onopen = event => {
console.log('Socket opened')
myAPI.send('{"op": "subscribe", "args":["futures/ticker:ETH-USD-190927"]}')
}
myAPI.onmessage = event => {
if (event.data instanceof String) {
console.log(event.data)
} else {
try {
console.log(JSON.parse(pako.inflateRaw(event.data, {
to: 'string'
})))
} catch (err) {
console.log(err)
}
}
}
myAPI.onclose = event => {
console.log('Socket …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Deflater.class 对 Java 中的 JSON 字符串进行原始压缩。但是java和typescript生成的压缩结果有一些区别。
let bodyString = JSON.stringify(idTokenPayload);
const fields = deflate ? { zip: 'DEF' } : {};
const body = deflate ? pako.deflateRaw(bodyString) : bodyString;
Run Code Online (Sandbox Code Playgroud)
在爪哇,
protected String deflateAndBase64Encode(String jsonString) {
try {
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
DeflaterOutputStream deflaterStream = new DeflaterOutputStream(bytesOut, deflater);
deflaterStream.write(jsonString.getBytes());
deflaterStream.finish();
return Base64.getEncoder().encodeToString(bytesOut.toByteArray());
} catch (IOException e) {
}
return "";
}
Run Code Online (Sandbox Code Playgroud)
更新:
我需要按如下方式转换 JSON 有效负载以生成智能健康卡。Json Payload -> Minified JSON -> Raw deflate -> …
pako ×7
javascript ×5
gzip ×3
amazon-s3 ×2
angular ×2
python ×2
typescript ×2
angular-cli ×1
compression ×1
deflate ×1
java ×1
npm ×1
raw ×1