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