在我的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解码器。我该如何解决这个问题?为什么会这样?
答案 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指南:
我认为您的表单声明中可能遗漏了multipart: true
。
另外,我强烈建议使用Carrierwave来处理文件上传。在几件事情中,它将帮助您组织文件转换(将逻辑放出控制器)。这是一个关于它的railscast:
答案 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