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

问题描述 投票:3回答:2

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

图像存储在public/images并且像这样@routes.Assets.at(images/images1.jpg)@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)
html5 web-applications playframework playframework-2.2
2个回答
2
投票

创建DIST封装后public文件夹创建从访问*.jar文件,所以您需要重新DIST您的应用程序,使在其提供上载的文件。

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


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)等还原路径访问

© www.soinside.com 2019 - 2024. All rights reserved.