Как получить доступ к файлам внешних папок приложения для рендеринга в шаблоне Play Framework 2.6.x? - PullRequest
0 голосов
/ 02 декабря 2018

Хотя в режиме разработки можно загружать файлы с помощью метода ref.move в () в общей папке или любой папке приложения в инфраструктуре воспроизведения и отображать этот файл методом path () AssetsFinder.Но в режиме prod загрузка файла в общую папку или папку приложения не допускается.В этом случае, что я могу сделать, чтобы получить доступ к файлам внешней папки приложения, и какой будет метод рендеринга для отображения файла (изображений) в шаблоне?Ищете подробное решение ....

package controllers

import javax.inject.{Inject, Singleton}
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}



@Singleton
class ImageServerController @Inject()(cc: ControllerComponents)
  extends AbstractController(cc) {

  def serveImages(imageName:String): Action[AnyContent] = Assets.versioned("/tmp/images",imageName)




}

файл конфигурации

GET     /test                       controllers.TestController.test    
GET     /dynamicassets/*file                       controllers.ImageServerController.serveImages(file)

доступ к просмотрам

package controllers

import javax.inject.{Inject, Singleton}
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}

@Singleton
class TestController @Inject()(cc: ControllerComponents)(implicit assetsFinder: AssetsFinder)
  extends AbstractController(cc) {

  def test:Action[AnyContent]=Action{

    Ok(views.html.testview("hotelapp.jpeg"))
  }

}

здесь просмотр

@(fileName:String)



    <img src="@routes.ImageServerController.serveImages(fileName)">

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Ах, нам нужно использовать Потоковый HTTP-ответ , чтобы сделать это.

Вот документация .... https://www.playframework.com/documentation/2.6.x/ScalaStream

мой код контроллера будет

 package controllers

import akka.stream.scaladsl.{FileIO, Source}
import akka.util.ByteString
import javax.inject.{Inject, Singleton}
import play.api.http.HttpEntity
import play.api.mvc._



@Singleton
class ImageServerController @Inject()(cc: ControllerComponents)(implicit assetsFinder: AssetsFinder)
  extends AbstractController(cc) {



  def serveImages(imageName:String):Action[AnyContent] = Action {

    val file = new java.io.File("/tmp/images/"+imageName)
    val path: java.nio.file.Path = file.toPath
    val source: Source[ByteString, _] = FileIO.fromPath(path)

    Result(
      header = ResponseHeader(200, Map.empty),
      body = HttpEntity.Streamed(source, None, Some("image/jpeg"))
    )
  }


}
0 голосов
/ 02 декабря 2018

Вот два варианта:

1) После загрузки файла вы перемещаете его в папку (например, / uploads), созданную в каталоге вашего приложения.Затем вы обслуживаете эти изображения через Apache, который более приспособлен, чем игра, для обслуживания ресурсов.

Вам необходимо иметь Apache в качестве обратного прокси-сервера вашего приложения и настроить URL-адрес для обслуживания ресурсов или перенаправления на ваше приложение.

2) Вы также перемещаете файл в папку (/загружает), а затем вы создаете маршрут в вашем приложении

GET /img/:name controllers.MyController.serveImage(name: String)

и в вашем контроллере:

public Result serveImage(String name) {
    String path = "uploads/" + name;
    return ok(new File(path));
}

Преимущество 2) заключается в том, что вы можете управлять авторизацией при обслуживании файла в зависимости отна пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...