2013-04-30 40 views
5

Tôi hy vọng ai đó có thể giúp tôi hiểu điều này. Tôi có một chuỗi base64 cho một hình ảnh:Chuyển đổi hình ảnh base64 thành StringIO cho Carrierwave

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

Tôi muốn gửi nó bằng cách sử createRecord ember và cam kết():

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

Sau đó, tôi muốn chuyển nó sang StringIO cho carrierwave và lưu nó :

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) 

Hình ảnh được lưu. Hình ảnh luôn bị hỏng. Tôi có cần phá vỡ chuỗi base64 của tôi thành:

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

? Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

0

Và vâng chuỗi mà không cần phải được chia nhỏ:

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

tôi nghi ngờ đây là cách tốt nhất ...

+0

Thật vậy, giống như tài liệu ở đây: http://ruby-doc.org/stdlib-2.0/libdoc/base64/rdoc/Base64.html – Goodwine

7

Có, bạn cần phải tách chuỗi. Bạn có thể sử dụng một cái gì đó như thế này:

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 

Sau đó, bạn có thể giải mã hình ảnh ...

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

Sau đó, bạn có thể vượt qua imageDataBinary để StringIO.new() và hình ảnh kết quả nên có giá trị.

Các vấn đề liên quan