2017-10-20 191 views
1

我有一个ImageUploader,我想上传一个图像到S3。 另外,我想用filename方法更改文件名。 下面是代码:Carrierwave文件名方法创建问题当上传文件到s3

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 

第一次当我保存的图像,它得到正确的文件名,e.g 1_23434.png但是当我从控制台获取的模型对象,它返回一个不同形象的名字。

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

+0

为什么在'filename'方法中使用'original_filename'条件? –

+0

正在返回什么文件名? –

回答

0

问题出在filename方法中。在每次通话中,它都会返回一个不同的值。这是因为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可能对您有用。