Akka Http - 如何从HttpResponse标题中读取Content-Disposition?

时间:2017-07-08 02:08:16

标签: scala akka-http

我正在使用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 标题键是小写的(它是我无法控制的远程服务器) - 有关如何处理此问题的任何想法?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

查看http://doc.akka.io/docs/akka/2.4.11.1/scala/http/common/http-model.html#HttpResponse,我看到response.headersSeq,所以:

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]。显然,这只适用于您示例中的特定标头值格式(即,文件名是标头值的最后一部分,后面紧跟''''仅出现一次在标题值中)。对于其他标头值格式,您必须根据需要调整方法。