2017-07-27 9 views
0

私は現在、Flaskで書かれたアプリケーションを維持するように割り当てられています。現在、ユーザーが事前生成のExcelファイルをダウンロードできるようにする機能を追加しようとしていますが、送信しようとするたびに、ブラウザはUTF-8でファイルを再エンコードしてマルチバイト文字を追加しますこれはファイルを破壊します。ChromeがUTF-8に変換してバイナリファイルを破損する

のwgetでダウンロードしたファイル:

(venv) [email protected]:~$ hexdump -C wget.xlsx | head -n 2 
00000000 50 4b 03 04 14 00 00 00 08 00 06 06 fb 4a 1f 23 |PK...........J.#| 
00000010 cf 03 c0 00 00 00 13 02 00 00 0b 00 00 00 5f 72 |.............._r| 

Chromeでダウンロードしたファイル(?EF BF BDシーケンスに気づく)

(venv) [email protected]:~$ hexdump -C chrome.xlsx | head -n 2 
00000000 50 4b 03 04 14 00 00 00 08 00 ef bf bd 03 ef bf |PK..............| 
00000010 bd 4a 1f 23 ef bf bd 03 ef bf bd 00 00 00 13 02 |.J.#............| 

誰もが、私はこの問題を解決できる方法を知っていますか?これは私が使用しているコードです:

data = b'PK\x03\x04\x14\x00\x00\x00\x08\x00}\x0c\xfbJ\x1f#\xcf\x03\xc0\x00\x00\x00\x13\x02\x00\x00\x0b\x00\x00\x00' 
send_file(BytesIO(data), attachment_filename="x.xlsx", as_attachment=True) 

関連問題:Encoding problems trying to send a binary file using flask_restful

答えて

1

クロムがUTF-8でエンコードされたテキストを受け取ることを期待して、有効なUTF-8として解釈することができなかったいくつかのバイトを見つけました。あなたのファイルがバイナリなので、charのエンコーディングは正常です。したがって、これらの無効なバイトは、Unicode置換文字のutf-8エンコードEF BF BDに置き換えられました。送信するcontent-typeヘッダーはおそらくtext/....です。おそらく何かを試してみるContent-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

+0

ファイルをダウンロードするために使用されたコードはファイルを文字列として解釈し、UTF-8に変換し、 'responseType'を設定することで修正されましたAngularJS '$ http'の' 'arraybuffer''を呼び出すと、助けてくれてありがとう – Paradoxis

関連する問題