13

从我看过的几篇文章中,我正在尝试这个

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

但是我无法用查看器打开图像,我需要做更多的事情吗?

4

4 回答 4

32

您的问题是您正在尝试将'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) }
于 2013-04-14T02:59:43.080 回答
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
于 2016-02-20T00:54:01.887 回答
2

除了使用 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
于 2016-12-12T21:33:22.867 回答
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 
于 2016-08-01T18:59:39.243 回答