Как встроить загруженные двоичные файлы (ASCII-8BIT) в XML (UTF-8)?



У меня есть файл, который загружается через обычный form_for, это дает мне объект ActionDispatch::Http::UploadedFile в хэше params, на котором я могу вызвать .read, чтобы получить содержимое. Теперь мне нужно вставить файл в XML-документ. Сейчас я использую обычную строку Ruby для построения XML. Кодировка по умолчанию для строки Rails-utf-8.



Поэтому я получаю ошибку Encoding::UndefinedConversionError, "x89" from ASCII-8BIT to UTF-8.



Это происходит для следующих файлов:




what-matters-now-1.pdf: application/octet-stream; charset=binary
example.csv: text/plain; charset=utf-8
investigations.png: image/png; charset=binary


Этого не происходит для:



my_test.txt: text/plain; charset=us-ascii


Я пытался измениться кодировка, но я получаю ту же ошибку:



params[:file].read.encode('utf-8')
536   3  

3 ответов:

Во-первых, вы не можете встроить двоичный файл в XML-документ без какого-либо преобразования в текст. По крайней мере, PDF-документ и PNG-изображение должны быть каким - то образом закодированы-вероятно Base64 - прежде чем вы начнете рассматривать их содержимое как строки символов, а не последовательности байтов.

UndefinedConversionError указывает на то, что вы пытаетесь преобразовать текст в UTF-8 из того, что Ruby считает ASCII. Но исходный текст содержит байт, значение которого равно 0x89 (137 десятичных знаков), то есть вне диапазона ASCII. Это совсем не удивительно, если исходный файл является двоичным файлом, и base64-кодирование исправит эту проблему.

Если, однако, исходный файл, генерирующий эту ошибку, уже является текстом, то вам нужно определить и указать, какой набор символов он фактически использует. 0x89 указывает, что это не ASCII и не UTF-8, поэтому наиболее вероятными вариантами являются Latin-1 или Windows-1252.

У меня была та же проблема (ошибка) при попытке открыть и написать картинку. Это удалось после добавления "wb" в качестве прав на открытый метод. Раньше это было "w"

Вы можете кодировать строку base 64, прежде чем вставлять ее в xml:

require 'base64'
encoded_string = Base64.encode64(the_string)

Теперь encoded_string должно быть возможно внедрить без проблем. Вам, конечно, нужно будет расшифровать его на другом конце.

Comments

    Ничего не найдено.