将base64图像转换为Carrierwave的StringIO

5

我希望有人能帮我理解这个问题。我有一个图片的base64字符串:

"data:image/jpeg;base64,/9j/4AAQSkZJRgABA..."

我想使用Ember的createRecord和commit()方法来发送它:
this.get('store').createRecord(Emb.Painting, {name: newName, image: newImage});

然后我想将它转换为StringIO格式以便于使用carrierwave保存:

StringIO.class_eval { def original_filename; "stringiohaxx.jpg"; end }
io = StringIO.new(Base64.decode64(params[:painting][:image]))
@painting =  Painting.create(:name => params[:painting][:name], :image => io )

一张图片已经保存。但这张图片一直是损坏的。我需要将我的base64字符串分成几部分吗?

data: '/9j/..'
type: 'image/jpeg'

? 任何帮助都将不胜感激。

2个回答

9

是的,您需要拆分字符串。您可以使用以下代码:

def splitBase64(uri)
  if uri.match(%r{^data:(.*?);(.*?),(.*)$})
    return {
      type:      $1, # "image/png"
      encoder:   $2, # "base64"
      data:      $3, # data string
      extension: $1.split('/')[1] # "png"
      }
  end
end

然后您可以解码图像...
base64image = params[:painting][:image]
imageDataString = splitBase64(base64image)[:data]
imageDataBinary = Base64.decode64(imageDataString)

然后您可以将imageDataBinary传递给StringIO.new(),得到的图像应该是有效的。

0

是的,那个字符串需要被拆分:

var data = newImage.split(',');  
this.get('store').createRecord(Emb.Painting, {name: newName, image: data[1]});  

我怀疑这不是最好的方法...


确实,就像这里的文档所述:http://ruby-doc.org/stdlib-2.0/libdoc/base64/rdoc/Base64.html - Goodwine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接