playframework - 如何从文件系统提供静态资产而不是默认资产 JAR 包(Play 框架)
问题描述
Play Framework将静态资源捆绑到一个 JAR 包中,该包在运行时用于解析(通过类路径查找)请求的资源。相反,我想指定一个文件系统位置,应该从中提供这些静态资产。我找到了一个 hacky 方法来做到这一点(见下文),但似乎应该有一种更简单/更好的方法来做到这一点(尽管文档没有提到它)。
我知道我可以创建一个简单的控制器并“手动”为资产提供服务,但这并没有利用标准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)
解决方案
推荐阅读
- r - R问题:为两个不同的因素和一个图例添加颜色到geom_point(),但一个不包括其他因素
- networking - 如果其 ip 被提供商阻止,如何连接到 aws VPN?
- nginx - 如何在 kubernetes 中创建多个 nginx 入口控制器
- vue.js - 当计算函数在 Vue.Js 中工作时如何更改数据中的属性
- azure-devops - 当作为复杂对象类型参数的一部分传递并与另一个对象合并时,无法识别 Devops yaml 字符串数组
- excel - 在 Excel 中将总计运行到一个值,重置累计总计,然后分组?
- node.js - 在带有 M1 芯片的 MacOS 11.6.1 上的 npm 全局安装出现问题
- r - 我需要进行数据预处理以执行以下操作:
- flutter - 在 vsCode 中运行 dart 终端
- python - 测试功能获取多个文件