2012-04-16 15 views
4

私は普通のform_forでアップロードされたファイルを持っています。これはActionDispatch::Http::UploadedFileオブジェクトをparamsハッシュに入れています。このオブジェクトには.readという名前でコンテンツを取得できます。私は今、ファイルをXML文書に埋め込む必要があります。私は現在、XMLを構築するために通常のRuby文字列を使用しています。 Rails文字列のデフォルトのエンコーディングはutf-8です。アップロードされたバイナリファイル(ASCII-8BIT)をXML(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') 

答えて

2

まず、XML文書にバイナリファイルを埋め込むことはできません。何らかのテキストへの変換はありません。おそらくBase64のように、PDF文書とPNG画像を何らかの形でエンコードする必要があります。その前に、内容をバイトシーケンスではなく文字列として扱うようにしてください。

UndefinedConversionErrorは、テキストをUTF-8に変換しようとしていることを示しています。これは、RubyがASCIIであると考えるものからです。しかし、ソーステキストには値が0x89(10進137桁)で、ASCII範囲外のバイトが含まれています。ソースファイルがバイナリファイルであれば、それはまったく予想外のことではありません。base64エンコーディングはその問題を解決します。

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

+0

私のロジックはこれが答えでなければならないと私はそれがASCIIを間違って推測していたと感じていましたので、Rubyのエンコーディング推測を試してみました。 MACINTOSHだった。しかし、エンコーディングを強制してutf-8にエンコードすると、まだエラーが出ます。 – Kris

+3

申し訳ありませんが、これは誤っています。ファイルはpdfなので、変換が全くないはずです。そのファイルはバイナリファイルとして扱われるべきです - 残念ながら、私はそれを行う方法を知らないのです。 – gorn

+1

バイナリファイルを何らかの形で最初にエンコードすることなく、XMLドキュメントに埋め込むことはできません。バイナリファイルをバイトとして操作しているときは、バイトストリームは文字列ではないため、文字列操作の処理はまったく使用できません。 –

0

あなたはそれをXMLに埋め込む前に64エンコードした文字列をベースにできます。今すぐ

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

encoded_stringは問題なく埋め込むことができるはずです。コースのもう片方でデコードする必要があります。

+0

残念ながら、私は相手を支配していません。しかし、私はとにかくこれを行うでしょう。 – Kris

+0

@Krisは、任意のバイナリファイルを埋め込んでいるならば、 '<'や '&'文字や制御文字やヌルバイトなどを含んでいる可能性があるので、何とかエンコードする必要がありますとにかくファイルがテキストの場合は、実際のエンコーディングを再作成して再エンコーディングしても問題ありませんが、リストにはpdfとpngファイルが含まれています。 – matt

13

画像を開いて書き込もうとしたときに同じ問題(エラー)が発生しました。オープンメソッドに "wb"という権利を追加して成功しました。先ほど、それは "w"でした

+0

素晴らしいです、ありがとう!私も同様の問題がありましたが、これはまさに私がやらなければならなかったことでした。 – weltschmerz

+0

これが答えです。タイプを 'write'から' write binary'に変更する必要があります。したがって、 'wb'。 – sergserg

+0

私のために働いた、ありがとう、ありがとう。 – migu

関連する問題