从我看过的几篇文章中,我正在尝试这个
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
除了使用 a Regexp
,您还可以使用简单的String#index方法。
返回给定子字符串或模式 (regexp) 在 str中第一次出现的索引。如果没有找到则返回 nil。
如果您有一个相当健全的数据源(例如.toDataURL()
a 上的JavaScript canvas
),您可以相信常见的 mimetype 不会包含逗号这一事实。
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