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'

? 任何帮助表示赞赏。

4

2 回答 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() 并且生成的图像应该是有效的。

于 2013-05-01T00:16:34.150 回答
0

是的,该字符串确实需要分解:

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

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

于 2013-04-30T20:47:10.570 回答