2012-03-29 76 views
19

我需要將文件從一個載波對象複製到另一個載波對象。他們是不同的表格和不同類型的上傳者。將carrierwave文件從一個記錄複製到另一個記錄的正確方法是什麼?

我開始:

user.avatar = image.content 

(其中用戶和圖像是模型實例,化身和內容的carrierwave安裝上傳),其有時工作。它似乎一直在本地工作,具有文件存儲功能,但在使用霧和s3時會間歇性地運行。

mailing list post我發現這個代碼:

user.avatar = image.content.file 

一遍,有時工作。

我工作的解決方案迄今:

require "open-uri" 

begin 
    user.avatar = open(image.url) 
rescue Errno::ENOENT => e 
    begin 
    user.avatar = open(image.path) 
    rescue Errno::ENOENT => e 
    # Ok, whatever. 
    end 
end 

這不僅難看,但未能通過擴展驗證,因爲遠程打開文件不維護擴展名(JPG,PNG等)。

回答

12

也許您可以採取的一種方法是按照the Carrierwave gem documentation設置遠程圖像URL?

user.remote_avatar_url = image.url 
+0

你是否image image.content.url?我不確定這會起作用,因爲頭像有很多不同的進程需要本地文件才能工作,而且我不希望這兩個記錄都指向同一個文件,我想要一份文件。 – Pablo 2012-03-30 09:44:08

+1

remote_blah_url的工作方式是從本質上「下載」該文件並重新處理該文件。例如,請參閱http://stackoverflow.com/questions/5007575/how-to-assign-a-remote-file-to-carrierwave。 – Ibrahim 2012-11-19 07:52:06

+3

如果圖像未通過HTTP提供,則無法使用。你會得到以下錯誤:'試圖下載一個文件,而不是通過HTTP提供'' – Pioz 2013-07-24 21:32:25

5

從這裏討論我創建簡單CopyCarrierwaveFile寶石要做到這一點

使用的解決方案是這樣的:

original_resource = User.last 
new_resource  = User.new 

CopyCarrierwaveFile::CopyFileService.new(original_resource, new_resource, :avatar).set_file  

new_resource.save 
nev_resource.avatar.url # https://...image.jpg 
0

這裏有一個(雖然哈克)解決方案,不需要的HTTP請求獲取圖像:

module UploadCopier 
    def self.copy(old, new) 
    new.instance_variable_set('@_mounters', nil) 

    old.class.uploaders.each do |column, uploader| 
     new.send("#{column}=", old.send(column)) 
    end 
    end 
end 

old_user = User.last 
new_user = User.new 
UploadCopier.copy(old_user, new_user) 
new_user.save 
0

我只是想複製一個化身參考從一個對象到另一個,而且什麼工作對我來說是:

objectB.avatar.retrieve_from_store!(objectA.avatar.identifier) 
objectB.save 
1

我需要一個參考從一個模式複製到另一個模式,我能成功通過執行以下操作可以這樣做:

my_new_model.update_column('attachment', my_other_model.attributes["attachment"]); 

在這種情況下,我並不在意實際製作文件的副本,也不關心現在已將2條記錄鏈接到同一文件(我的系統從未在上載後刪除或修改文件)。

這對於任何想使用相同上傳器將引用從一個模型複製到另一個模型的人都是有用的。

+0

對我而言並不適用。 https://stackoverflow.com/questions/45901396/carrierwave-sharing-an-image-between-two-models – Dercni 2017-08-27 03:21:13

+1

@Dercni做了一個很好的提示 - 只有當'attachment'字段沒有其他字段用於確定文件的位置。 – PressingOnAlways 2017-08-27 19:27:10

+0

好吧,經過幾個小時的遠程URL苦苦掙扎後,我決定使用你的解決方案,併爲這兩種模式建立一個共同的路徑,並簡單地共享文件,如你所示。 – Dercni 2017-08-28 06:28:16

相關問題