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

时间:2015-08-22 12:07:11

标签: html5 web-applications playframework playframework-2.2

我使用playframework 2.x创建了一个移动html5网页。用户可以通过应用程序上传图像,然后应用程序存储在运行应用程序的服务器上。

图片存储在public/images中,并以如下方式存储:@routes.Assets.at(images/images1.jpg)

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

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

activator dist

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

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

所以我的问题是,我需要更改哪些内容才能正确显示在服务器运行时更​​改或添加的图像,而无需重新打包并重新启动应用程序。

我的路线档案

# 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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

在路线文件中,添加如下内容:

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)

这样的还原路径访问