2011-08-05 15 views
6

我试图检索我以base64编码格式接收的图像的内容类型和文件名。在rails上检索文件名和内容类型从base64编码图像ruby

这里是正在做与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) 

在控制器中的POST请求的代码,我需要得到这个图像的内容类型和文件名。所以首先我解码它

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

然后我卡住了!

我基本上想用回形针保存这张图片。需要一些认真的帮助!

更新: 我无法发送内容类型和文件名的参数。我只是模仿发送这个的客户端(并且我无法控制添加额外的参数)

+0

难道你不能只添加另一个post_param?就像{'filename'=>'rails.png'} – Serabe

+0

不!我正在开发的api不会发送任何其他参数。只有编码的图像数据。所以,我想知道,如果不发送任何其他参数,这是否可能。 – Madhusudhan

+0

你没有考虑使用用户提供的文件名来保存内容,对吗?这是一个坏主意。 –

回答

4

你可以解码使用各种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

雅我认为现在文件名不应该是一个问题,因为回形针可以与适当的实例关联。我需要的只是内容类型。让我试试这个。谢谢! – Madhusudhan

+0

谢谢你,我可以得到格式'PNG',我可以至少将内容类型设置为'image/png' – Madhusudhan

0

对于文件名,为什么你不只是发布,看起来更容易(post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 })。为了找到内容类型,你可以使用像ruby-filemagic这样的库。

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

+0

我正在开发的api不会发送任何其他参数。只有编码的图像数据。是否有可能从编码的数据获取文件名?我听说它可能与PHP,我确信有一个出路与ruby/rails – Madhusudhan

+0

除非文件名是实际图像数据的一部分 - 恕我直言,这将是相当奇怪 - 我不明白它将如何最终在Base64编码的字符串。你确定你听说的PHP与EXIF没有关系,例如文件名可以是嵌入数据的一部分吗? –