如何用play 2.0渲染二进制文件?

时间:2011-11-29 04:27:34

标签: playframework-2.0

我被困在一个显而易见的问题上:

如何使用Play 2.0从控制器渲染图像?

使用play 1.0,有renderBinary()方法。它现在已经消失了。

Play-RC1仅定义了3种内容类型:Txt,Html和Xml ....

因此,如何从控制器提供二进制文件?

3 个答案:

答案 0 :(得分:25)

在使用Play 2.x的Scala中,而不是使用renderBinary()Binary() juste

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

希望这有帮助。

答案 1 :(得分:6)

这是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");
  }
}

BinaryController的一种方法,就像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)

}

但是没有建议使用什么。我想如果需要的话,可以简单地创建一个自己的对象。

答案 2 :(得分:6)

在Java中,根据最新的Play 2.0代码,结果类包含一个方法status,它可以接收 byte [] 作为参数,该方法应该是用于你的场景。