我在使用spray 1.3.2从他的核心看起来像这样的路由提供静态文件时遇到了一些问题:
ctx.withHttpResponseHeadersMapped(hm => hm ++ List(`Content-Disposition`("attachment",
Map(("filename", attachment.name),
`Content-Length`(attachment.bytes.length)))
.withHttpResponseEntityMapped { e =>
HttpEntity(new ContentType(
MediaTypes.forExtension(attachment.name.split('.').last.toLowerCase).getOrElse(MediaTypes.`application/octet-stream`), None), e.data) //also tried with just MediaTypes.`application/octet-stream` as default
}
.complete(attachment.bytes)
其中attachment.name只是一个字符串,attachment.bytes是一个数组[Byte]。
通过这种方式,我可以从浏览器界面下载Array [Byte]表示的文件,问题是当文件采用excel格式(xls,xlsx)时,下载的文件似乎在损坏期间被破坏了这个过程并没有打开。
奇怪的是,对于那些损坏的文件,下载的副本的大小比原始文件大,并且在浏览器控制台中可以注意到传输编码被设置为在移除Content-Length头的情况下分块。
删除特定媒体类型无效。
我找不到一个解决方案,可以使用这段代码使这些excel文件顺利运行。
我不明白传输编码设置为分块的位置,文件大小似乎不是原因,因为它可以为其他格式(pdf,txt,jpeg,...)提供大文件而不会出现此问题
如果有人可以暗示正在发生的事情,我将不胜感激,谢谢。