gpt4 book ai didi

ruby-on-rails - 如何将 CarrierWave Direct 与嵌入式 Mongodb 文档和遗留 Carrierwave 文件一起使用

转载 作者:行者123 更新时间:2023-12-04 06:19:15 27 4
gpt4 key购买 nike

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

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

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

解决方案:实现载波直接并将处理移至后台

拦截器:CarrierWaveDirect 并不是 CarrierWave 的替代品。事实上,它在上传图片的过程中引入了一些重大变化,特别是图片不在数据库记录持久化的同时上传。此外,它不适用于我现有的目录结构,因此将我现有的文件移动到新结构似乎过于费力。 CarrierWaveBackgrounder 不能很好地处理嵌入式文档。

问题:我该怎么做?示例代码(如果需要),但不仅仅是编写代码,还应深入思考。

最佳答案

如果您需要处理单个文件,请查看此 Railscast其中深入介绍了 CarrierWaveDirect 和上传到 S3。结合carrierwave-mongoid gem,如果你想走那条路,你应该能够运行单个文件上传。

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

Ryan 的设置起初看起来很吓人,但它非常简单,而且在 source code 中对于这一集,他包括一个帮助程序类,该类负责处理搞笑业务 S3 所需的所有表单数据。

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

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

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

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

我认为他使用 sidekiq对于后台作业,但我有类似的设置 IronWorker而且效果很好。设置好 jQuery 和 CarrierWave 之后,您就可以真正地使用任何您想要的东西来完成工作。

此外,在评论中我解释了我如何负责从临时存储桶中删除原始上传文件作为工作的一部分以保持整洁。有关如何直接 POST 到 S3 的所有详细信息,请参阅 here .理解这一点仍然是个好主意,即使您有辅助类。

关于ruby-on-rails - 如何将 CarrierWave Direct 与嵌入式 Mongodb 文档和遗留 Carrierwave 文件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com