I am stuck on an obvious one:
How to render an image from a controller using Play 2.0 ?
With play 1.0 there was a renderBinary()
method. It is now gone.
Play-RC1 only defined 3 content types: Txt, Html and Xml....
Therefore, how to serve a binary from the controller?
In Scala with Play 2.x, instead of renderBinary()
or Binary()
juste use
Ok(byteArray).as(mimeType)
In the previous example, this gives:
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")
}
}
Hope this helps.
Here's a Scala solution:
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
is a method of Controller
, just like Ok
. The source code in Results.scala
suggests it will be deleted:
/** 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)
}
But there is no suggestion of what to use instead. I suppose one could simply create one's own object to do this if required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With