Как подать изображение с помощью Scalatra

Способна ли любая версия Scalatra обслуживать изображения с правильным заголовком Content-Type? Кажется, я не могу подавить автоматическое добавление charset.

Пример возврата File:

class MyServlet extends org.scalatra.ScalatraServlet {
  get("/") {
    contentType = "image/png"
    new java.io.File("/tmp/test.png")
  }
}
$ curl --head localhost:8080
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 21:43:28 GMT
Content-Type: image/png;charset=utf-8
Transfer-Encoding: chunked
Server: Jetty(9.4.8.v20171121)

Пример возврата InputStream:

class MyServlet extends org.scalatra.ScalatraServlet {
  get("/") {
    contentType = "image/png"
    new java.io.FileInputStream(new java.io.File("/tmp/test.png"))
  }
}
$ curl --head localhost:8080
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 21:49:52 GMT
Content-Type: image/png;charset=utf-8
Content-Length: 2881
Server: Jetty(9.4.8.v20171121)

person earldouglas    schedule 01.08.2019    source источник


Ответы (1)


Одним из возможных решений является установка ContentType, а затем запись двоичного каталога в HttpServletResponse следующим образом:

get("/image") {
  contentType  = "image/png"
  val out = response.getOutputStream

  // write binary to OutputStream here
  ...

  // Prevent updating response headers in following processes
  response.flushBuffer()

  () // return Unit
}

Кстати, я пытался исправить эту проблему несколько лет назад, но она была устранена из-за обратной совместимости: https://github.com/scalatra/scalatra/pull/332

person Naoki Takezoe    schedule 04.08.2019