我正在使用Akka Http下载文件,但我无法从响应标头中提取文件名。我的回复标题如下所示:
Server: custom_server
Date: Sat, 8 Jul 2017 01:30:39 GMT
Connection: keep-alive
Pragma: public
Cache-Control: must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
content-disposition: attachment;filename*=UTF-8''my_custom_name.pdf
Strict-Transport-Security: max-age=15768000
当我试图检查内容处置标头是否存在时,我总是收到错误:
val hasDispositionHeader = response.headers.exists {
case headers.`Content-Disposition`(contentDisposition, params) => true
case _ => false
}
尝试使用java api也没有成功:
val fileName = response.header[ContentDisposition].get.value
我注意到 content-disposition 标题键是小写的(它是我无法控制的远程服务器) - 有关如何处理此问题的任何想法?
非常感谢你的帮助!
答案 0 :(得分:0)
查看http://doc.akka.io/docs/akka/2.4.11.1/scala/http/common/http-model.html#HttpResponse,我看到response.headers
是Seq
,所以:
response.headers.find(_name.toLowerCase == "content-disposition")
答案 1 :(得分:0)
您可以使用lowercaseName
:
val contentDispositionValue =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
以上内容会返回包含整个标头值的Option[String]
。
要从标头值获取文件名(my_custom_name.pdf
),您必须自己解压缩。如果您想避免使用正则表达式,正如您在评论中提到的那样,那么您可以split
String
分隔符上的''
:
val fileName =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
.map(_.split("''"))
.collect { case Array(first, second) => second }
以上内容返回仅包含文件名的Option[String]
。显然,这只适用于您示例中的特定标头值格式(即,文件名是标头值的最后一部分,后面紧跟''
,''
仅出现一次在标题值中)。对于其他标头值格式,您必须根据需要调整方法。