play framework 2.6.x模板中app外层文件夹文件访问方式是什么?
what is the way of accessing app outer folder files to render in template of play framework 2.6.x?
虽然在开发模式下,可以通过 ref.move to() 方法上传文件到 public 文件夹或播放框架中的任何应用程序文件夹,并通过 AssetsFinder 的路径()呈现该文件方法。但是在产品模式下,不允许在 public 文件夹或应用程序文件夹中上传文件。在这种情况下,我可以做什么来访问应用程序外部文件夹文件以及在模板中渲染文件(图像)的实际渲染方法是什么?
正在寻找详细的解决方案....
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)">
这里有两个选项:
1) 上传文件后,将其移动到在应用程序目录中创建的文件夹(例如/uploads)。然后你通过 Apache 提供这些图像,它比 play 更适合提供资产。
您需要将 Apache 作为您的应用程序的反向代理,并配置 url 来提供资产而不是重定向到您的应用程序。
2) 您还将文件移动到一个文件夹 (/uploads),然后在您的应用程序中创建一个路由
GET /img/:name controllers.MyController.serveImage(name: String)
在你的控制器中:
public Result serveImage(String name) {
String path = "uploads/" + name;
return ok(new File(path));
}
2) 的好处是您可以在根据用户提供文件时管理权限。
啊,
我们需要使用 流式 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"))
)
}
}
虽然在开发模式下,可以通过 ref.move to() 方法上传文件到 public 文件夹或播放框架中的任何应用程序文件夹,并通过 AssetsFinder 的路径()呈现该文件方法。但是在产品模式下,不允许在 public 文件夹或应用程序文件夹中上传文件。在这种情况下,我可以做什么来访问应用程序外部文件夹文件以及在模板中渲染文件(图像)的实际渲染方法是什么? 正在寻找详细的解决方案....
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)">
这里有两个选项:
1) 上传文件后,将其移动到在应用程序目录中创建的文件夹(例如/uploads)。然后你通过 Apache 提供这些图像,它比 play 更适合提供资产。
您需要将 Apache 作为您的应用程序的反向代理,并配置 url 来提供资产而不是重定向到您的应用程序。
2) 您还将文件移动到一个文件夹 (/uploads),然后在您的应用程序中创建一个路由
GET /img/:name controllers.MyController.serveImage(name: String)
在你的控制器中:
public Result serveImage(String name) {
String path = "uploads/" + name;
return ok(new File(path));
}
2) 的好处是您可以在根据用户提供文件时管理权限。
啊, 我们需要使用 流式 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"))
)
}
}