播放:其他公共/资产目录

时间:2014-03-03 12:17:34

标签: scala playframework playframework-2.0

为了拥有一个干净的目录结构,我想公开一个额外的资产文件夹。我在我的项目文件夹中创建了一个目录'assets',写了一个'PictureAssets'控制器,它几乎与'controller.Assets'相同,将'资产'添加到build.sbt中的playAssetsDirectories并尝试跟踪一些没有的路径条目成功。

PictureAssets:

package controllers

import play.api.mvc.Action
import play.api.mvc.AnyContent

object PictureAssets extends AssetsBuilder {
   def create : Action[AnyContent]  =  Action {
      Ok(views.html.fileUploadForm())
   }
}

build.sbt

playAssetsDirectories <+= baseDirectory / "assets"

路由

# GET     /file                 controllers.PictureAssets.at(path="/assets", file="MM1.png")
GET     /datei/*file            controllers.PictureAssets.at(path="/assets", file)
# GET       /datei/*file            controllers.Assets.at(path="/assets", file)

如果我尝试访问该URL,则不会显示任何内容,或者显示错误“图像http:9000 // localhost / datei / MM1.png因为包含错误而无法显示”或css引用已处理由'controller.Assets'不再起作用。

我错过了什么?

1 个答案:

答案 0 :(得分:6)

我认为问题来自于使用的at方法是Assets之前使用的默认方法。

我在去年的某个时候碰到了同样的问题,我想要提供存储在外部文件夹中的图像,磁盘上的某个文件夹,这就是我编码的方式:

我创建了一个名为Photos的简单控制器,其中包含一个Action:

object Photos extends Controller {

  val AbsolutePath = """^(/|[a-zA-Z]:\\).*""".r

  /**
   * Generates an `Action` that serves a static resource from an external folder
   *
   * @param absoluteRootPath the root folder for searching the static resource files.
   * @param file the file part extracted from the URL
   */
  def at(rootPath: String, file: String): Action[AnyContent] = Action { request =>
    val fileToServe = rootPath match {
      case AbsolutePath(_) => new File(rootPath, file)
      case _ => new File(Play.application.getFile(rootPath), file)
    }

    if (fileToServe.exists) {
      Ok.sendFile(fileToServe, inline = true)
    } else {
      Logger.error("Photos controller failed to serve photo: " + file)
      NotFound
    }
  }

}

然后,在我的路线中,我定义了以下内容:

GET /photos/*file   controllers.Photos.at(path="/absolute/path/to/photos",file)

这对我来说很好。希望这会有所帮助。

PS:这是帮助提供js和css文件的普通Assets控制器的补充。