Akka Http - 如何从 HttpResponse headers 读取 Content-Disposition?
Akka Http - how to read Content-Disposition from HttpResponse headers?
我正在使用 Akka Http 下载文件,但无法从响应 header 中提取文件名。我的回复 header 看起来像这样:
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
当我尝试检查 content-disposition header 是否存在时,我总是收到 false:
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 header 键是小写的(这是一个我无法控制的远程服务器)- 知道如何处理它?
非常感谢您的帮助!
查看 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")
您可以使用 lowercaseName
:
val contentDispositionValue =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
上面的 returns 一个包含整个 header 值的 Option[String]
。
要从 header 值中获取文件名 (my_custom_name.pdf
),您必须自己提取它。如果你想避免使用正则表达式,正如你在评论中提到的,那么你可以 split
''
分隔符上的 String
:
val fileName =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
.map(_.split("''"))
.collect { case Array(first, second) => second }
上面的returns一个只包含文件名的Option[String]
。显然,这仅适用于示例中的特定 header 值格式(即,文件名是 header 值的最后一部分,并且紧接在 ''
之前,并且''
在 header 值中只出现一次)。对于其他 header 值格式,您必须根据需要调整方法。
我正在使用 Akka Http 下载文件,但无法从响应 header 中提取文件名。我的回复 header 看起来像这样:
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
当我尝试检查 content-disposition header 是否存在时,我总是收到 false:
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 header 键是小写的(这是一个我无法控制的远程服务器)- 知道如何处理它?
非常感谢您的帮助!
查看 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")
您可以使用 lowercaseName
:
val contentDispositionValue =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
上面的 returns 一个包含整个 header 值的 Option[String]
。
要从 header 值中获取文件名 (my_custom_name.pdf
),您必须自己提取它。如果你想避免使用正则表达式,正如你在评论中提到的,那么你可以 split
''
分隔符上的 String
:
val fileName =
response.headers
.find(_.lowercaseName == "content-disposition")
.map(_.value)
.map(_.split("''"))
.collect { case Array(first, second) => second }
上面的returns一个只包含文件名的Option[String]
。显然,这仅适用于示例中的特定 header 值格式(即,文件名是 header 值的最后一部分,并且紧接在 ''
之前,并且''
在 header 值中只出现一次)。对于其他 header 值格式,您必须根据需要调整方法。