【问题标题】:Play: additional public / assets directory播放:额外的公共/资产目录
【发布时间】:2014-04-04 11:46:36
【问题描述】:

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

图片资源:

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' 不再起作用了。

我错过了什么?

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    我认为问题在于使用的at 方法是Assets 以前使用的默认方法。

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

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

    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 控制器的补充。

    【讨论】:

    • 谢谢,就我而言,我不得不使用val fileToServe = new File(Play.application.getFile(rootPath), file) 作为相对路径。
    • @Peter 我将它移植到 Java 并且它工作了 :) 谢谢。如果我在绝对路径的文件夹中有大量图像,这会扩展吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2013-08-19
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多