无法使用RMagick打开上传的图像文件

时间:2014-01-24 12:20:16

标签: ruby-on-rails ruby-on-rails-4 imagemagick rmagick

在我的Rails应用程序中,我有一个允许用户上传图像的表单。我的应用程序应该使用以下控制器方法调整图像大小。 (对此方法发布,params[:file]包含已上传的ActionDispatch::Http::UploadedFile

 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解码器。我该如何解决这个问题?为什么会这样?

4 个答案:

答案 0 :(得分:3)

您可以在from_blob参数上执行ActionDispatch::Http::UploadedFile(这是文件的来源):

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

答案 1 :(得分:2)

暂时存储文件可以解决问题:

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

也可以检查输入大小。

或者,从blob中解析图像。

答案 2 :(得分:1)

表格可能有问题吗?您可以在此处查阅Rails指南:

Rails Guides: Uploading Files

我认为您的表单声明中可能遗漏了multipart: true。 另外,我强烈建议使用Carrierwave来处理文件上传。在几件事情中,它将帮助您组织文件转换(将逻辑放出控制器)。这是一个关于它的railscast:

RailsCasts: CarrierWave File Uploads

祝你好运!

答案 3 :(得分:0)

使用@joost的答案(或类似方法)确实有助于指出我正确的方向,但它没有使用相同的临时文件进行第二次尝试 - 我的用例是从中创建多个图像类型临时文件源。这就是我所使用的,包装在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