14

我被困在一个明显的问题上:

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

在 play 1.0 中有一种renderBinary()方法。现在它已经消失了。

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

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

4

3 回答 3

25

在带有 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")
  }
}

希望这可以帮助。

于 2013-01-24T09:05:04.180 回答
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)

}

但是没有建议使用什么来代替。我想如果需要,可以简单地创建自己的对象来执行此操作。

于 2012-01-12T16:34:43.910 回答
6

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

于 2012-02-08T14:55:26.053 回答