【问题标题】:Locally store and serve user-uploaded image files from a web app从 Web 应用程序本地存储和提供用户上传的图像文件
【发布时间】:2013-11-24 05:56:38
【问题描述】:

我有一个播放应用程序来处理用户上传的图像文件。该应用程序必须不断地将这些图像文件提供给不同的用户(将其视为一个非常简单的 instagram 版本)。

由于这是一个原型,我决定降低成本,而不是使用像 Amazon S3 这样的服务,现在只需在服务器上本地存储和提供这些图像文件。

我的问题是,如何将这些图像文件存储在 ubuntu 服务器内的某个位置,当我升级到这个 play 网络应用程序时,该位置将保持不变?过去,我在 Web 应用程序的父文件夹中使用符号链接,以便 Web 应用程序本身可以简单地写入 Web 应用程序 Director 内的本地文件夹(例如 /images),这将是指向类似 @ 的链接987654322@,但有件事告诉我这不是最好的做事方式。

有什么建议吗?谢谢。

【问题讨论】:

    标签: ubuntu playframework playframework-2.0


    【解决方案1】:

    您可以将图像存储在任何位置,您只需创建 Action 以从不同位置提供这些资产,如下所示:

    object Images extends Controller  {
    
      def getImage( file: String) = Action   {
        val image = new     File(Play.current.configuration.getString("images.directory").getOrElse("")+File.separator+file)
        Ok.sendFile(image)
      }
    
    } 
    

    images.directory 是指向文件系统目录的属性,定义在 application.conf 文件中

    向路由文件添加新资源

    GET     /images/*file               controllers.Images.getImage(file:String)
    

    【讨论】:

    • 谢谢,这可行,但它会发送实际文件作为结果。如何发送该文件的 URL?
    • 路由文件中给出,{yourdomain}/images/{image}
    【解决方案2】:

    对于这种情况,我总是建议使用额外的 HTTP 服务器来提供图像(以及其他静态资产,甚至是应用程序的样式和图形),它总是比 Play 花费更少的资源,并且可能会更快一些,因为你不这样做每次都需要用控制器将图像重写到浏览器。

    然后 Play 只是将文件的路径保留在另一台服务器上并呈现主应用程序视图。

    当您使用单独的域(不仅是子域)时,您还可以节省一些传输费用,因为浏览器不会发送 cookie。

    额外的好处是您可以在不同的机器(即亚马逊或一些专业的 CDN)之间移动文件,而您只需在移动过程中更改数据库中的路径。

    【讨论】:

    • 我同意。我想我最终会使用 nginx 来处理图像。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2010-12-12
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2022-12-06
    相关资源
    最近更新 更多