在Ruby中打开并保存base64编码的图像数据URI

jua*_*tas 10 ruby base64 file

从我看到的几个帖子中,我正在尝试这个

x = Base64.decode64("data:image/png;base64,iVBOR....")
File.open('test.png','wb') {|file| file.write x}
Run Code Online (Sandbox Code Playgroud)

但是后来我无法用观众打开图像,我还需要做更多的事吗?

mu *_*ort 27

您的问题是您尝试将'data:image/png;base64,'前缀解码为Base64数据; 该前缀是完全有效的Base64数据,但它不是PNG文件的Base64表示.结果是你的test.png文件包含一堆废话,后面跟着一些实际上是PNG文件的位.在解码PNG之前剥去数据URL前缀:

data_url = "data:image/png;base64,iVBOR...."
png      = Base64.decode64(data_url['data:image/png;base64,'.length .. -1])
File.open('test.png', 'wb') { |f| f.write(png) }
Run Code Online (Sandbox Code Playgroud)

  • 你怎么会检测几种格式?我做了`data_url.match(/ data:(.*); base64,(.*)/)`来获取编码类型,文件格式和图像数据,但我不确定如果这可能会导致字符串很大时出现性能问题. (3认同)

Pio*_*ski 6

mu_is_too_short答案非常接近,但它假设base64流将包含PNG数据.情况并非总是这样,所以我建议使用mime类型库来建立正确的文件扩展名:

REGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m

data_uri_parts = data_url.match(REGEXP) || []
extension = MIME::Types[data_uri_parts[1]].first.preferred_extension
file_name = "myfilename.#{extension}"

File.open(file_name, 'wb') do |file|
    file.write(Base64.decode64(data_uri_parts[2]))
end
Run Code Online (Sandbox Code Playgroud)