Playframework 如何从文件系统而不是默认资产JAR包(Play Framework)提供静态资产

Playframework 如何从文件系统而不是默认资产JAR包(Play Framework)提供静态资产,playframework,play-framework-2.7,Playframework,Play Framework 2.7,将框架播放到JAR包中,JAR包在运行时用于解析(通过类路径查找)请求的资产。相反,我想指定一个文件系统位置,这些静态资产应该从该位置提供服务。我找到了一种黑客方法(见下文),但似乎应该有一种更简单/更好的方法(尽管文档中没有提到) 我知道我可以创建一个简单的控制器并“手动”为资产提供服务,但这并没有利用标准资产机制提供的内置缓存和版本控制功能 (我的附加要求是,我希望某些资产是私有的,即需要身份验证/授权才能访问它们) 下面是我目前的黑客解决方案: import java.net.URL im

将框架播放到JAR包中,JAR包在运行时用于解析(通过类路径查找)请求的资产。相反,我想指定一个文件系统位置,这些静态资产应该从该位置提供服务。我找到了一种黑客方法(见下文),但似乎应该有一种更简单/更好的方法(尽管文档中没有提到)

我知道我可以创建一个简单的控制器并“手动”为资产提供服务,但这并没有利用标准
资产
机制提供的内置缓存和版本控制功能

(我的附加要求是,我希望某些资产是私有的,即需要身份验证/授权才能访问它们)

下面是我目前的黑客解决方案:

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)