我用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)
创建DIST封装后public
文件夹创建从访问*.jar
文件,所以您需要重新DIST您的应用程序,使在其提供上载的文件。
相反,您应该在文件系统中创建一些目录并定义其路径(最好通过配置文件),这样您就可以上传文件并将其提供到独立位置或从独立位置提供。 当然,您还需要编写自定义操作来为它们提供服务,但这只是几行代码。
这是在实践中实施的内容:
在您的路线文件中,添加如下内容:
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)等还原路径访问