3

我正在寻找在 Heroku 上的 Rails 应用程序中上传文件的最佳方法。设置:Rails 3、Carrierwave、Heroku、Mongoid

问题:偶尔,当用户上传不同大小的文件时,图像会保存到数据库中,但在 Amazon S3 上无法以任何形式使用。这会导致图像在前端显示为丢失的图像占位符。

可能原因:图片已上传,但处理时间过长,由于Heroku的30秒硬请求时间限制导致请求超时,或者图像太大,尝试上传时,请求超时并出现H12错误。

解决方案:实施carrierwave-direct并将处理移至后台

拦截器:CarrierWaveDirect 不是 CarrierWave 的替代品。事实上,它在上传图片的过程中引入了一些重大的变化,特别是在db记录持久化的同时,不上传图片。此外,它不适用于我现有的目录结构,因此将现有文件移动到新结构似乎过于艰巨。CarrierWaveBackgrounder 不适合嵌入文档。

问题:我该怎么做?示例代码(如果需要),但尝试思考这个不仅仅是编码它。

4

1 回答 1

6

如果您需要处理单个文件,请查看涵盖 CarrierWaveDirect 并深入上传到 S3 的Railscast 。结合carrierwave-mongoid gem,如果你想走这条路,你应该能够运行单个文件上传。

不过老实说,我只是去上传多个文件并完成它。在第二部分中,他展示了使用标准 Carrierwave 和jQuery File Upload而不是 CarrierWaveDirect的多文件上传设置。我倾向于同意这个决定。我只是无法让它正常工作,很可能是因为直接发布到 S3 所需的所有黑魔法。

Ryan 的设置一开始看起来很吓人,但它非常简单,在这一集的源代码中,他包含一个帮助类,该类负责处理 S3 所需的所有表单数据。

基本的工作流程是这样的:

1)文件通过jQuery插件直接从浏览器上传到S3上的临时存储桶或文件夹。

2) 带有临时上传 URL 的 AJAX POST 请求发送到应用程序,告诉它持久保存在数据库中并启动一个工作进程。

3) 工作进程下载临时文件,通过您的 CarrierWave 设置运行它并将完成的版本存储在正确的位置。

我认为他将sidekiq用于后台工作,但我用IronWorker设置了类似的东西,并且效果很好。一旦你有 jQuery 的东西和 CarrierWave 设置,你可以使用任何你想要的工作。

此外,在评论中,我解释了我如何从临时存储桶中删除原始上传文件,作为工作的一部分以保持整洁。有关如何直接发布到 S3 的所有肮脏细节,请参见此处。即使你有助手类,理解这一点仍然是一个好主意。

于 2012-10-04T08:13:09.887 回答