2014-01-24 48 views
1

在我的Rails應用程序中,我有一個允許用戶上載圖像的表單。我的應用程序應該使用以下控制器方法調整圖像大小。 (POST這種方法,params[:file]包含已上傳的ActionDispatch::Http::UploadedFile無法使用RMagick打開上傳的圖像文件

def resize_and_store 
    file = params[:file] 

    # resize image 
    Magick::Image.read(file.tempfile).first 
    newimg = image.resize(100,100) 

    #etc... Store newimg 
    end 

我收到以下錯誤,在這行Image.read

Magick::ImageMagickError (no decode delegate for this image format `0xb9f6052c>' @ error/constitute.c/ReadImage/544): 

測試此與上傳的PNG文件時,它似乎RMagick並沒有拿起該臨時文件是PNG文件。上面的代碼確實工作,如果我讀本地存儲的PNG文件,所以它不能是我錯過了PNG解碼器。解決這個問題,爲什麼會發生這種情況?

+0

你確定這是'params [:file]'裏面的內容嗎?我只對實際上傳的文件進行過操作,例如模型屬性。 –

+1

我相信你需要更新問題標題:將'Can'改爲'Can't';) – marvelousNinja

+0

糟糕!調試器說這個類型是#,它帶有一個'image/png'內容類型。這個相同的代碼對你有用嗎? – Maarten

回答

2

您可以在ActionDispatch::Http::UploadedFile PARAM做from_blob(這是一個文件怎麼進來):

images = Magick::Image.from_blob(params[:file].read) 
1

表格可能有問題嗎?您可以使用Rails指南這裏諮詢:

Rails Guides: Uploading Files

我認爲你可能有multipart: true在窗體聲明中缺少。 另外,我強烈建議使用Carrierwave來處理文件上傳。在幾件事情中,它將幫助您組織文件轉換(將邏輯放在控制器之外)。這裏有一個關於它的railscast:

RailsCasts: CarrierWave File Uploads

祝你好運!

+0

表單很好...我可以將圖像存儲到磁盤等,RMagick無法處理臨時文件! – Maarten

2

臨時存儲文件將解決這個問題:

open('temp.png', 'wb') do |file| 
    file << uploaded.tempfile.read 
end 
images=Magick::Image.read('temp.png') 

可能是明智的檢查輸入大小爲好。

或者,從blob解析圖像。

+0

我覺得這個答案比joost的答案還要好,應該接受1+ –

0

使用@joost(或類似的方法)的答案真的幫了點我在正確的方向,但它沒有在第二次嘗試時使用相同的臨時文件 - 我的用例是從tempfile源創建多個圖像類型。這是我用過的,封裝在File.open塊中,所以我們不泄漏文件描述符:

File.open(tempfile, "rb") do |f| 
    img = Magick::Image::from_blob(f.read).first 
    resized = img.resize_to_fit(w, h) 
    resized.write(dest) 
    resized.destroy! 
    img.destroy! 
end