Playframework:更改时资产不会在生产模式下更新

Playframework: Assets are not updated in production mode when changed

我用游戏框架 2.x 创建了一个移动 html5 网站。用户可以通过该应用程序上传图像,然后这些图像存储在该应用程序所在的服务器上 运行ning。

图像存储在 public/images 中,并像这样访问:@routes.Assets.at(images/images1.jpg)

我的问题是每当用户上传图片到我的服务器然后试图查看上传的图片时,图片无法显示。

我发现每当我在服务器上重新启动播放过程时,新上传的图像就会正确显示。我通常这样启动我的生产服务器:

activator dist

然后解压缩创建的 zip 目录和 运行 生成的脚本。

我认为问题是当应用程序打包时它只会打包 assets.jar 中当时可用的资产,因此无法显示在服务器启动后添加的新图像开始了。


所以我的问题是,我需要更改什么才能正确显示在服务器 运行ning 期间更改或添加的图像,而无需重新打包和重新启动应用程序。


我的路线文件

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET        /                                 controllers.Application.index

# Used in Javascript to push new User into Database via Ajax
PUT        /users/:i                         controllers.Userdata.addUser(i: Int)

... similiar PUT Requests ...

PUT        /deactUser/:i                     controllers.Userdata.deactUser(i: Int)

GET        /reloadUsers                      controllers.Userdata.reloadUsers(minA: Int, maxA: Int, gend: String, orient: String, verf: String)

GET         /ads                             controllers.Application.getAds()

# Javascript Router
GET        /assets/javascripts/routes        controllers.Application.javascriptRoutes()

# Map static resources from the /public folder to the /assets URL path
GET        /assets/*file                     controllers.Assets.at(path="/public", file)

创建 dist 包后,可以从创建的 *.jar 文件访问 public 文件夹,因此您需要重新分发您的应用程序,使上传的文件在其中可用。

相反,您应该在文件系统中创建一些目录并定义其路径(最好通过配置文件),这样您就可以上传文件并为它们提供 into/from 独立 位置。当然,您也需要编写自定义操作来为它们提供服务,但这只是几行代码。

以下是实践中要实现的内容:

在你的路由文件中,添加如下内容:

GET         /customImage/:name        controllers.Application.imageAt(name:String)

然后像这样实现imageAt:

public Result imageAt(String imageName) throws FileNotFoundException {
    File imageFile = new File("/path/to/image"+imageName);
    if (imageFile.exists()) {
        String resourceType = "image+"+imageName.substring(imageName.length()-3);
        return ok(new FileInputStream(imageFile)).as(resourceType);
    } else {
        return notFound(imageFile.getAbsoluteFile());
    }
}

就是这样。您放入“/path/to/image”的任何内容都可以通过 url /customerImage/ 访问 它们也可以通过像@routes.Application.imageAt(imageName)

这样的还原路由访问