Chrome 通过转换为 UTF-8 来损坏二进制文件下载



我目前被指派维护一个用Flask编写的应用程序。目前,我正在尝试添加一项允许用户下载预生成的 excel 文件的功能,但是,每当我尝试发送它时,我的浏览器似乎都会以 UTF-8 重新编码文件,这会导致添加多字节字符,从而损坏文件。

使用 wget 下载的文件:

(venv) luke@ubuntu:~$ 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) luke@ubuntu:~$ 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'PKx03x04x14x00x00x00x08x00}x0cxfbJx1f#xcfx03xc0x00x00x00x13x02x00x00x0bx00x00x00'
send_file(BytesIO(data), attachment_filename="x.xlsx", as_attachment=True)

相关问题:尝试使用 flask_restful 发送二进制文件的编码问题

Chrome 希望接收 utf-8 编码的文本,并发现一些字节无法解释为字符的有效 utf-8 编码 - 这是正常的,因为你的文件是二进制的。所以它用EF BF BD替换了这些无效的字节,Unicode替换字符的utf-8编码。您发送的content-type标头可能text/....。也许尝试类似Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

最新更新