【问题标题】:Can't open uploaded image file with RMagick无法使用 RMagick 打开上传的图像文件
【发布时间】:2014-01-24 12:20:16
【问题描述】:

在我的 Rails 应用程序中,我有一个允许用户上传图片的表单。我的应用程序应该使用以下控制器方法调整图像大小。 (POST到这个方法,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 解码器。我该如何解决这个问题以及为什么会发生这种情况?

【问题讨论】:

  • 您确定这是params[:file] 中的内容吗?我只对实际上传的文件进行过操作,例如模型属性。
  • 而且我相信您需要更新问题标题:将Can 更改为Can't ;)
  • 糟糕!调试器说类型是#<:http::uploadedfile:0xb8d46cb0>,内容类型为image/png。同样的代码对你有用吗?

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


【解决方案1】:

您可以在ActionDispatch::Http::UploadedFile 参数上执行from_blob(这是文件的输入方式):

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

【讨论】:

    【解决方案2】:

    暂时保存文件即可解决问题:

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

    检查输入大小可能也是明智之举。

    或者,从 blob 中解析图像。

    【讨论】:

    • 我认为这个答案比joost的答案还要好,应该被接受1+
    【解决方案3】:

    使用@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
    

    【讨论】:

      【解决方案4】:

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

      Rails Guides: Uploading Files

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

      RailsCasts: CarrierWave File Uploads

      祝你好运!

      【讨论】:

      • 表格很好...我可以将图像存储到磁盘等,RMagick 只是无法处理临时文件!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2013-03-25
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多