Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to render a binary with play 2.0?

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?

like image 790
Olivier Refalo Avatar asked Nov 29 '11 04:11

Olivier Refalo


2 Answers

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.

like image 59
teemoo Avatar answered Nov 07 '22 05:11

teemoo


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.

like image 28
craigmj Avatar answered Nov 07 '22 05:11

craigmj