2012-10-28 73 views
5

我正在使用載波,導軌和亞馬遜s3。每次我保存的圖像,圖像中的S3顯示了,我可以用名字像這樣看到它在管理控制檯:amazon s3和carrierwave隨機圖像名稱桶中的數據庫不匹配

https://s3.amazonaws.com/bucket-name/ uploads/images/10/888fdcfdd6f0eeea_1351389576.png

但在模型中,這個名字是這樣的:

https://bucket-name.s3.amazonaws.com/ uploads/images/10/b3ca26c2baa3b857_1351389576.png

首先,爲什麼隨機名稱不同?我生成它上傳像這樣:

def filename 
    if original_filename 
    "#{SecureRandom::hex(8)}_#{Time.now.to_i}#{File.extname(original_filename).downcase}" 
    end 
end 

我知道這是不是產生一個隨機字符串,每次調用,因爲在模型中的錯誤的URL是一致的,並保存。在圖像名稱保存併發送到亞馬遜S3的過程中,在該過程中的某個地方必須生成一個新模型以保存在模型中。奇怪。

另外,我可以讓url匹配s3/bucket而不是bucket.s3而不使用正則表達式嗎?在carrierwave中有沒有一個選項或者是什麼?

回答

2

我解決了它通過保存文件名,如果它仍然是原始文件名。在上傳,放:

def filename 
    if original_filename && original_filename == @filename 
    @filename = "#{any_string}#{File.extname(original_filename).downcase}" 
    else 
    @filename 
    end 
end 

的sumbdomain與路徑的問題實際上不是一個問題。它適用於子域。即https://s3.amazonaws.com/bucket-name/https://bucket-name.s3.amazonaws.com/都可以正常工作。

3

CarrierWave默認情況下不存儲URL。相反,它會在您每次需要時生成它。

因此,每次調用filename時,都會返回不同的值,因爲Time.now.to_i

改爲使用created_at列,或者添加一個新列來存儲隨機ID或完整文件名。

+0

我很欣賞它沒有保存的提示。我只需要保存它 – AJcodez