2013-04-30 23 views
5

私は誰かがこれを理解するのを助けることを望んでいます。私は、画像のためのbase64文字列を持っている:Carrierwaveのbase64イメージをStringIOに変換する

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

私は燃えさしのcreateRecordを使用してそれを送信して(コミットしたいと思います):

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

その後、私はcarrierwaveためにStringIOに変換し、それを保存したいです:

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' 

?どんな助けもありがたい。

答えて

0

そして、そう、その文字列を分割する必要がない:

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

私は、これは...

+0

確かに、ここに書かれているように、http://ruby-doc.org/stdlib-2.0/libdoc/base64/rdoc/Base64.html – Goodwine

7

はい、あなたは文字列を分割する必要が最善の方法である疑い。そして、あなたは(StringIO.newにimageDataBinaryを渡すことができます)し、得られた画像が有効である必要があります...そして、あなたが画像をデコードすることができます

base64image = params[:painting][:image] 
imageDataString = splitBase64(base64image)[:data] 
imageDataBinary = Base64.decode64(imageDataString) 

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 

:あなたはこのようなものを使用することができます。

関連する問題