如何在XML(UTF-8)中嵌入上传的二进制文件(ASCII-8BIT)?
我有一个通过常规form_for
上传的文件,这给我一个params哈希中的ActionDispatch::Http::UploadedFile
对象,我可以在其上调用.read
来获取内容。 我现在需要将文件嵌入XML文档中。 我现在使用常规的Ruby字符串来构造XML。 Rails字符串的默认编码是utf-8。
因此,我"\x89" from ASCII-8BIT to UTF-8
收到错误Encoding::UndefinedConversionError
, "\x89" from ASCII-8BIT to UTF-8
。
对于以下文件会发生这种情况:
what-matters-now-1.pdf:application / octet-stream; 字符集=二进制 example.csv:text / plain; 字符集= utf-8的 investigations.png:image / png; 字符集=二进制
它不会发生:
my_test.txt:text / plain; 字符集= US-ASCII
我试过改变编码,但是我得到了同样的错误:
params[:file].read.encode('utf-8')
首先,如果没有对文本进行某种转换,则无法在XML文档中嵌入二进制文件。 至少PDF文档和PNG图像需要以某种方式编码 – 可能是Base64
– 然后才开始尝试将其内容视为字符串而不是字节序列。
UndefinedConversionError
表示您正在尝试将文本转换为UTF-8,而Ruby认为是ASCII。 但源文本包含一个字节,其值为0x89(十进制137),超出ASCII范围。 如果源文件是二进制文件,那么这并不是意料之外的,并且base64编码将解决该问题。
但是,如果生成该错误的源文件已经是文本,那么您需要确定并指定它实际使用的字符集。 0x89表示它既不是ASCII也不是UTF-8,因此最可能的选项是Latin-1或Windows-1252。
在尝试打开和写入图片时,我遇到了同样的问题(错误)。 在添加“wb”作为open方法的权限后,它成功了。 早些时候,它是“w”
您可以在将字符串嵌入xml之前对其进行64位编码:
require 'base64' encoded_string = Base64.encode64(the_string)
现在encoded_string
应该能够毫无问题地嵌入。 你需要在另一端解码它。