2017-04-04 52 views
2

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

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

我有这个在我的控制器的动作:

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

在客户端(使用邮差调试),该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 

我不知道该怎么调试这个任何进一步

+0

您是否尝试使用其他HTTP客户端,比如'curl'? – vdebergue

回答

3

我贴在Play Gitter Channel同样的问题,找到问题的答案是设置Content-Typeoctet-stream,然后指定编码为gzip的内容:

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