【发布时间】:2011-11-20 04:36:13
【问题描述】:
我正在 Scala 上试验 Play 2.0 框架。我试图弄清楚如何发送自定义 HTTP 标头——在本例中为“Content-Disposition:attachment; filename=foo.bar”。我似乎找不到有关如何执行此操作的文档(Play 2.0 上的文档目前总体上非常稀少)。
有什么提示吗?
【问题讨论】:
标签: scala playframework playframework-2.0
我正在 Scala 上试验 Play 2.0 框架。我试图弄清楚如何发送自定义 HTTP 标头——在本例中为“Content-Disposition:attachment; filename=foo.bar”。我似乎找不到有关如何执行此操作的文档(Play 2.0 上的文档目前总体上非常稀少)。
有什么提示吗?
【问题讨论】:
标签: scala playframework playframework-2.0
结果类型在play.api.mvc.Results,请参阅 GitHub 上的here。
为了添加标题,你会写:
Ok
.withHeaders(CONTENT_TYPE -> "application/octet-stream")
.withHeaders(CONTENT_DISPOSITION -> "attachment; filename=foo.txt")
或
Ok.withHeaders(
CONTENT_TYPE -> "application/octet-stream",
CONTENT_DISPOSITION -> "attachment; filename=foo.txt"
)
这是一个完整的示例下载:
def download = Action {
import org.apache.commons.io.IOUtils
val input = Play.current.resourceAsStream("public/downloads/Image.png")
input.map { is =>
Ok(IOUtils.toByteArray(is))
.withHeaders(CONTENT_DISPOSITION -> "attachment; filename=foo.png")
}.getOrElse(NotFound("File not found!"))
}
要下载文件,Play 现在提供了另一种简单的方法:
def download = Action {
Ok.sendFile(new java.io.File("public/downloads/Image1.png"), fileName = (name) => "foo.png")
}
缺点是如果找不到文件会导致异常。另外,文件名是通过函数指定的,看起来有点矫枉过正。
【讨论】:
withHeaders 方法可以使用多个元组参数调用一次。