Rails 3中的图片上传库对比:Paperclip、Carrierwave、Dragonfly和Attachment_fu。

52
我正在升级一个基于Rails 2.3.11和Ruby 1.9.2的应用程序到Rails 3.0.10,然而attachment_fu不再起作用。
我考虑更换成paperclip、carrierwave或者dragonfly来上传文件,或者找到一个兼容Rails 3且有维护的版本的attachment_fu。
这些选项中哪一个在性能、维护程度、从attachment_fu升级的易用性方面最好?也许它们中的某一个会兼容Rails 3.1吗?每个选项的主要优势和缺点是什么?
任何见解都将不胜感激。

https://www.ruby-toolbox.com/categories/rails_file_uploads - Chloe
3个回答

42

我使用过Paperclip和Carrierwave,如果是我,我会选择使用Carrierwave。它更加灵活。我也喜欢这个事实,它不会在模型中添加配置信息。相反,你可以定义上传器类。这使您能够轻松重复使用、扩展等您的上传配置。

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

Paperclip并不是一个糟糕的选择,它长期以来一直是“最好”的选择。但是Carrierwave绝对看起来像新一代的选择 ;)


3
谢谢!我刚看了那个railscast,还有那个paperclip的视频。我想我会使用Carrierwave;似乎大多数人都建议使用它。现在就来升级attachment_fu,这应该会很有趣... - keithepley
1
有一种简单的方法可以从Paperclip迁移到CarrierWave,但不幸的是,对于attachment_fu来说并非如此。从CarrierWave的GitHub页面上可以看到:“不幸的是,attachment_fu在哲学上与CarrierWave有太大的差异,因此没有合理的兼容模式。欢迎提交从其他解决方案迁移的补丁。” :( - Robin
1
如果你想在Rails 2.3.x上使用attachment_fu并迁移到CarrierWave,我建议首选Paperclip而不是CarrierWave。当你在Rails 2.3.x上使用CW的0.4.x分支时,无法在上传时设置文件的content_type,这对我来说是个致命问题。如果你正在从attachment_fu迁移到Rails 3,并升级到CarrierWave,那么一切都会很好,CarrierWave是一个很好的选择。 - wchrisjohnson

40

我曾使用CarrierWave,但在苦苦挣扎了几个小时后,我决定转向Paperclip。

以下是我发现的CarrierWave存在的问题:

  • 无法验证文件大小。虽然有一篇维基文章介绍如何实现,但并不起作用。
  • 当使用MiniMagick(如果你关心内存使用量,它非常方便)时,完整性验证不起作用。你可以上传一个损坏的图像文件,CarrierWave会首先抛出错误,但下一次则会忽略错误。
  • 无法删除原始文件。你可以将其调整大小、压缩等,有一篇维基文章解释了如何实现,但同样没有效果。
  • CarrierWave依赖于外部库,例如RMagick或MiniMagick。而Paperclip直接使用convert命令行(ImageMagick)。因此,如果你遇到了Minimagick的问题(我有过这种情况),你就需要花费数个小时在Google搜索中寻找答案。截至本文撰写之时,RMagick和MiniMagick都已被抛弃(我联系了Minimagic的作者,但没有得到回复)。
  • CarrierWave需要一些配置文件。尽管这被认为是优势,但我不喜欢项目中存在单个配置文件只为了一个gem。在模型中进行配置对我来说更自然。不过这只是个人口味问题。
  • 如果你发现某些漏洞并报告,开发团队会缺席忙碌。他们会告诉你自己修复漏洞。CarrierWave似乎只是一个在业余时间得到改进的个人项目。对我而言,这并不适用于有截止日期的专业项目。

5
没错,回形针正在回归,而且它可以直接与ImageMagick配合使用,这是一个很大的优点。 - stephenmurdoch
Paperclip也有其缺点,因此请尝试使用它,如果它适合您,请继续使用。它对我也没有用,所以我实现了自己的图像上传库。但是如果我必须选择一个,我会选择Paperclip,因为上面解释的(重要)原因。 - David Morales
9
这些缺点仍然相关吗? - Nick Ginanto
2
首先,Minimagick已经被重新启用。其次,虽然Paperclip直接与ImageMagick配合使用,但它也使得直接与之交互变得非常困难。我刚从使用Paperclip转移到了CarrierWave,因为Paperclip为你做的太多了,当你需要自定义东西时会变得很困难。更不用说Paperclip代码库是“臃肿”的,而CarrierWave则更加精简,这很可能是因为CarrierWave让更多的事情留给你去处理,而Paperclip试图为你做更多的事情。 - rovermicrover
1
我们应用程序的前任开发人员使用CarrierWave处理图像上传。最近,我们决定更改架构以启用一次上传多个图像,因此我们在Mongoid架构中使用了“嵌入式”文档。不幸的是,CarrierWave存在一个三年前的错误,会使上传到嵌入式文档的文件混乱不堪。另一方面,Mongoid的Paperclip表现出色。 - sffc
这是如何在CarrierWave中删除图片的方法:profile.remove_logo! profile.save! - kimerseen

3

我会问自己:

  • 我是否经常需要改变图片的大小? 例如:如果您希望让用户更改其图片尺寸(或者出于其他原因需要灵活性),或者快速开发。

是:Dragonfly

否:Carrierwave 或者 Paperclip


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接