后端一个接口需要返回 xlsx 文件 生成 xlsx 用的是 openpyxl 但是每次返回拉取到 windows 下打开都是文件损坏 我对比了保存到本地和接口下载的两份 xlsx 文件 发现通过接口下载下来的 都比保存到本地的大 保存到本地的是 10216 个字节 但是下载的却有 16 700 k 我看了 http 请求的 content-length 确实是 10216 没错 但是为什么下载下来的会比本地保存的大啊? 试过 保存在 NameTemporaryFile BytesIO 都是一样 小白 求各路神仙搭救
1
Ritter OP 我吐了 百度谷歌都找不到
|
2
arrow8899 2019-09-24 15:39:29 +08:00
发一下代码
|
3
ETiV 2019-09-24 15:45:27 +08:00
昨儿煎蛋上看到的图,今儿又看到了 LZ 头像,要笑死我了。。。 我不用 Python,但是遇到需要 Excel 打开的数据文件我都无脑返回 CSV 格式的 另外,16700 KBytes 的文件打不开,还是 10216 Bytes 文件打不开。 说明一下,可能对后面帮你解答的人有帮助。 |
4
Ritter OP @arrow8899
![TIM 图片 20190924154329.png]( https://i.loli.net/2019/09/24/wDrkT9diMzyGhOP.png) 上面注释是保存在 BytesIO 的 下面是保存本地在返回的 都是一样 ![TIM 图片 20190924154432.png]( https://i.loli.net/2019/09/24/JhV9WiRmY14TKxu.png) 这是前端保存的 |
5
libaibuaidufu 2019-09-24 15:48:35 +08:00
首先试试 最简单的下载 等否使用啊
``` from flask import url_for downloadUrl = url_for("upload", filename="xx", _external=True) ``` 然后再排查其他问题。 |
8
Ritter OP @libaibuaidufu 下载是没问题的
|
9
libaibuaidufu 2019-09-24 16:01:52 +08:00
@Ritter 把 mimetype 去掉试试。。。。 反正他本身也可以获取类型
|
10
Ritter OP @libaibuaidufu 试过了 还是一样的
|
11
arrow8899 2019-09-24 16:18:05 +08:00
前端 saveAs type: "application/octet-stream"
|
12
libaibuaidufu 2019-09-24 16:19:32 +08:00
@Ritter 我试了一下没有发现,和你一样的问题 。。。
|
14
Ritter OP @libaibuaidufu 好像是前端插件的问题
|
15
Ritter OP 解决了 找了一天
前端请求文件时 responseType 需要设置为"Blob" 标识响应为二进制数据 |
16
Vegetable 2019-09-24 18:00:41 +08:00
后端不用看了,没问题,前端的问题.前端代码过于魔幻,你那个 data 确定是文件吗?为了验证你可以先将 xlsx 改成 1 个字符的 txt 文件来测试.这样前端比较容易判断数据是在哪里多出来的
|