使用getFromFile提供文件时添加或更改要使用的媒体类型

时间:2018-07-31 07:48:23

标签: scala mime-types akka-http

我有一条提供静态文件的路由,如下所示:

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响应无关。

1 个答案:

答案 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类型的文件扩展名,则返回正确的内容类型。否则,将使用默认的内容类型解析器。