将base64图像转换为Carrierwave的StringIO

我希望有人能帮助我理解这一点。 我有一个图像的base64字符串:

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

我想使用ember的createRecord和commit()发送它:

 this.get('store').createRecord(Emb.Painting, {name: newName, image: newImage}); 

然后我想将它转换为StringIO for 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' 

? 任何帮助赞赏。

是的,你需要拆分字符串。 你可以使用这样的东西:

 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(),结果图像应该是有效的。

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

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

我怀疑这是最好的方式……