【问题标题】:profile pictures - how to store [duplicate]个人资料图片-如何存储[重复]
【发布时间】:2013-02-16 20:36:54
【问题描述】:

在我的网站中,用户可以上传个人资料图片。
我想知道存储这些图像的最佳方式是什么。
我的想法只是专用目录。图像名称将是 user_id。

这是一个好的解决方案,还是有更聪明的解决方案?

【问题讨论】:

    标签: ruby-on-rails database-design web social-networking


    【解决方案1】:

    您有两个选择,存储图像或使用外部来源(gravatar)。

    如果您要存储图像,您希望这些图像是公开的还是私有的?如果它们是公开可用的,那么您可以将它们存储在您的公用文件夹中。

    您可以使用carrierwave 之类的东西来处理图像的上传、版本控制和存储。

    对于公共内容,我会将文件存储在上传者/模型名称/字段名称/id 位置下的公共目录中。这更多是出于我的组织目的。

    查看http://railscasts.com/episodes/253-carrierwave-file-uploads 以获得很好的教程。

    对于私有图像,我会将存储目录设置为公共文件夹之外的内容,并将在控制器中使用该文件创建下载操作。这样,除非文件通过控制器操作,否则用户无法下载文件。通过授权 (cancan),我可以允许或禁止用户访问该特定文件的下载操作(因此使其有点安全)。如果您要使用像 apache 或 nginx 这样的生产服务器,请确保设置了适当的处理程序来发送文件(即 x_sendfile)。

    【讨论】:

    • CarrierWave 上的 +1,随处使用。特别适合将雾推送到 S3 等。
    【解决方案2】:

    将图像存储在小型应用程序的目录中是很常见的。但是,这里有一些事情需要考虑:

    • 您预计会有很多用户吗?如果您有一百万用户,在您的目录中存储每个人的照片将在运行您的应用程序时占用大量内存

    • 您是否在 Heroku 上进行部署?许多 RoR 应用程序都是,如果您在 Heroku 上部署,当您的应用程序移动到不同的测功机时,它将破坏您在本地存储的任何文件(并且您通常无法预测何时会发生这种情况)。你可以在这里https://devcenter.heroku.com/articles/dynos#isolation-and-security

    • 阅读有关临时文件系统的信息
    • 一般来说,我建议不要在本地存储所有图像,因为在扩展时重写代码会变得很痛苦。我建议您上传到 Amazon S3 存储桶并根据需要下载图像(并在用户登录时缓存它们)。它很有帮助,因为您可能必须处理图像处理(例如调整上传的图像大小,创建上传图像的缩略图版本),并且当您有对这些文件具有持久访问权限的后台进程时更容易做到这一点。我为此使用了“aws”gem 和 S3 库,它非常易于使用,您可以在此处阅读更多信息:http://amazon.rubyforge.org/

    • 但是,如果您打算将其作为一个小型应用程序并且不部署在 Heroku 上,则只需将其保存到本地目录会更容易且轻松

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2014-12-20
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多