3

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

4

3 回答 3

3

尽管可以将文件作为操作的结果发送(您证明了),但我建议将公共上传存储在应用程序之外并使用通用 HTTP 服务器提供服务。

原因很简单:

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

我不喜欢这个答案,但没有办法轻松实现。

因为,“这不是一种很好的做事方式,不可靠,无法扩展,并且存在安全问题”。(我不同意这一点,但这是事实)。

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

于 2013-01-05T13:46:10.017 回答
0

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

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))
  } 
}
于 2013-01-05T14:42:36.203 回答