我被困在一个明显的问题上:
如何使用 Play 2.0 从控制器渲染图像?
在 play 1.0 中有一种renderBinary()
方法。现在它已经消失了。
Play-RC1 仅定义了 3 种内容类型:Txt、Html 和 Xml....
因此,如何从控制器提供二进制文件?
我被困在一个明显的问题上:
如何使用 Play 2.0 从控制器渲染图像?
在 play 1.0 中有一种renderBinary()
方法。现在它已经消失了。
Play-RC1 仅定义了 3 种内容类型:Txt、Html 和 Xml....
因此,如何从控制器提供二进制文件?
在带有 Play 2.x 的 Scala 中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")
}
}
希望这可以帮助。
这是一个 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)
}
但是没有建议使用什么来代替。我想如果需要,可以简单地创建自己的对象来执行此操作。
在 Java 中,根据最新的 Play 2.0 代码,Results类包含一个方法状态,它可以接收一个byte[]作为参数,这应该对您的场景有用。