2017-10-20 193 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可能對您有用。