2016-09-19 27 views
9

我正在爲已在應用上上傳的文件創建縮略圖。圖像名稱中包含時間戳代碼。當我運行recreate_versions時,生成的縮略圖也有時間戳,但它使用當前時間戳,這使得縮略圖名稱與原始文件名不同。Carreirwave - 如何從保存的文件名直接創建版本名稱

所以我覺得一個解決辦法是有一個自定義文件名的拇指圖像。基本上有'thumb_'+'原始文件名'。

version :thumb do 
    process :resize_to_limit => [110, nil] 

    def full_filename(for_file = model.image_value.file) 
    'thumb_' + File.basename(model.image_value.path).to_s 
    end 
    end 

    def filename(for_file = model.image_value.file) 
    "#{model.id}" + "-v#{timestamp}" + "-" + "#{model.name}" + ".png" if original_filename.present? 
    end 

    def timestamp 
    var = :"@#{mounted_as}_timestamp" 
    model.instance_variable_get(var) or model.instance_variable_set(var, Time.now.to_i) 
    end 

這似乎是一個簡單的辦法,但由於某種原因,當我運行recreate_versions拇指圖像與它當前的時間戳,而不是在原來的文件名的名稱時間戳產生。根據我的理解,它應該獲取存儲在數據庫中的原始文件名的值,並將其添加到'thumb_'的末尾。但不知怎的,它改變了名稱中的時間戳。

stored filename      =  1-v1474175808-model-name.png 
Item.find(1).image_value_url(:thumb) = thumb_1-v1474175808-model-name.png #this works correctly and looks for the correct filename 
thumb filename saved     = thumb_1-v1472111618-model-name.png #thumb saved is different. For some reason has a different timestamp in name 

我想,也許def full_filename心不是運行的,但是如果我將其更改爲別的東西保存拇指的文件名更改爲的是在def full_filename

不知道這裏發生了什麼。希望有人可以提供幫助。如果它看起來應該工作,請讓我知道,至少這將澄清,這可能是我沒有看的東西。

回答

1

最後不得不使用生成的URL,並在URL中使用slice!只留下映像名稱。

version :thumb do 
    process :resize_to_limit => [110, nil] 

    def full_filename(for_file = model.image_value.file) 
     raw_file_name = model.image_value.slice!(0..65) 
    'thumb_' + raw_file_name 
    end 

    end 
0

我不明白你爲什麼使用instance_variable_getset。爲什麼不使用Itemcreated_at?那麼它永遠不會改變。

def timestamp  
    model.created_at 
end 
+0

因爲名稱需要更改並且在更新圖像時爲uniq。 – Rob

+0

所以你需要所有的版本有一個新的,獨特的名字? – Benjamin

+0

否這些版本只需要與原始文件具有相同的名稱,但在其名稱的前面添加了「thumb_」。 – Rob

相關問題