Как сделать бинарный файл с игрой 2.0? - PullRequest
14 голосов
/ 29 ноября 2011

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

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

В игре 1.0 был метод renderBinary(). Сейчас нет.

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

Следовательно, как обслуживать двоичный файл с контроллера?

Ответы [ 3 ]

25 голосов
/ 24 января 2013

В Scala с Play 2.x вместо renderBinary() или Binary() juste use

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")
  }
}

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

6 голосов
/ 08 февраля 2012

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

6 голосов
/ 12 января 2012

Вот решение 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)

}

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

...