2016-08-15 52 views
3

當圖像使用carrierwave更新,我把它設置爲使用模型身份證和原文件名如何更新文件(在軌)

def filename 
"#{model.id}-#{original_filename}" if original_filename.present? 
end 

其唯一的這樣的時候保持相同的文件名中carrierwave因爲它是我在建立載波時發現的默認方式。最近我意識到,如果您更新圖像,圖像的鏈接已損壞,因爲文件名已更新爲使用較新的文件名。因此,如果頁面鏈接到舊圖像,則不會使用較新的圖像進行更新,反而會變成破碎的圖像鏈接。

我希望它保留舊的文件名時,圖像被更新,但無法找到如何在文檔中,並從編輯

周圍的Googling

我diddnt增添了不少這樣做這個'用例'是因爲我並不認爲這個問題很複雜。

基本上在網站上有itemsimages分配給他們。我確實看到了關於不僅僅使用model.id的評論,並且@struthersneil清除了爲什麼該評論在那裏。考慮到images項目的記錄是在創建項目時創建的,因此在添加圖像時(因爲它只是更新已存在的記錄),它們永遠不會是新的。正因爲如此,我會說我最好的選擇是使用model.id作爲文件名。

我的其他選擇是保留舊圖像,以便鏈接不被破壞。使用它的主要問題是用戶在網站上創建帖子並鏈接到帖子中的這些圖像(帖子定期更新,所以我不能在帖子和帖子中的圖像上緩存一次)。圖像將根據與其關聯的項目的新信息進行更新。一旦發生這種情況,文章中鏈接的圖像將顯示過時的信息,並且每次都必須手動更新到新圖像。因此,圖像鏈接與正在更新的圖像保持一致是這種情況下的最佳選擇。特定情況

+0

你看到這個答案:http://stackoverflow.com/a/23622057/664675?聽起來完全像你的同一個問題。 – rii

+0

@rii這是一個單獨的問題,人從沒有'如果original_filename.present?' – Rob

+0

我在過去幾年做了很多Carrierwave /霧的東西,所以我會盡力爲你回答這個問題,但您是否考慮過保留舊文件,以便舊鏈接繼續運行,然後在達到特定年齡後清理它們?基本上,這些「舊鏈接」在人們瀏覽器的緩存頁面上?如果沒有,他們是否在某處硬編碼(爲什麼不每次都從模型中獲取最新的文件名?) (我不想成爲那個用'呃,你做錯了'來回答的人,但更多信息可能有助於從另一個角度解決這個問題) – struthersneil

回答

4

original_filename在此上下文中是剛上傳的文件的名稱。這是該文件的原始名稱

通過這樣做:

"#{model.id}-#{original_filename}" if original_filename.present? 

你告訴CarrierWave使用的文件的每一次新的名稱。這聽起來像你想要一個給定的模型每次使用相同的文件名。所以顯而易見的選擇是簡單地扔掉original_filename,並使用模型ID本身。

然而,上述自動生成的代碼上傳的filename方法的評論這樣說:

# Avoid using model.id or version_name here, see uploader/store.rb for details. 

這使我們這個...

# Be careful using record ids as filenames. If the filename is stored in the database 
    # the record id will be nil when the filename is set. Don't use record ids unless you 
    # understand this limitation. 

種一個順利。除非你能保證你的模型總是有一個id(如果它是新的,那麼它不會是真的),那麼你不應該使用model.id來命名你的文件。

我建議你爲初始化的每個模型生成一個唯一的file_identifier字符串(只要file_identifier尚未設置),並且只使用這個唯一字符串作爲文件名,例如。

class Something < ActiveRecord::Base 
    mount_uploader :image, SomeImageUploader 

    after_initialize do 
    unless self.file_identifier 
     self.file_identifier = SecureRandom.hex(32) 
    end 
    end 
end 

...在你上傳類...

def filename 
    model.file_identifier if original_filename 
end 

現在您上傳的圖片將始終覆蓋相同的文件。但請注意:您剛剛失去了圖像擴展。這在我現代版本的Firefox中似乎很好(它可以通過查看圖像標題來猜測),但它可能不是最廣泛兼容的解決方案。您可以將original_filename的擴展名添加到那裏,但現在如果有人上傳PNG然後上傳JPG(結果將是兩個不同的文件),現在又回到了原來的問題。

您可以在上傳時轉換爲您選擇的固定格式,然後文件名+擴展名將始終保持不變。

老實說,我認爲如果您接受文件在每次上傳後都會得到一個新名稱,並且將舊文件掛起一段時間以繼續支持擁有舊鏈接的用戶。 (這些鏈接到底有多大年紀?如果它位於緩存中,那麼爲什麼只緩存生成的HTML而不緩存圖像?)如果您打算在您的應用程序和您的應用程序之間使用CDN服務,尤其如此用戶。通常的模式是每次使用新的唯一文件名對文件進行版本化,CDN將永遠緩存一次。

+1

感謝您的好評,它爲我解決了一些問題。我使用更多信息編輯了我的帖子。如果你認爲我應該做一些不同的事情,我已經給你了額外的信息讓我知道。 – Rob