Как загружать загруженные файлы в Play! 2 с помощью Scala? - программирование
Подтвердить что ты не робот

Как загружать загруженные файлы в 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 я понятия не имею, как написать такой контроллер.

4b9b3361

Ответ 1

2.0.3 будет содержать внешний контроллер активов, который может быть (неверно) использован для этого. Написание такого контроллера не является волшебным, но у вас есть предопределенная папка, в которой все ваши загрузки сохранены, и то, где вы их читали. В базе данных вы сохраняете (уникальное) имя файла.

Другой подход - сохранить загруженные файлы в базе данных. Мы делаем это с помощью GridFS в MongoDB. Пользовательский контроллер возвращает их пользователю. Таким образом, ваши данные хранятся в одном центральном месте, что также упрощает резервное копирование и восстановление.

Ответ 3

Вы можете добавить новый маршрут следующим образом:

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