我正在使用Spark来提供不同类型的内容。 “ Content-Length”的计算正确,但是在使用时遇到了一个问题:
response.header("Content-Encoding", "gzip")
根据their documentation,当设置了标头时,spark会自动gzip内容...并且做到了。
但是,我之前计算的“内容长度”不再有效,因此在浏览器中出现“ net :: ERR_CONTENT_LENGTH_MISMATCH”错误。
我自己将其压缩,并无法计算出最终的大小,因为spark会再次压缩输出。
如何知道火花压缩输出后的结果尺寸是多少?
答案 0 :(得分:0)
感谢您的澄清!
Content-Length
。不知道大小有点烦人,但并不罕见。CountingOutputStream
截取了OutputStreams,并且没有API可以在不更改代码的情况下做到这一点,并且它还有其他问题。问题还在于,在火花压缩输出之后,很有可能已经将其刷新发送并发送回客户端,但是必须在发送数据之前发送此标头。在发送数据之前,您基本上必须了解这一点,因此这是最困难的方法。ByteArray
(似乎您正在使用kotlin)来提供,并禁用自动压缩。 ByteArrayOutputStream
是个不错的选择。这样至少可以压缩一次。还有一些关于设置Content-Encoding
报头,同时强制spark不进行编码的事情,但这很容易打补丁。丑陋的事情是,您必须将整个数据存储在内存中,服务器不会在开始所有计算之前就开始发送数据,因此用户单击下载和开始下载之间会有延迟。