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 的官方维基页面可能对您有用。
我有一个 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 的官方维基页面可能对您有用。