Как загружать загруженные файлы в Play! 2 с помощью 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"
)
}
}
Мне непонятно, как вернуть загруженные изображения пользователям, которые хотят их видеть. Сейчас я размещаю сервер на своей машине, поэтому фрагмент кода из руководства записывает файлы на мой диск D: который не является (и не должен) быть доступен из Интернета. Насколько я вижу, есть 2 варианта:
-
Храните фотографии в папке/общей папке в моем проекте (тот, который посвящен активам). См. Здесь: http://www.playframework.org/documentation/2.0/Assets
-
Напишите мой собственный контроллер, который обслуживает изображения из пользовательских местоположений с моего диска.
Для 1, я не уверен, что это цель активов.
Для 2 я понятия не имею, как написать такой контроллер.
Ответы
Ответ 1
2.0.3 будет содержать внешний контроллер активов, который может быть (неверно) использован для этого. Написание такого контроллера не является волшебным, но у вас есть предопределенная папка, в которой все ваши загрузки сохранены, и то, где вы их читали. В базе данных вы сохраняете (уникальное) имя файла.
Другой подход - сохранить загруженные файлы в базе данных. Мы делаем это с помощью GridFS в MongoDB. Пользовательский контроллер возвращает их пользователю. Таким образом, ваши данные хранятся в одном центральном месте, что также упрощает резервное копирование и восстановление.
Ответ 2
Простым примером является
def index = Action {
Ok.sendFile(new java.io.File("/tmp/fileToServe.pdf"))
}
есть раздел "Служебные файлы" в https://www.playframework.com/documentation/2.4.x/ScalaStream#Serving-files, в котором объясняется, как обслуживать файлы
Ответ 3
Вы можете добавить новый маршрут следующим образом:
GET /myFiles/*file controllers.Assets.at(path="/tmp", file)