2011-08-05 14 views
6

Estoy tratando de recuperar el tipo de contenido y el nombre de archivo de una imagen que estoy recibiendo en formato codificado en base64.recuperar nombre de archivo y tipo de contenido desde base64 imagen codificada ruby ​​on rails

Este es el código que está haciendo una solicitud POST con la imagen codificada

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) 

base 64 en el controlador, que necesito para obtener el tipo de contenido y nombre de archivo de esta imagen. Así que primero lo estoy decodificando

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

y luego estoy atascado!

Básicamente, quiero guardar esta imagen con clip. ¡Necesito ayuda seria!

ACTUALIZACIÓN: No puedo enviar parametros de tipo de contenido y el nombre del archivo. Solo estaba imitando al cliente que está enviando esto (y no tengo control para agregar parámetros adicionales)

+0

¿No puede simplemente agregar otro post_param? Algo como {'filename' => 'rails.png'} – Serabe

+0

¡no! La API para la que estoy desarrollando no envía ningún otro parámetro. Solo datos de imagen codificados. Entonces, quiero saber si esto es posible sin enviar ningún otro parámetro. – Madhusudhan

+0

No está pensando en utilizar un nombre de archivo proporcionado por el usuario para guardar algo, ¿verdad? Esa es una mala idea –

Respuesta

4

Se podría decodificar los octetos brutos, utilizando una de las diversas bibliotecas de ImageMagick y luego pedir a ImageMagick para el formato. Por ejemplo, con RMagick:

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

que le dará 'PNG', 'JPEG', etc., en fmt. ImageMagick comprueba los bytes en busca de números mágicos y otra información de identificación para que no necesite un nombre de archivo para saber qué tipo de imagen le está dando.

Por lo que respecta al nombre de archivo, no tienes suerte a menos que alguien te diga explícitamente de qué se trata. El nombre de archivo rara vez importa de todos modos y debe nunca usar un nombre de archivo que no haya generado para guardar nada; un nombre de archivo proporcionado por el usuario solo debe usarse para mostrar el nombre a las personas, crea tu propio nombre de archivo (que sabes que es seguro) si lo necesitas.

+0

Creo que ahora el nombre de archivo no debería ser un problema, ya que paperclip se puede asociar con instancias apropiadas. Todo lo que necesito es tipo de contenido. déjame probar esto. ¡Gracias! – Madhusudhan

+0

gracias por esto, pude obtener el formato 'PNG', puedo al menos establecer el tipo de contenido como' image/png' – Madhusudhan

0

Para el nombre de archivo, ¿por qué no publica eso también? Parece más fácil (post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 }). Para encontrar el tipo de contenido, puede usar una biblioteca como ruby-filemagic.

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

+0

La API para la que estoy desarrollando no envía ningún otro parámetro. Solo datos de imagen codificados. ¿Es posible obtener el nombre de archivo solo de los datos codificados? Escuché que es posible con php, estaba seguro de que hay una salida con ruby ​​/ rails – Madhusudhan

+0

A menos que el nombre del archivo sea parte de los datos de la imagen real, lo que en mi humilde opinión sería bastante extraño, no veo cómo terminaría en la cadena codificada en Base64. ¿Estás seguro de que lo que escuchaste sobre PHP no estaba relacionado con EXIF, por ejemplo, donde el nombre de archivo puede ser parte de los datos incrustados? –