具有载波的相同型号的动态商店目录

Dynamic store dirs for same models with carrierwave

我正在使用带有雾的 CarrierWave 将我的图像上传到 S3。

我有模型图像,可以表示不同尺寸的图像,并根据需要保存在不同的文件夹中。

例如,对于 image.jpg,我可能有两个不同的上传版本需要另存为:

'images/large/image.jpg'
'images/small/image.jpg'

可能有任意数量的用例,使用 minimagick 的版本无法涵盖所有​​情况。

到目前为止我还没有找到解决办法。有人知道怎么做吗?

为了更改上传文件的放置位置,只需覆盖 store_dir 方法:,对于您的情况 (reference link)

class Image < CarrierWave::Uploader::Base
storage :file
  # this if you using use condition for folder location
  def store_dir
    if model.somefield == "somecondition
       "uploads/#{model.somefield}"
    elsif model.somefield == "somecondition
       "uploads/location2"
    else
       "uploads/default_dir"
    end

  end
  # this is if you want to use version_name
  def store_dir
    'images/#{version_name}/'
  end
end

我已经看到这个问题被问过几次了,所以我会写下我的最终解决方案。

我没有在模型上定义 mount_uploader,而是决定单独使用 Uploader,稍后将 url 保存到记录中。

动态改变store_dir和文件名可以这样实现

uploader = Uploader.new

uploader.define_singleton_method(:store_dir) do
    'new_store_dir'
end
uploader.define_singleton_method(:filename) do
    'new_filename'
end

uploader.store!(image)

使用这种方法,您还可以使用局部变量或控制器中可用的任何名称来定义名称。

希望它对其他人也有帮助。