2011-11-29 29 views
13

Estoy atascado en uno obvio:¿Cómo hacer un binario con play 2.0?

¿Cómo se genera una imagen desde un controlador usando Play 2.0?

Con Play 1.0 hubo un método renderBinary(). Ahora se ha ido.

Play-RC1 sólo se define tipos de contenido 3: TXT, HTML y XML ....

Por lo tanto, cómo servir un binario del controlador?

Respuesta

24

En Scala con Play 2.x, en lugar de renderBinary() o Binary() uso juste

Ok(byteArray).as(mimeType) 

En el ejemplo anterior, esto da:

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") 
    } 
} 

Espero que esto ayude.

+0

Gracias, aunque te aconsejo que muevas el real acceso de archivo al modelo. – DavidG

6

he aquí una solución 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 es un método de Controller, al igual que Ok. El código fuente en Results.scala sugiere que se borrará:

/** 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) 

} 

Pero no hay ninguna sugerencia de lo que debe utilizar en su lugar. Supongo que uno podría simplemente crear su propio objeto para hacer esto si es necesario.

+1

gracias. Debería haber aclarado ... ¿qué tal una versión de Java? –

6

En Java, según el último código de Juego 2.0, Resultados clase contiene un método status que puede recibir un byte [] como parámetro, que debería ser de utilidad para su escenario.

+0

gracias, he estado esperando este método ... –

+0

@OlivierRefalo eres bienvenido :) –

+0

Para Java, mira mi solución: http://stackoverflow.com/a/20838010/554796 – Benchik

Cuestiones relacionadas