Ruby on Rails保存图像的方式是什么?


9

我在iOS上进行开发,并且从PHP后端切换到Ruby on Rails。交换格式为JSON

Google快速搜索“将图像保存在Rails中”后,几乎所有结果都涉及将图像数据作为blob保存到数据库。我可能会弄错了,但我的印象是,将图像数据保存在数据库中会浪费大量的时间和空间(与保存指向文件位置的链接相反('/img/subcat/4656.png') 。

在PHP中,接收数据,生成文件名,将该文件保存到磁盘以及使用映像在磁盘上的位置更新数据库是相当标准的。Ruby on Rails是否相同,还是我不知道某些内置的ActiveRecord图像功能?


1
我偶然发现了PaperClip,它似乎与我想要的非常接近。仍将感谢经验丰富的Rails人士提供的有关如何以最佳速度处理服务和接收数千个图像的建议。
用户

1
您确实知道映像将占用db或磁盘上的空间,对吗?从直觉上讲,我会说Rails存储在数据库中,因为它不像php那样依赖Apache处理缓存。但这可能是完全错误的。
Florian Margaine 2013年

2
是的,我认为图像数据不会被存储位置所操纵。Rails可能有所不同,但是一些值得信赖的SO成员似乎倾向于数据库中的文件路径。另外,我认为传统知识是数据库很难扩展-因此在数据库中存储大量图像数据肯定不会使这变得容易。
用户

Answers:


4

我过去所做的是将PaperClip与Amazon S3CloudFront CDN结合使用,以实现更快的交付。PaperClip开箱即用地很好地支持S3存储:有关S3存储配置选项的信息,请参阅其文档

  1. 设置CloudFront分发以将图像请求转发到S3存储桶,并将其他静态资产请求转发到Ruby on Rails应用程序(或者,您也可以将这些请求上传到S3,但这不在此问题的范围之内)。
  2. CNAME您控制的域(例如asset.example.com)指向您的CloudFront发行版。
  3. 在PaperClip配置中,设置s3_host_alias: assets.example.com。这将导致生成的URL到保存的图像资源以使用CloudFront分发主机。
  4. 然后,在Ruby on Rails配置中,您可以执行config.action_controller.asset_host = http://assets.example.com。然后,Ruby on Rails资产URL也将使用您的CloudFront发行版,以进行缓存/更快地交付。

这是很粗略的,但是希望它可以指导您找到一些有用的资源。当然,这只是一种解决方案,但是在我处理数据库中成千上万个图像附件的情况下,它对我有用。

(作为一种可能的高级步骤,对于您的案例而言可能不是必需的或无用的,您还可以为CloudFront发行版设置多个CNAME,例如assets0.example.comassets1.example.com。然后都可以使用回形针s3_host_aliasaction_controller.asset_host可以使用lambda,以使您可以确定性地(基于资产)生成使用不同主机的URL,如果要在同一页面上下载大量URL,则可以实现更好的并行化,因为浏览器将限制到同一主机的最大同时连接数。)


3

我已经尝试了几种宝石,但是现在我将FineUploaderPaperClip一起使用

FineUploader为您处理了很多GUI,例如上载进度,拖放和多个文件上载等等。我使用PaperClip是因为我想将图像存储在服务器上而不是S3上。

我们通常要做的是寻找一种稳定的,即开即用的可配置解决方案,而不是从头开始创建东西。使用PaperClip可以存储图像,使用StateMachine可以对图像进行转换,然后将其基于文件名归类。我有一个同样的问题,这是我最好的解决方案,这就是为什么我要分享它。


2
这只是建议外部程序包执行此工作;OP询问的是Ruby on Rails开发人员通常做什么来存储图像,而不是提出建议。尽管这可能是一个软件包如何执行的示例,但这并不能真正回答问题。
马丁·彼得

真正。我们通常要做的是寻找一种稳定的,即开即用的可配置解决方案,而不是从头开始创建东西。使用PaperClip,我可以存储图像,使用StateMachine可以对图像进行转换,并将它们归类为基于文件名的类别。我对OP也有同样的疑问,这是我最好的解决方案,这就是为什么我要分享它。
JeroenKnoops
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.