[英]How to serve static assets from filesystem rather than default assets JAR bundle (Play Framework)
Play Framework将静态资产捆绑到JAR捆绑包中,该捆绑包在运行时用于解析(通过类路径查找)请求的资产。 相反,我想指定一个文件系统位置,这些静态资产应从该位置提供。 我发现了一种骇人听闻的方法(见下文),但似乎应该有一种更简单/更好的方法(尽管文档中没有提及)。
我知道我可以创建一个简单的控制器并“手动”服务资产,但这并没有利用标准Assets
机制提供的内置缓存和版本控制功能。
(我的附加要求是我想将某些资产设为私有,即要求进行身份验证/授权才能访问它们)
所以这是我当前的hacky解决方案:
import java.net.URL
import java.nio.file.{Files, Paths}
import controllers._
import javax.inject.Inject
import play.api.http.{FileMimeTypes, HttpErrorHandler}
import play.api.mvc.{Action, AnyContent, ControllerComponents}
import play.api.{Configuration, Environment}
import scala.concurrent.ExecutionContext
object AssetResolver {
def resolve(path: String): Option[URL] = {
val resPath = Paths.get(path)
if (Files.exists(resPath))
Some(resPath.toUri.toURL)
else None
}
}
class AssetsController @Inject()(config: Configuration,
env: Environment,
httpErrorHandler: HttpErrorHandler,
fileMimeTypes: FileMimeTypes)
(implicit ec: ExecutionContext) {
private val configuration = AssetsConfiguration.fromConfiguration(config, env.mode)
private val assetsMetadata = new DefaultAssetsMetadata(configuration, AssetResolver.resolve _, fileMimeTypes)
private val assets = new Assets(httpErrorHandler, assetsMetadata)
// authentication checking logic removed since irrelevant to question
def secureAt(file: String): Action[AnyContent] = assets.at(file)
}
然后,在conf/application.conf
可以定义:
play.assets {
path = "/absolute/path/to/assets" # *must* be an absolute path
urlPrefix = "/assets"
}
然后在conf/routes
中可以如下使用控制器:
GET /assets/*file controllers.AssetsController.secureAt(file)
有一个更好的方法吗? (我正在使用Play 2.7)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.