Rails 3 paperclip vs carrierwave vs蜻蜓vs attachment_fu

我正在将Rails 2.3.11,Ruby 1.9.2应用程序升级到Rails 3.0.10,并且attachment_fu不再有效。

我正在考虑更改回形针,载波或蜻蜓file upload,或者可能是一个Rails 3兼容,维护的attachment_fu版本。

哪个选项在性能方面最好用,保持得如何,从attachment_fu升级是多么容易,也许是Rails 3.1兼容? 每个人的主要优势和劣势是什么?

任何有识之士将不胜感激。

我用过Paperclip和Carrierwave,如果我是你,我会去Carrierwave。 这更加灵活。 我也喜欢这样的事实,它不会混乱configuration您的模型。 你可以定义上传类。 它允许您轻松地重新使用,扩展您的上传configuration。

你看了Carrierwave railscast吗? http://railscasts.com/episodes/253-carrierwave-file-uploads

回形针不是一个不错的select,但它是很长一段时间的“最好的”select。 但Carrierwave绝对看起来像新一代;)

我已经使用了CarrierWave,经过几个小时的挫折后,我切换到回形针。

以下是我在CarrierWave上看到的问题:

  • 您无法validation文件大小。 有一个wiki文章解释了如何去做,但是它不起作用。
  • 使用MiniMagick时,完整性validation不起作用(如果关心RAM使用,则非常方便)。 您可以上传损坏的图像文件,CarrierWave将首先发生错误,但下一次将吞下它。
  • 您不能删除原始文件。 你可以改变它的大小,压缩等。有一个维基文章解释如何做到这一点,但它不工作。
  • 它取决于外部库,如RMagick或MiniMagick。 回形针直接与convert命令行(ImageMagick)。 所以,如果你有Minimagick(我有)的问题,你会失去在谷歌search小时。 在写这篇文章时,RMagick和Minimagick都被抛弃了(我联系了Minimagic的作者,没有回应)。
  • 它需要一些configuration文件。 这被看作是一个优势,但我不喜欢在我的项目中只有一个configuration文件。 模型中的configuration对我来说似乎更自然。 无论如何,这是个人品味的问题。
  • 如果你发现一些错误并报告,开发团队真的缺席和忙碌。 他们会告诉你自己修复错误。 这似乎是一个个人项目,在业余时间得到改善。 对我来说,这是不适用于有最后期限的专业项目。

我会问自己:

  • 我会经常改变图像大小吗? 例如:如果你想让你的用户改变他们的图片的大小(或者由于其他原因你需要灵活的大小)或者真正的快速开发。

是的:蜻蜓

否:Carrierwave或Paperclip

(参考:
http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary,https://stackoverflow.com/questions/7419731/rails-3-paperclip-vs-carrierwave-vs-dragonfly-vs-attachment-fu.etc

回形针

回形针旨在作为Active Record的简单文件附件库。 其背后的意图是保持设置尽可能简单,尽可能像其他属性一样对待文件。 这意味着它们不会保存到磁盘上的最终位置,如果设置为nil,它们也不会被删除,直到调用ActiveRecord :: Base#save。 它根据需要pipe理基于大小和存在的validation。 如果需要的话,它可以将其分配的图像转换为缩略图,而前提条件与安装ImageMagick一样简单(对于大多数基于Unix的现代系统来说,安装正确的软件包非常简单)。 附加的文件保存到文件系统,并通过易于理解的规范在浏览器中引用,该规范具有明智和有用的默认值。

优点:

1.validation,Paperclip引入了几个validation器来validation您的附件:
AttachmentContentTypeValidator
AttachmentPresenceValidator
AttachmentSizeValidator
2.删除附件
将该属性设置为零并保存。
@ user.avatar = nil @ user.save
3.使用activerecord的有机Rails环境,而不是所有其他的select,纸夹更好。 Paperclip对于初级开发者来说更​​容易处理,而且对高级开发人员来说也具有先进的function。
4. Paperclip是一个巨大的粉丝,因为它不需要RMagick,所以将它设置为通过Amazon S3并声明模型中的所有内容(validation等)可以使事情保持清晰。
5.关于多个file upload和进度反馈,Paperclip和Attachment_fu都是可能的,但两者通常都需要一些手头上的iframes和Apache才能工作。

CarrierWave

这个gem提供了一个简单且非常灵活的方式来从Ruby应用程序上传文件。 它适用于基于Rack的Web应用程序,比如Ruby on Rails。

CarrierWave的优势

1.简单的模型实体整合。 添加单个string“图片”属性来引用上传的图片。
2.上传和远程获取图像的“魔术”模型方法。
3.HTMLfile upload集成使用标准的文件标签和另一个隐藏的标签来维护已经上传的“caching”版本。
4.直接创build不同尺寸和格式的衍生图片版本界面。 image processing工具很好地隐藏在幕后。
5.用于获取图像的公共URL的模型方法及其用于HTMLembedded的resize的版本。
6.如果内置导轨caching,Carrierwave将执行得更好,因为文件可以在没有任何处理的情况下加载。 如果你不做任何处理,没关系。
7.生成上传大拇指(节省CPU时间)
8.可以直接从静态/caching文档中使用文件
9.不需要任何caching
10.支持各种存储后端(S3,Cloudfiles,GridFS,普通文件),方便扩展到新的存储types,如果需要的话。
其中一个事实,它不会混淆你的模型与configuration。 你可以定义上传类。 它允许您轻松地重新使用,扩展您的上传configuration。
我们最喜欢的是CarrierWave是非常模块化的。 您可以轻松地在本地文件系统,基于云的AWS S3等之间切换存储​​引擎。 您可以在RMagick,MiniMagick和其他工具之间切换image processing模块。 您也可以在您的开发环境中使用本地文件系统,并切换到生产系统中的S3存储。 Carrierwave对DataMapper,Mongoid,Sequel等外部事物有很好的支持,甚至可以与第三方的映像pipe理(比如cloudinary)一起使用。这个解决scheme似乎是最全面的,支持覆盖任何东西,但是解决scheme也更加复杂至less),因为有更多的代码需要处理。 需要欣赏CarrierWave采用的模块化方法。 对于使用哪种stream行的S3客户机,支持aws / s3和right_aws是不可知论的。 它也是ORM不可知的,并且不与Active Record紧密结合。 回形针的紧密耦合在工作中引起了我们一些悲伤。

CarrierWave的缺点

1.您无法validation文件大小。 有一个wiki文章解释了如何去做,但是它不起作用。
2.使用MiniMagick时,完整性validation不起作用(如果关心RAM使用情况,则非常方便)。 你可以上传一个损坏的图像文件,CarrierWave会首先抛出一个错误,但下一次会吞下它。
3.您不能删除原始文件。 你可以改变它的大小,压缩等。有一个维基文章解释如何做到这一点,但它不工作。
这取决于RMagick或MiniMagick等外部库。 回形针直接与转换命令行(ImageMagick)。 所以,如果你有Minimagick(我有)的问题,你会失去在谷歌search小时。 在写这篇文章时,RMagick和Minimagick都被抛弃了(我联系了Minimagic的作者,没有回应)。
5.需要一些configuration文件。 这被看作是一个优势,但我不喜欢在我的项目中只有一个configuration文件。 模型中的configuration对我来说似乎更自然。 无论如何,这是个人品味的问题。
如果你发现了一些错误并报告,那么开发团队确实缺席和忙碌。 他们会告诉你自己修复错误。 这似乎是一个个人项目,在业余时间得到改善。 对我来说,这是不适用于有最后期限的专业项目。
7.本身不支持mongomapper
8.为每个生成的文件/缩略图使用存储空间。 如果使用正常的文件存储,则可能会耗尽inode!

蜻蜓gem1.关于蜻蜓的令人印象深刻的事情,它与大多数其他image processing插件分开的事情是,它允许从视图的飞行调整。
2.不需要在单独的文件中configuration缩略图大小或其他操作是一个巨大的时间和挫折保护。 它使Rails查看代码像image_tag @ product.image.thumb('150×150#')成为可能。 这一切都是通过caching来实现的。 而不是build立在上传的处理版本,然后链接到个人版本的图像,插件生成的图像,因为他们的要求。 虽然这是第一次加载时的问题,但是新创build的映像在所有后续加载中都是httpcaching的,默认情况下使用Rack :: Cache,尽pipe其他更强大的解决scheme可用,但缩放成为一个问题。

优点:

我会经常改变图像的大小吗? 例如:如果你想让你的用户改变他们的图片的大小(或者由于某种其他原因需要灵活的大小)或者真正的快速开发。
2.Yes:蜻蜓
3.否:载波或回形针
4.可以和mongomapper一起使用,但是Carrierwave已经放弃了monog mapper的支持。
5.只要caching代理在前面,蜻蜓就可以。
6.应该和mongomapper一起工作,因为它只是扩展了ActiveModel
7.dynamic生成拇指(更容易创build新的布局/缩略图)
8.只有一个文件存储! 节省空间:)
9.Dragonfly正在进行处理,即(意味着用在Varnish,Squid或Rack :: Cache之类的caching代理之后),这样在第一个请求可能需要一些时间的情况下,后续请求应该是超快的!)

坏处 :

1.如果您没有caching代理,rack :: cache或类似的请求,请在每个请求上使用CPU。
2.如果需要的话,没有办法将拇指作为文件访问。