2014-01-24 2 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

Вы можете сделать from_blob на ActionDispatch::Http::UploadedFile парам (это как файл приходит):

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

Возможно, что-то не так с формой? Вы можете проконсультироваться с направляющими рельсами здесь:

Rails Guides: Uploading Files

Я думаю, что вы можете иметь multipart: true отсутствует в вашей форме декларации. Кроме того, я бы настоятельно рекомендовал использовать Carrierwave для обработки загрузок файлов. Среди нескольких вещей это поможет вам организовать преобразования файлов (вывести логику из контроллеров). Вот об этом говорилось:

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') 

Возможно целесообразно проверить размер входа, а также.

В качестве альтернативы разобрать изображение из блоба.

+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 
Смежные вопросы