14

我正在构建一个允许一次上传大量照片的应用程序,并且想知道解决这个问题的最佳设置是什么。

这是我目前使用的:

  • Jquery File Upload:允许用户拖放图片
  • CarrierWave:处理图像并使用 ImageMagick 调整它们的大小
  • Amazon S3:CarrierWave 通过 Fog 将图像上传到 Amazon S3
  • Heroku:用于托管

我想让用户能够将大量图像拖放到页面上,然后在后台进行上传时导航到其他页面。我还希望图片在上传完成时出现。我不希望这个过程锁定 Heroku 测功机,所以我可能需要将工作转移到后台工作,但我不确定我的情况该使用什么。

这种类型的应用程序的最佳设置是什么?我应该使用什么后台工作者 gem?Cloudinary 是个好主意吗?

4

2 回答 2

34

我最近构建了一个应用程序,它可以在 Heroku 上接受大量上传。我决定构建自己的解决方案,而不是使用 cloudinary 或等效的。以下是我学到的一些教训:

  • 不要上传到heroku。在整个上传期间,您的整个网络工作者都将被锁定。最多一分钟。不可接受。

  • 使用 javascript 上传器(如 jquery-file-upload)直接上传到 s3。一开始这有点复杂,但一旦你开始工作,它就很棒了。您可以使用s3_direct_upload gem,或者您可以阅读它们的源代码以从头开始制作您自己的解决方案。该宝石基于railscasts pro剧集,您必须付费,但有可用的资源

  • 上传完成后,向您的应用程序发出 ajax 请求,将新的 s3 url 作为远程 url传递。然后,Carrierwave 将像上传一样在 s3 上处理图像,只是只需要几秒钟而不是一分钟。

  • 使用 jquery-file-upload 的客户端图像大小调整。有人会尝试上传一张 5MB 的照片,然后再抱怨上传需要永远。这将使所有上传在理论上尽可能快。

  • 配置 s3 以自动清除您的上传文件夹

  • 不要用薄的。使用独角兽。几秒钟的时间对于处理瘦请求来说太长了,但是拥有三四个工人的独角兽要宽容得多。

  • 不要使用 rmagick。它是用于复杂图像处理的更好的 API,但使用的内存量惊人。请改用 mini_magick。

你会注意到我没有使用后台工作人员来做任何事情。如果您真的感觉很细致,您可以让接收远程 url 的控制器将其工作传递给后台工作人员,如果您立即需要结果,后台工作人员可以通过 pubsub(faye 或 pusher,可能与令人兴奋的新同步宝石)。但这对我的应用程序来说不是必需的,我宁愿把钱花在另一个网络测功机上,而不是工人测功机上。

而且,是的,如果您想让他们在发生这种情况时点击您的整个应用程序,您将需要在弹出窗口中上传(并使用某种 pubsub 解决方案),或者将整个站点构建为 javascript使用余烬或骨干或角度或其他任何东西的应用程序。

任何问题?

于 2013-05-02T14:50:42.920 回答
6

在您提到之前,我从未见过 Cloudinary,但它似乎非常适合您的项目。

首先,它可能会极大地简化您的应用程序。Cloudinary 支持通过其 HTTP API从浏览器直接上传,并且已经有一个基于 jQuery File Upload的jquery 插件,并具有类似的功能,包括客户端预上传处理。

此外,它支持类似于蜻蜓的动态转换(也是一个非常好的库)。

这意味着,除非您真的需要通过您的应用上传这些图像,否则您可以完全绕过它,直接上传到 Cloudify 并通过其转换 API处理图像裁剪和其他转换。

如果需要,您可以从您的应用程序中删除 Carrierwave 和 S3,当然也不需要任何背景测功机来处理图像处理。此外,它可能会更快(直接上传和即时操作与上传到您的应用程序、处理然后上传到云),并且会消除通过您的应用程序上传的带宽。

即使没有直接上传,Cloudinary 似乎也提供了一个 Carrierwave 插件,它仍然可以使用他们的转换 API,从而避免您的应用程序处理图像的需要。

于 2013-04-30T22:18:57.297 回答