将已经Gzip的有效负载发送到客户端

时间:2017-04-04 22:04:41

标签: scala playframework

我正在努力发送一个来自S3的Gzip文件的响应。我正在从S3下载文件作为Array[Byte],然后我想将其传递给客户端并让浏览器负责解压缩。

要清楚,我没有在Play中使用内置的gzipFilter,因为数据已经压缩了。

我在控制器的操作中有这个:

s3DAO.getFile(id).map(bytes => Ok(bytes).as("application/gzip”))

在客户端上(使用Postman进行调试),Content-Type标题设置为application/gzip,但正文看起来像这样:

���[�W�$��j3��-��/�-HOz��ƒ@�HȄ%D���E�Л��%�=P�����$�*v7��X����������=޾x|��w������챕8�,��X���

我知道这些字节代表了一个有效的有效负载,因为如果我在控制器动作中插入自己解压缩的代码,我可以将它打印出来:

val zipInputStream = new GZIPInputStream(new ByteArrayInputStream(bytes))
val rawString = scala.io.Source.fromInputStream(zipInputStream, Charsets.UTF_8.name).mkString
println(rawString) // I can see my payload

我不知道如何进一步调试这个

1 个答案:

答案 0 :(得分:3)

我在Play Gitter Channel上发布了相同的问题,发现答案是将Content-Type设置为octet-stream,然后将编码指定为gzip:

Ok(bytes).as("application/octet-stream").withHeaders("Content-Encoding" -> "gzip")