我使用以下文件名結構上傳了成千上萬的圖像。carrierwave recreate_version使用與原始保存的文件名不同的文件名創建大拇指
def filename
"#{model.id}" + "-v#{timestamp}" + "-" + Category.find("#{model.category_id}").slug + "-" + CategoryItem.find("#{model.category_item_id}").slug + ".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
我需要創建所有圖像的縮略圖以加快某些頁面加載時間。我設置的上傳拇指版本文件
# Create different versions of your uploaded files:
version :thumb do
process :resize_to_limit => [110, nil]
end
,但現在當我運行:CategoryItem.each {|item| item.image_value.recreate_versions! if item.image_value? }
創建拇指,但拇指圖像的文件名是不一樣的,與原來的文件超出了文件名開始處添加的'thumb_'。
saved filename: 1-v1474175808-shoes-runners.png
thumb filename: thumb_1-v1472111618-shoes-runners.png (different timestamp)
CategoryItem.find(1).image_value_url(:thumb): thumb_1-v1474175808-shoes-runners.png (original filename timestamp)
所以調用image_tag CategoryItem.find(1).image_value_url(:thumb)
尋找一個不存在的文件。
我該如何運行recreate_versions
並且讓拇指文件名與原始保存的文件名相同,但在不移除時間戳的情況下將「thumb_」添加到前面?
更新:
我現在從找到這個https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names
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
我的問題下面是,即使我打電話直接文件名File.basename(model.image_value.path).to_s
,當我運行recreate_versions
它仍然保存帶有當前時間戳的文件而不是抓取原始文件名。我想可能文件名在數據庫中發生了變化,它抓住了新的文件名,但它與預期保持一致,所以我不知道爲什麼它沒有從數據庫中獲取直接值,也沒有在名稱中創建隨機時間戳。
而且我雖然也許def full_filename(for_file = model.image_value.file)
心不是工作,但如果我將其更改爲
version :thumb do
process :resize_to_limit => [110, nil]
def full_filename(for_file = model.image_value.file)
'thumb_' + "random-text"
end
end
所以它運行通過代碼
它仍然會保存當前時間戳而不是原始圖像的文件名。我累了''thumb_'+ model.image_value.to_s',但它使用整個網址 – Rob
你能澄清爲什麼你在文件名中包含時間戳嗎? –
時間戳方法直接來自carrierwave文檔。我從閱讀http://stackoverflow.com/questions/5132847/displaying-a-carrierwave-filename-in-the-view添加了'thumb_'+ File.basename(model.image_value.path).to_s'。 'File.basename(model.image_value.path).to_s'獲取保存在數據庫中的確切文件名,但它仍然給它保存文件名中的當前時間戳,並且不直接從數據庫中拷貝文件名。 – Rob