получить имя файла и тип содержимого из ruby-кодированного изображения base64 на рельсах - PullRequest
6 голосов
/ 05 августа 2011

Я пытаюсь получить тип содержимого и имя файла изображения, которое я получаю в формате base64.

вот код, выполняющий запрос POST с изображением в кодировке base64

require 'net/http'
require "rubygems"
require 'active_support'

url = URI.parse('http://localhost:3000/')
image = ActiveSupport::Base64.encode64(open("public/images/rails.png").to_a.join)
post_params = {'image' => image }
Net::HTTP.post_form(url, post_params)

В контроллере мне нужно получить тип содержимого и имя файла этого изображения. Итак, сначала я расшифровываю это

image = ActiveSupport::Base64.decode64(params[:image])
image_data = StringIO.new(image)

и тогда я застрял!

Я хочу сохранить это изображение с помощью скрепки. Нужна серьезная помощь!

ОБНОВЛЕНИЕ: Я не могу отправить параметры для типа контента и имени файла. Я просто имитировал клиента, который отправляет это (и я не могу добавлять дополнительные параметры)

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Вы можете декодировать необработанные байты, используя одну из различных библиотек ImageMagick, а затем запросить формат в ImageMagick. Например, с RMagick :

require 'rmagick'
bytes = ActiveSupport::Base64.decode64(params[:image])
img   = Magick::Image.from_blob(bytes).first
fmt   = img.format

Это даст вам 'PNG', 'JPEG' и т. Д. В fmt. ImageMagick проверяет байты на наличие магических чисел и другой идентифицирующей информации, поэтому ему не нужно имя файла, чтобы узнать, какое изображение вы ему даете.

Что касается имени файла, вам не повезло, если кто-то явно не скажет вам, что это такое. Имя файла в любом случае редко имеет значение, и вы должны никогда использовать имя файла, которое вы не сгенерировали, для сохранения чего-либо; пользовательское имя файла должно использоваться только для отображения имени людям, составьте свое собственное имя файла (которое, как вы знаете, безопасно), если оно вам нужно.

0 голосов
/ 05 августа 2011

Для имени файла, почему бы вам просто не опубликовать это тоже, кажется проще (post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 }).Для поиска типа контента вы можете использовать библиотеку типа ruby-filemagic.

http://rubygems.org/gems/ruby-filemagic

...