2012-07-12 33 views
16

Estoy tratando de permitir a los usuarios subir fotos al servidor y luego verlas. La carga ocurre como se describe in this guide. Aquí está el código:¿Cómo servir archivos cargados en Play! 2 usando Scala?

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

Es claro para mí cómo servir las imágenes cargadas de nuevo a los usuarios que desean verlos. En este momento 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 disco D: que no está (y no debería) disponible en Internet. Por lo que yo puedo ver que hay 2 opciones:

  1. tienda las fotos en la carpeta/pública en mi proyecto (la que se dedica a los activos). Vea aquí: http://www.playframework.org/documentation/2.0/Assets

  2. Escriba mi propio controlador que sirve imágenes de ubicaciones personalizadas desde mi disco.

Para 1, no estoy seguro de si ese es el objetivo de los activos. Para 2, no tengo idea de cómo escribir un controlador de este tipo.

Respuesta

9

2.0.3 contará con un external Assets controller que podría (mal) usarse para esto. Escribir un controlador de este tipo no es nada mágico, tienes una carpeta predefinida en la que 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 simplifica las copias de seguridad y las recuperaciones.

+0

Interesante . Sin embargo, estaba enterado de que almacenar archivos directamente en la base de datos podría ser una mala práctica, siguiendo esta pregunta: http://stackoverflow.com/questions/11416735/how-to-upload-a-file-to-the-database- using-playframework-in-scala –

+1

Como siempre, depende. GridFS se hace explícitamente para este tipo de problema, al igual que Amazon S3. Si almacena sus archivos en el sistema de archivos local, tiene un gran problema cuando necesita un segundo servidor un día. Eche un vistazo al controlador de activos, no es tan difícil de entender. –

+0

También puede usar un NAS para compartir el almacenamiento entre servidores y montarlo en los lugares correctos. También puede cargar sus archivos en un CDN y dejar que sirvan sus archivos. Ir con MongoDB solo para el almacenamiento de archivos no es la mejor opción, creo. – iwalktheline

18

El ejemplo simple es

def index = Action { 
    Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf")) 
} 

hay "Sirviendo archivos" en https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files que explica cómo servir archivos

+0

Yo preferiría esta solución en lugar del controlador ExternalAssets ya que está deshabilitada en el modo de desarrollo. –

+0

La pregunta no era sobre cómo servir archivos, sino cómo servir archivos ** cargados ** y si puede cargarlos en su carpeta de activos. –

0

Es posible añadir una nueva ruta de la siguiente manera:

GET  /myFiles/*file    controllers.Assets.at(path="/tmp", file) 
+0

No espero que esto funcione: "Durante el proceso de compilación, los contenidos de la carpeta pública se procesan y se agregan a la classpath de la aplicación". – stewSquared

+0

El contenido de la carpeta PUBLIC ... Lee el resto de la documentación. Debería funcionar correctamente. -> https://www.playframework.com/documentation/2.0/Assets – Peanut

Cuestiones relacionadas