¿Cómo servir los archivos cargados en Play! 2 usando Scala?
playframework playframework-2.0 (3)
El ejemplo simple es
def index = Action {
Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf"))
}
hay una sección de "Archivos de servicio" en https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files que explica cómo servir archivos
Estoy tratando de permitir que los usuarios suban fotos al servidor y luego las vean. La carga ocurre como se describe en esta guía . Aquí está el código:
def upload = Action(parse.multipartFormData) { request =>
request.body.file("picture").map { picture =>
import java.io.File
val filename = picture.filename
val contentType = picture.contentType
picture.ref.moveTo(new File("/tmp/picture"))
Ok("File uploaded")
}.getOrElse {
Redirect(routes.Application.index).flashing(
"error" -> "Missing file"
)
}
}
No me queda claro cómo devolver las imágenes cargadas a los usuarios que desean verlas. Ahora mismo estoy alojando el servidor en mi propia máquina, por lo que el fragmento de código de la guía escribe los archivos en mi unidad D :, que no está (y no debería estar) disponible desde Internet. Por lo que puedo ver hay 2 opciones:
Guarde las fotos en la carpeta / public de mi proyecto (la que está dedicada a los activos). Vea aquí: http://www.playframework.org/documentation/2.0/Assets
Escriba mi propio controlador que sirve imágenes desde ubicaciones personalizadas desde mi disco.
Para 1, no estoy seguro de si ese es el propósito de los activos. Para 2, no tengo idea de cómo escribir un controlador de este tipo.
Puedes agregar una nueva ruta como esta:
GET /myFiles/*file controllers.Assets.at(path="/tmp", file)
2.0.3 contará con un controlador de Activos externo que podría ser (mal) utilizado para esto. Sin embargo, escribir un controlador de este tipo no es mágico, tienes una carpeta predefinida donde se guardan todas tus cargas, y ahí es donde las lees. En la base de datos guarda el nombre de archivo (único).
Un enfoque diferente sería guardar los archivos cargados en la base de datos. Hacemos esto con GridFS en MongoDB. Un controlador personalizado los devuelve al usuario. De esta manera, sus datos se almacenan en un lugar central, lo que también hace que las copias de seguridad y las recuperaciones sean más sencillas.