2012-07-12 16 views
16

Próbuję zezwolić użytkownikom na przesyłanie zdjęć na serwer, a następnie ich wyświetlanie. Przesyłanie odbywa się zgodnie z opisem in this guide. Oto kod:Jak obsługiwać wgrane pliki w Play! 2 przy użyciu 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" 
    ) 
    } 
} 

Nie jest dla mnie jasne, jak przesłać obrazy przesłane użytkownikom, którzy chcą je zobaczyć. Obecnie hostuję serwer na własnym komputerze, więc fragment kodu z przewodnika zapisuje pliki na dysku D :, który nie jest (i nie powinien być) dostępny w Internecie. O ile widzę są 2 opcje:

  1. Store zdjęcia pod/folderu publicznego w moim projekcie (ten, który jest dedykowany do aktywów). Zobacz tutaj: http://www.playframework.org/documentation/2.0/Assets

  2. Napisz własny kontroler obsługujący obrazy z niestandardowych lokalizacji z dysku.

Dla 1, nie jestem pewien, czy to jest celem aktywów. Dla 2, nie mam pojęcia, jak napisać taki kontroler.

Odpowiedz

9

2.0.3 będzie zawierał external Assets controller, który może być (nie) używany do tego. Pisanie takiego kontrolera nie jest jednak magiczne, masz predefiniowany folder, w którym zapisywane są wszystkie twoje przesyłki, i tam właśnie je czytasz. W bazie danych zapisujesz (unikalną) nazwę pliku.

Innym rozwiązaniem byłoby zapisanie przesłanych plików w bazie danych. Robimy to z GridFS w MongoDB. Niestandardowy kontroler udostępnia je użytkownikowi. W ten sposób Twoje dane są przechowywane w jednym centralnym miejscu, co również upraszcza tworzenie kopii zapasowych i odzyskiwanie.

+0

Ciekawe . Jednakże zrozumiałem, że przechowywanie plików bezpośrednio w bazie danych może być złym zwyczajem, podążając za tym pytaniem: http://stackoverflow.com/questions/11416735/how-to-upload-a-file-to-the-database- using-playframework-in-scala –

+1

Jak zwykle to zależy. GridFS jest wyraźnie stworzony dla tego rodzaju problemu, podobnie jak Amazon S3. Jeśli przechowujesz pliki w lokalnym systemie plików, masz duży problem, gdy potrzebujesz drugiego serwera jednego dnia. Spójrz na kontroler aktywów, nie jest to trudne do zrozumienia. –

+0

Możesz także użyć serwera NAS do współużytkowania pamięci masowej między serwerami i zamontowania jej w odpowiednich miejscach. Możesz również przesłać swoje pliki do CDN i pozwolić, by służyły twoim plikom. Przechodzenie z MongoDB tylko do przechowywania plików nie jest lepszym wyborem, jak sądzę. – iwalktheline

18

Prostym przykładem jest

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

istnieje „Serving pliki” rozdział w https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files która wyjaśnia, jak obsługiwać pliki

+0

Wolałbym to rozwiązanie niż kontroler ExternalAssets, ponieważ jest wyłączony w trybie programowania. –

+0

Pytanie nie dotyczyło sposobu wyświetlania plików, ale sposobu wyświetlania ** przesłanych ** plików i przesyłania do folderu zasobów. –

0

Można dodać nową trasę tak:

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

Nie oczekuję, że to zadziała: "Podczas procesu kompilacji zawartość folderu publicznego jest przetwarzana i dodawana do ścieżki klasy aplikacji." – stewSquared

+0

Zawartość folderu PUBLIC ... Przeczytaj resztę dokumentacji. Powinno działać poprawnie. -> https://www.playframework.com/documentation/2.0/Assets – Peanut

Powiązane problemy