4

通常の方法でアップロードされたファイルがありますform_for。これにより、コンテンツを取得するためにActionDispatch::Http::UploadedFile呼び出すことができるparamsハッシュ内のオブジェクトが得られます。.readここで、ファイルをXMLドキュメントに埋め込む必要があります。今のところ、XMLを構築するために通常のRuby文字列を使用しています。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
調査.png:画像/ png; charset = binary

それは起こりません:

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

エンコーディングを変更しようとしましたが、同じエラーが発生します。

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

3 に答える 3

15

画像を開いて書き込もうとしたときに同じ問題(エラー)が発生しました。openメソッドの権利として「wb」を追加して成功しました。以前は「w」でした

于 2012-07-27T08:15:43.383 に答える
2

まず、何らかのテキストへの変換なしに、バイナリファイルをXMLドキュメントに埋め込むことはできません。少なくともPDFドキュメントとPNG画像はBase64、コンテンツをバイトシーケンスではなく文字列として扱い始める前に、何らかの方法でエンコードする必要があります。

UndefinedConversionError、RubyがASCIIと見なしているものからテキストをUTF-8に変換しようとしていることを示します。ただし、ソーステキストには、ASCII範囲外の値が0x89(10進数で137)のバイトが含まれています。ソースファイルがバイナリファイルである場合、これはまったく予想外のことではなく、base64でエンコードするとその問題が修正されます。

ただし、そのエラーを生成するソースファイルがすでにテキストである場合は、実際に使用している文字セットを特定して指定する必要があります。0x89は、ASCIIでもUTF-8でもないことを示しているため、最も可能性の高いオプションはLatin-1またはWindows-1252です。

于 2012-04-16T16:33:32.623 に答える
0

文字列をxmlに埋め込む前に、Base64でエンコードすることができます。

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

これencoded_stringで問題なく埋め込むことができるはずです。もちろん、もう一方の端でデコードする必要があります。

于 2012-04-16T17:39:47.267 に答える