在我的网站上,用户可以上传个人资料图片 我想知道存储这些图像的最佳方式是什么 我的想法只是专用目录。图像名称将是user_id。
这是一个很好的解决方案,还是有一个更聪明的解决方案?
答案 0 :(得分:3)
您有两种选择,存储图像或使用外部源(gravatar)。
如果您要存储图像,是否希望这些图像可以公开获取或者是私有的?如果它们是公开可用的,那么您可以将它们存储在公用文件夹中。
您可以使用carrierwave
之类的内容来处理图片的上传,版本控制和存储。
对于公共内容,我会将文件存储在上传者/模型名称/字段名称/ ID位置下的公共目录中。对我而言,这更多是出于组织目的。
查看http://railscasts.com/episodes/253-carrierwave-file-uploads以获得一个好的教程。
对于私有映像,我将商店目录设置为公共文件夹之外的某些内容,并在控制器中使用该文件创建下载操作。这样,除非通过控制器操作,否则用户无法下载文件。通过授权(cancan
),我可以允许或禁止用户访问该特定文件的下载操作(从而使其有些安全)。如果您要使用apache或nginx等生产服务器,请确保设置适当的处理程序以发送文件(即x_sendfile)。
答案 1 :(得分:2)
将图像存储在小型应用程序的目录中非常常见。但是,这里有一些事情需要考虑:
您预计会有很多用户吗?如果你有一百万用户,在你的目录中存储每个人的照片会在运行你的应用程序时占用大量内存
你在Heroku上部署了吗?许多RoR应用程序都是,如果你在Heroku上部署,当你的应用程序被移动到不同的dyno时,它会破坏你在本地存储的任何文件(而且你通常无法预测何时会发生这种情况)。您可以在此处阅读有关Ephemeral文件系统https://devcenter.heroku.com/articles/dynos#isolation-and-security
一般情况下,我建议不要在本地存储所有图像,因为在缩放时重写代码会变得很痛苦。我建议您上传到Amazon S3 Bucket并根据需要下载图像(并在用户登录时缓存它们)。它很有用,因为您可能必须处理图像处理(例如调整上传的图像大小,创建上传图像的缩略图版本),并且当您拥有对这些文件具有持久访问权限的后台进程时,它更容易执行此操作。我已经使用了'aws'宝石和S3库,它非常易于使用,你可以在这里阅读更多相关信息:http://amazon.rubyforge.org/
但是,如果您打算将它作为一个小应用程序并且不在Heroku上部署,那么只需将其保存到本地目录就更容易且无痛苦