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

从我见过的几个post中,我正在尝试这个

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

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

您的问题是您尝试将'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) } 

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 

您也可以使用简单的String Regexp ,而不是使用Regexp

返回str中给定子字符串或模式(regexp) 第一次出现的索引。 如果找不到则返回nil。

如果你有一个相当理智的数据源(如canvas上的JavaScript的.toDataURL() ),你可以依赖普通的mimetypes不包含逗号的事实。

 dataURL = "data:image/png;base64,iVBOR...." start = dataURL.index(',') + 1 # .index used here x = Base64.decode64 dataURL[start..-1] File.open('test.png','wb') {|file| file.write x} 

如果您正在使用自由格式的用户文件上载,请注意一些不常见的mime类型确实包含逗号(例如: text/x-java-source,java )。 你可以使用更保守的:

 start = dataURL.index(';base64,') + 8 

如果你不知道你是否有没有前缀的base64或数据URL base64,你可以使用#index作为测试:

 start = dataURL.index ';base64,' dataURL = dataURL[(start+8)..-1] if start x = Base64.decode64 dataURL 

这是一个关于如何打开base64图像的小脚本,当我有base64文本时,vacio.txt是文件。

 require 'base64' entry="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE....." File.open("vacio.txt","r") do |fichero| while linea=fichero.gets regex=/(data:image\/\D*\d*,)/ m=regex.match(linea) png=Base64.decode64(linea[m.to_s.length .. -1]) File.open('test.jpeg','wb'){|f|f.write(png)} end end