Play框架:“play start”命令的奇怪行为-缓存问题?

3
我目前正在使用play框架2开发web应用程序。我在/public目录下创建了一个名为“files”的文件夹。当我使用“play run”启动服务器时,该目录下的所有资源都可以访问。
在部署到服务器后。我通过运行“play start”来启动服务器,并发现“files”下的资源不能再被找到了。
我想知道“play start”和“play run”之间不一致的原因是什么。
更新:经过几次尝试,我发现新上传的资源无法显示。情况如下:
1. play start --> server starts.
2. use application to upload a few images to the server.
3. try to display the uploaded image --> nothing is shown. browser shows the resource is not accessible.
4. kill the server process with task manager.
5. rm RUNNING_PID
6. run play start again 
7. Try to display the uploaded image --> now the images are showing.

看起来是“热更新”问题,涉及到“播放开始” 有没有什么配置可以让服务器捕捉到这个变化? 谢谢。


你已经在本地测试过 play start 了吗?如果有堆栈跟踪,请添加到你的帖子中。 - Crazenezz
不,我无法在我的本地机器上运行"play start",因为出现了一个错误,我在http://stackoverflow.com/questions/10713173/playframework-2-0-classnotfoundexception中描述了这个错误。 - Wei Ma
2个回答

6

你把图片存放在哪里了? 在编译时,静态资源从/public复制到/target/scala-2.9.1/classes/public。这个目录是类路径的一部分,资产从那里提供服务。因此,如果你在运行时将文件存储在那里,它们应该可以被找到。

顺便说一句:这可能不是一个可持续的解决方案,因为用户上传的图像在下次构建时会被删除。也许你应该考虑使用应用程序安装之外的符号链接(注意!安全问题!)或将资产存储在其他地方,数据库或S3始终是很好的选择。


我将图片放在 /public/files 目录下。所以,你的意思是当用户在 URL 中输入路径 /assets/files/xxx.jpg 时,服务器会查找 /target/scala-2.9.1/classes/public/files 来查找此文件?如果是这样,那么当用户上传时,我可以在两个位置创建我的图像。但是为什么 playframework 要设计成这样呢?难道提供静态资源不是常见的情况之一吗? - Wei Ma
1
@wei-ma:当然可以,但是 静态 资源不应该在运行时改变... 因此它们在编译时被编译,可选地进行了gzip。正如我所提出的:将上传的文件放在磁盘的其他位置上,并编写您自己的简单控制器,在请求时提供此文件的服务。 - Joerg Viola
我猜我太习惯IIS的行为了。默认情况下,IIS会原样提供静态内容,不缓存,不压缩。我在想是否可以配置Play做同样的事情。我相信实现一个简单的控制器不会太难,但是框架不应该给我选择不需要这些额外功能吗? - Wei Ma
我会将您的答案标记为被接受的答案。但是我也在下面提供了我最终解决这个问题的方法。 - Wei Ma

2

基于 @Joerg Viola 的回答,我决定实现自己的操作来提供静态资源。结果发现这非常容易。从 这个链接 中,我学到了如何在一行代码中实现文件服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接