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

Oli*_*alo 14 playframework-2.0

我被困在一个明显的一个:

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

有了1.0,有一种renderBinary()方法.它现在消失了.

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

那么,如何从控制器中提供二进制文件?

tee*_*moo 25

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

Ok(byteArray).as(mimeType)
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,这给出了:

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")
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


cra*_*gmj 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

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)

}
Run Code Online (Sandbox Code Playgroud)

但是没有任何关于使用什么的建议.我想如果需要,可以简单地创建一个自己的对象来做这个.


Per*_*ega 6

在Java中,根据最新的Play 2.0代码,Results类包含一个方法状态,该状态可以接收byte []作为参数,该参数应该适用于您的场景.