从rails64上的base64编码图像ruby中检索文件名和内容类型

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

这是使用base64编码图像执行POST请求的代码

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) 

然后我被卡住了!

我基本上想用paperclip保存这个图像。 需要一些认真的帮助!

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

您可以使用各种ImageMagick库之一解码原始字节,然后向ImageMagick询问格式。 例如,使用RMagick :

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

这将在fmt为您提供'PNG''JPEG'等。 ImageMagick检查字节是否有幻数和其他识别信息,因此它不需要文件名来知道你给它的图像类型。

就文件名而言,除非有人明确告诉你它是什么,否则你运气不好。 文件名很少很重要,你永远不应该使用你没有生成的文件名来保存任何东西; 用户提供的文件名只应用于向人们显示名称,如果需要,可以编制自己的文件名(知道是安全的)。

对于文件名,你为什么不发布它,似乎更容易( post_params = {'image' => image, 'file_name' => same_file_you_passed_to_encode64 } )。 要查找内容类型,您可以使用像ruby-filemagic这样的库。

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