2012-08-01 81 views
9

我的網站中的用戶可以上傳自己的照片作爲模型或從圖書館中選擇。當用戶從庫中選擇我將文件名作爲字符串發送到服務器{file: {url: 'url.jpg'}}。我還沒有找到一種方法,在這種方式中,carrierwave可以在不上傳模型文件的情況下更新模型文件。我可以在我的模型中寫入一個條件來檢查該參數的存在,然後model.file = File.open('str.jpg')。從安全角度來看,這是不是很糟糕?如何「上傳」文件或只更新文件屬性,以引用服務器上已有的文件?Carrierwave - 從字符串「上傳」文件

謝謝!

回答

4

你使用File.open會工作的解決方案,但你應該驗證名稱是File.basename有效,以便有人能不能通過../../secret_credentials.yml和暴露你不希望他們的信息。同時檢查它與預設圖像列表將是一個好主意。

但是,在這種情況下,您可以通過跳過CarrierWave更高效地完成此操作。

添加一個新字段,名爲library_image,當有人想要使用預設圖像時,則您設置library_image,如果他們想使用自己的照片,請取消設置library_image並正常上傳照片。然後添加一個輔助方法,如:

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

這是假設你可以在http://example.com/images/[name]找到預設的圖像,並且使用mount_uploader在CarrierWave命名picture

現在任何時候你想要顯示他們的圖片,你會打電話avatar_url,這將檢查它是否應該返回預設的URL,或他們上傳的圖片。

你將如何更新library_imagepicture一個例子根據你原來的問題:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

我如何可以檢測到用戶上傳新的圖片?我的意思是,我應該寫入什麼回調函數名稱來重置library_image?謝謝! – CamelCamelCamel 2012-08-08 06:08:09

+0

@CamelCamelCamel我用一個例子更新了我的原始答案。 – 2012-08-08 18:46:37

+0

如何根據avatar_url將文件作爲預設或文件返回? – CamelCamelCamel 2012-08-13 03:57:21

3

我會做另一個名爲LibraryImages資源這些圖像文件。

這些將與使用has_many關聯的User類關聯。當用戶想要使用自己的圖像而不是預先定義的圖像時,第二種方法是單獨進行。

因此,我會建議添加一個名爲'use_library'的布爾類型,一旦他們選擇使用自己的圖像,它將上傳到user.image沒有任何問題。

現在

在你看來只是問,如果use_library返回true,如果是使用image_tag(user.library_image)