从我见过的几个帖子中,我正在尝试这个
x = Base64.decode64("data:image/png;base64,iVBOR....")
File.open('test.png','wb') {|file| file.write x}
但是我不能用观众打开图像,我还需要做更多的事情吗?
答案 0 :(得分:25)
您的问题是您尝试将'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) }
答案 1 :(得分:5)
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
答案 2 :(得分:1)
您也可以使用简单的String#index方法,而不是使用Regexp
。
返回str中给定子字符串或模式(regexp)的第一个出现的索引。如果找不到,则返回nil。
如果你有一个相当理智的数据源(如.toDataURL()
上的JavaScript canvas
),你可以依赖普通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
答案 3 :(得分:0)
这是一个关于如何打开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