2012-11-08 36 views
0

我們正在使用CarrierWave在我正在處理的項目中進行文件上傳。新要求提出了需要上傳DICOM文件的需求。 DICOM文件除了包含大量其他數據外,還包含一個圖像(或多個圖像)。使用Ruby DICOM寶石,我可以輕鬆地從文件中提取圖像。我嘗試使用CarrierWave上傳它們時出現問題。Carrierwave:從上傳的文件中提取圖像並丟棄原始文件

我希望能夠從上傳的文件中提取JPEG,並存儲該文件而不是原始DICOM文件。我試圖創建上傳的文件這樣的0​​:

version :jpeg, :if => :is_dicom? do 
    process :create_jpeg 
end 

def is_dicom?(file) 
    IO.binread(file.to_file, 4, OFFSET) == 'DICM' 
end 

def create_jpeg 
    Rails.logger.debug "self is class #{self.class}" 
    dcm = DICOM::DObject.read(file.path) 
    image = dcm.image.normalize 
end 

我根據我的create_jpeg方法了另一個create_thumbnail方法,我發現它,沒有它的異常處理,將減少到:

def create_thumbnail(width, height, gravity = 'Center') 
    self.resize_to_fill(width, height, gravity) 
end 

我可以在調試控制檯中看到DICOM正在成功讀取,但它實際上並不保存將被提取的JPEG。相反,我得到了我原來的DICOM,並在文件名前加了一個'jpeg'的副本。我怎麼能告訴CarrierWave我想存儲這個JPEG我提取的,而不是存儲我處理的原始文件?

回答

0

就我所知道的版本而言,創建一個不同版本的文件以便稍後恢復。爲了防止這種情況,您必須使用JPEG覆蓋文件。

如何在模型中創建虛擬屬性image_dicom,提取JPEG,然後將其分配給image連接的上傳器?現在上傳具有image_dicom屬性名稱的文件可以被解析,但不會被存儲在數據庫中。

你必須解析上傳的文件,這是Carrierwave自動執行的,但我認爲這不是一個大問題。不知道這是如何表示內部,我知道這不是一個普通的File對象,但不應該很難檢測並提取原始數據和JPEG。

編輯:顯然,如果您需要解析DICOM文件和常規圖像,這會變得更復雜一些,因爲您必須檢測文件類型並採取相應措施。

0

除了手動提取之外,您也可以在不使用版本的情況下使用該處理器,據我所知。

通過這種方式,您可以在不創建版本的情況下上傳文件本身。我從來沒有這樣做,但它似乎是因爲只是做簡單:

process :create_jpeg, :if => :is_dicom? 

def is_dicom?(file) 
    IO.binread(file.to_file, 4, OFFSET) == 'DICM' 
end 

def create_jpeg(image) 
    directory = File.dirname(current_path) 

    # not quite thread safe, generate something unique here 
    tmpfile = File.join(directory, "tmpfile") 

    FileUtils.mv(current_path, tmpfile) 

    dcm = DICOM::DObject.read(tmpfile) 
    image = dcm.image.normalize.write(current_path) 

    FileUtils.rm(tmpfile) 
end 

# replace the extension with jpg 
def filename 
    super.chomp(File.extname(super)) + '.jpg' 
end 

複製和改編自:http://www.freezzo.com/2010/12/23/create-ffmpeg-processor-for-carrierwave-in-rails-3/和Carrierwave文檔。

+0

感謝您的迴應卡米爾。看起來像我可以像上傳文件一樣上傳文件,但我不知道如何告訴CarrierWave存儲我從DICOM創建的JPEG文件。任何想法,如果可以做到? – Zajn

+0

據我所知你只需要用JPEG替換文件(在CW中,或者甚至在磁盤上?)。您可能必須重寫一些默認設置,例如更改文件名以匹配jpeg擴展名。它實際上只是在文件上傳時執行過程中指定的功能。 –

+0

用更多代碼更新了答案,但未經測試! –