2012-07-12 14 views
16

Sto tentando di consentire agli utenti di caricare foto sul server e quindi visualizzarle. Il caricamento avviene come descritto in this guide. Ecco il codice:Come pubblicare file caricati in 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" 
    ) 
    } 
} 

Non è chiaro per me il modo di servire le immagini caricate di nuovo per gli utenti che vogliono vederli. In questo momento sto ospitando il server sul mio computer, quindi il frammento di codice della guida scrive i file sul mio disco D: che non è (e non dovrebbe essere) disponibile da Internet. Per quanto posso vedere ci sono 2 opzioni:

  1. Conservare le foto nella cartella/public nel mio progetto (quello che è dedicato ai beni). Vedi qui: http://www.playframework.org/documentation/2.0/Assets

  2. Scrivi il mio controller che assegna immagini da posizioni personalizzate dal mio disco.

Per 1, non sono sicuro se questo è lo scopo delle risorse. Per 2, non ho idea di come scrivere un controller di questo tipo.

risposta

9

2.0.3 conterrà un external Assets controller che potrebbe essere (errato) utilizzato per questo. Scrivere un controller di questo tipo non è magica, però, hai una cartella predefinita in cui sono salvati tutti i tuoi caricamenti, ed è da lì che li leggi. Nel database si salva il nome del file (univoco).

Un approccio diverso sarebbe quello di salvare i file caricati nel database. Lo facciamo con GridFS in MongoDB. Un controller personalizzato li restituisce all'utente. In questo modo i dati vengono archiviati in un'unica posizione centrale, semplificando anche i backup e i recuperi.

+0

Interessante . Tuttavia, ho capito che archiviare i file direttamente nel database potrebbe essere una cattiva pratica, seguendo questa domanda: http://stackoverflow.com/questions/11416735/how-to-upload-a-file-to-the-database- using-playframework-in-scala –

+1

Come sempre, dipende. GridFS è esplicitamente creato per questo tipo di problema, come Amazon S3. Se archivi i tuoi file nel file system locale, hai un grosso problema quando hai bisogno di un secondo server un giorno. Dai un'occhiata al controller delle risorse, non è difficile da capire. –

+0

È inoltre possibile utilizzare un NAS per condividere lo spazio tra i server e montarlo nei punti giusti. Puoi anche caricare i tuoi file su un CDN e lasciarli servire ai tuoi file. Andare con MongoDB solo per la memorizzazione dei file non è la scelta migliore, credo. – iwalktheline

18

L'esempio più semplice è

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

v'è "Servire file" a https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files che spiega come servire i file

+0

Preferirei questa soluzione piuttosto che il controller ExternalAssets poiché è disabilitato in modalità Sviluppo. –

+0

La questione non era su come servire i file, ma il modo di servire i file ** ** caricati, e se è possibile caricare nella cartella risorse. –

0

È possibile aggiungere un nuovo percorso in questo modo:

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

Non mi aspetto che questo lavoro: "Durante il processo di generazione, il contenuto della cartella pubblica vengono elaborati e aggiunti al classpath applicazione" – stewSquared

+0

Il contenuto della cartella pubblica ... Leggi il resto della documentazione. Dovrebbe funzionare correttamente. -> https://www.playframework.com/documentation/2.0/Assets – Peanut