Carrierwave 文件名方法在将文件上传到 s3 时产生问题

Carrierwave filename method creating issue when uploading file to s3

我有一个 ImageUploader,我想将图像上传到 S3。 另外,我想使用 filename 方法更改文件名。 这是代码:

class ImageUploader < CarrierWave::Uploader::Base
  storage :fog

  def store_dir
    "images"
  end

  def filename
    "#{model.id}_#{SecureRandom.urlsafe_base64(5)}.#{file.extension}" if original_filename
  end
end

我第一次保存图像时,它获得了正确的文件名,例如 1_23434.png 但是当我从控制台获得模型对象时,它 returns 了一个不同的图像名称。

这里有人可以帮助我吗?当我不使用雾时它工作正常。

问题出在filename方法中。在每次调用时,它 returns 一个不同的值。这是因为 SecureRandom.urlsafe_base64(5) 生成了一个随机字符串(并且未缓存)。 filename 也被 CarrierWave 在幕后用于构建与路径相关的字符串。这就是为什么当您从控制台 运行 object.image.filename 时得到不同的图像名称。

您正在寻找的方法是 image_identifier(其中 image 前缀是您的上传器安装的名称)。

您可以尝试类似的方法:

object.public_send("#{object.image.mounted_as}_identifier") || generate_unique_name

其中 generate_unique_name 是您当前的 filename 实施。另一种方法是将哈希存储在模型本身中以备将来使用。

此外,关于 creating random and unique filenames 的官方维基页面可能对您有用。