如何在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应该能够毫无问题地嵌入。 你需要在另一端解码它。