我被困在一个显而易见的问题上:
如何使用Play 2.0从控制器渲染图像?
使用play 1.0,有renderBinary()
方法。它现在已经消失了。
Play-RC1仅定义了3种内容类型:Txt,Html和Xml ....
因此,如何从控制器提供二进制文件?
答案 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");
}
}
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)
}
但是没有建议使用什么。我想如果需要的话,可以简单地创建一个自己的对象。
答案 2 :(得分:6)
在Java中,根据最新的Play 2.0代码,结果类包含一个方法status,它可以接收 byte [] 作为参数,该方法应该是用于你的场景。