Как отрендерить бинарник с play 2.0?

Я застрял на очевидном:

Как визуализировать изображение с контроллера с помощью Play 2.0?

В play 1.0 был метод renderBinary(). Теперь его нет.

Play-RC1 определил только 3 типа контента: Txt, Html и Xml....

Следовательно, как обслуживать бинарник из контроллера?


person Olivier Refalo    schedule 29.11.2011    source источник


Ответы (3)


В Scala с Play 2.x вместо renderBinary() или Binary() просто используйте

Ok(byteArray).as(mimeType)

В предыдущем примере это дает:

import play.api._
import play.api.Play.current
import play.api.mvc._

object Application extends Controller {

  def index = Action {
    val app = Play.application
    var file = Play.application.getFile("pics/pic.jpg")
    val source = scala.io.Source.fromFile(file)(scala.io.Codec.ISO8859)
    val byteArray = source.map(_.toByte).toArray
    source.close()

    Ok(byteArray).as("image/jpeg")
  }
}

Надеюсь это поможет.

person teemoo    schedule 24.01.2013
comment
Спасибо, хотя я бы посоветовал перенести фактический доступ к файлам в модель. - person DavidG; 20.12.2013

Вот решение Scala:

package controllers

import play.api._
import play.api.Play.current
import play.api.mvc._

object Application extends Controller {

  def index = Action {
    val app = Play.application
    var file = Play.application.getFile("pics/pic.jpg")
    val source = scala.io.Source.fromFile(file)(scala.io.Codec.ISO8859)
    val byteArray = source.map(_.toByte).toArray
    source.close()

    Binary(byteArray, None, "image/jpeg");
  }
}

Binary — это метод Controller, как и Ok. Исходный код в Results.scala предполагает, что он будет удален:

/** To be deleted... */
def Binary(data: Array[Byte], length: Option[Long] = None, contentType: String = "application/octet-stream") = {

  val e = Enumerator(data)

  SimpleResult[Array[Byte]](header = ResponseHeader(
    OK,
    Map(CONTENT_TYPE -> contentType) ++ length.map(length =>
      Map(CONTENT_LENGTH -> (length.toString))).getOrElse(Map.empty)),
    body = e)

}

Но нет никаких предложений, что использовать вместо этого. Я полагаю, что можно было бы просто создать свой собственный объект, чтобы сделать это, если это необходимо.

person craigmj    schedule 12.01.2012
comment
Спасибо. Я должен был уточнить... как насчет версии Java? - person Olivier Refalo; 23.01.2012

В Java, согласно последнему коду Play 2.0, класс Results содержит метод статус, который может принимать в качестве параметра byte[], который должен быть полезен для вашего сценарий.

person Pere Villega    schedule 08.02.2012