我有一条提供静态文件的路由,如下所示:
get {
(pathPrefix("appContent" / Segment) & respondWithHeader(Connection("close"))) { appTemplateId =>
pathSingleSlash {
getFromFile(s"${config.appStorePath}/${appTemplateId}/index.html")
} ~
getFromDirectory(s"${config.appStorePath}/${appTemplateId}")
}
}
对于某些类型的文件,我想更改在响应头中发送的mime类型。在akka-http中,mime类型表示为MediaType对象。我的问题是可以在此媒体类型映射中添加/替换条目,还是改变内容类型解析过程的最简单方法是什么?
在文档中,我已经找到了如何register custom media types的方式,但是看起来它只与解析HTTP消息有关,与HTTP响应无关。
答案 0 :(得分:0)
通过实现getFromFile()
和getFromDirectory()
都使用的自定义内容类型解析器来解决此问题:
implicit val contentTypeResolver = new ContentTypeResolver {
override def apply(fileName: String) = {
fileName.substring(fileName.lastIndexOf('.') + 1) match {
case ext @ ("ttf" | "eot" | "otf" | "woff" | "woff2") =>
ContentType(MediaType.custom(s"font/$ext", binary = true, NotCompressible, List(ext)), () => HttpCharsets.`UTF-8`)
case _ => ContentTypeResolver.Default.apply(fileName)
}
}
}
因此,基本上它会检查文件扩展名,如果它是我们要设置mime类型的文件扩展名,则返回正确的内容类型。否则,将使用默认的内容类型解析器。