所以我有 9000 多张原始图像,每张都有 5-7 个生成的大小,已经存储在 S3 上。将生产转移到 Heroku,我们遇到的问题之一是大型主图像超时。
开始尝试 Carrierwave Direct gem 直接进入 S3 存储,然后处理异步,但是一旦我将第三个包含行添加到基本上传器,就会遇到现有图像消失的问题:
class BaseUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
include CarrierWave::ImageOptimizer
include CarrierWaveDirect::Uploader
...
end
CarrierwaveDirect 更改文件名格式(方法如下:https ://github.com/dwilkie/carrierwave_direct/blob/29caaa8d399968258299b57c84eac2e5e6fc4cf7/lib/carrierwave_direct/uploader.rb#L153 )
文件名以这种方式更改:
原始载波发生器:
https://images.patchvault.org/uploads/issue/imageback/629/full_003b_a1_back.png
CW 直接网址生成:
https://images.patchvault.org/uploads/issue/imageback/629/003b_a1_back_full.png
因此版本名称从上传文件名的开头移动到结尾。这实际上是有道理的,但我正在处理 2 年和 9k 图像:)
当我启用它include CarrierWaveDirect::Uploader
时,BaseUploader
它会更改在视图中生成 url 的方式,因此所有图像 404(因为它们不再存在)
- 这里的最佳做法是什么?我正在保存到 Fog,但由于它正在上传到 Heroku
/tmp
,我是否应该将处理移至异步? - 我可以通过覆盖该方法来恢复行为还是不行?
- 有没有办法轻松地将 S3 上的图像文件名重写为新格式,还是不行?
对我也没有考虑的其他解决方案持开放态度:)
路径生成于base_uploader.rb
:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
Rails 5.2.1、Ruby 2.5.2、Heroku-18 标准 2x dyno (web) 1x dyno (worker)。images.patchvault.org
是 S3 存储桶上云端 CDN 发行版的 CNAME。