2013-02-16 174 views

回答

3

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

如果你打算存储图像,你想让这些图像公开可用还是私密?如果它们公开可用,则可以将它们存储在公用文件夹中。

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

对于公共的东西,我会将文件存储在公共目录下的上传/模型名称/字段名称/编号位置。对我而言,这更多是为了组织目的。

检查出http://railscasts.com/episodes/253-carrierwave-file-uploads是一个很好的教程。

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

+0

CarrierWave上的+1,无处不在。特别适合雾推到S3或类似的。 – Cluster 2013-02-16 22:23:53

2

将图像存储在小应用程序目录中非常普遍。然而,这里有几点需要考虑:

  • 您是否预计会有很多用户?如果你有一百万用户,在你的应用程序中存储每个人的照片会占用大量内存

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

  • 一般来说,我建议不要在本地存储所有图像,因为在您缩放时重写代码会变得很痛苦。我建议您上传到Amazon S3 Bucket并根据需要下载图像(并在用户登录时缓存它们)。它很有帮助,因为您可能需要处理图像处理(例如,调整上传的图像大小,创建上传的图像的缩略图版本),并且在后台进程可以持久访问这些文件时更容易实现。我已经使用了'aws'宝石和S3库,并且它非常易于使用,你可以在这里阅读更多关于它的信息:​​

  • 但是,如果你打算这是一个小应用程序,不要在Heroku上部署,只需将其保存到本地目录便可轻松且无痛

相关问题