Playframework 玩框架:文件上传后不提供,直到播放干净

Playframework 玩框架:文件上传后不提供,直到播放干净,playframework,playframework-2.0,Playframework,Playframework 2.0,如果我在生产模式下将文件上载到文件系统(到公共资产目录),则之后不会提供该文件。我需要运行clean命令。我得到一个找不到文件的错误。我怎样才能避免这种情况呢?我不喜欢这个答案,但要做到这一点是不容易的 因为“”。(我不同意这一点,但这是事实) 最好的解决方案是将文件存储在数据库中,或将其上载到另一个服务(如S3)。我添加了一个自定义资产控制器,现在它似乎工作正常: package customcontrollers import controllers.Assets import play.

如果我在生产模式下将文件上载到文件系统(到公共资产目录),则之后不会提供该文件。我需要运行clean命令。我得到一个找不到文件的错误。我怎样才能避免这种情况呢?

我不喜欢这个答案,但要做到这一点是不容易的

因为“”。(我不同意这一点,但这是事实)


最好的解决方案是将文件存储在数据库中,或将其上载到另一个服务(如S3)。

我添加了一个自定义资产控制器,现在它似乎工作正常:

package customcontrollers

import controllers.Assets
import play.api.mvc.Action
import play.api.mvc.AnyContent
import play.api.mvc.Results.Ok
import play.api.Play.current
import play.api._

object UploadedImageAssets {
  def at(file: String): Action[AnyContent] = Action {
    Ok.sendFile(Play.getFile("public/uploaded-images/"+file))
  } 
}

虽然作为操作结果发送文件是可能的(您已经证明了这一点),但我建议将公共上传存储在应用程序之外,并使用公共HTTP服务器提供服务

原因很简单:

  • 如果您需要快速添加/替换文件,可以使用通用FTP客户端来完成
  • 如果使用第三方客户端添加文件,则无需重新部署应用程序
  • HTTP服务器提供静态文件的速度更快,它可以开箱即用地管理缓存头(因为这是它的工作)等等。服务器不需要将文件重写为结果
  • 为此使用子域,您可以创建一个'la CDN解决方案
  • 应用程序的代码只是更小

谢谢。最简单的解决方案是禁用资产对象上的缓存。现在,我编写了一个自定义资产单例,它取代了内置的资产类……很好。至少你的第三点对我很重要。我可能会使用Apache2来为上传的文件提供服务。如果您不需要使用Apache特定的功能,那么nginx可能是更好的选择