flask 中关于返回 xlsx 的问题

2019-09-24 15:27:53 +08:00
 Ritter

后端一个接口需要返回 xlsx 文件 生成 xlsx 用的是 openpyxl 但是每次返回拉取到 windows 下打开都是文件损坏 我对比了保存到本地和接口下载的两份 xlsx 文件 发现通过接口下载下来的 都比保存到本地的大 保存到本地的是 10216 个字节 但是下载的却有 16 700 k 我看了 http 请求的 content-length 确实是 10216 没错 但是为什么下载下来的会比本地保存的大啊? 试过 保存在 NameTemporaryFile BytesIO 都是一样 小白 求各路神仙搭救

3402 次点击
所在节点    Python
16 条回复
Ritter
2019-09-24 15:31:45 +08:00
我吐了 百度谷歌都找不到
arrow8899
2019-09-24 15:39:29 +08:00
发一下代码
ETiV
2019-09-24 15:45:27 +08:00


昨儿煎蛋上看到的图,今儿又看到了 LZ 头像,要笑死我了。。。

我不用 Python,但是遇到需要 Excel 打开的数据文件我都无脑返回 CSV 格式的

另外,16700 KBytes 的文件打不开,还是 10216 Bytes 文件打不开。
说明一下,可能对后面帮你解答的人有帮助。
Ritter
2019-09-24 15:46:33 +08:00
@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)
这是前端保存的
libaibuaidufu
2019-09-24 15:48:35 +08:00
首先试试 最简单的下载 等否使用啊
```
from flask import url_for
downloadUrl = url_for("upload", filename="xx", _external=True)
```
然后再排查其他问题。
Ritter
2019-09-24 15:49:29 +08:00
@ETiV
直接保存到本地的问题
16 700 的是返回的 打开显示损坏
T T
Ritter
2019-09-24 15:51:59 +08:00
@Ritter 直接保存到本地的没问题 少个字
Ritter
2019-09-24 15:52:22 +08:00
@libaibuaidufu 下载是没问题的
libaibuaidufu
2019-09-24 16:01:52 +08:00
@Ritter 把 mimetype 去掉试试。。。。 反正他本身也可以获取类型
Ritter
2019-09-24 16:04:22 +08:00
@libaibuaidufu 试过了 还是一样的
arrow8899
2019-09-24 16:18:05 +08:00
前端 saveAs type: "application/octet-stream"
libaibuaidufu
2019-09-24 16:19:32 +08:00
@Ritter 我试了一下没有发现,和你一样的问题 。。。
Ritter
2019-09-24 17:25:04 +08:00
@arrow8899 已经试过 还是不行 现在发现好像是前端插件的问题
Ritter
2019-09-24 17:25:11 +08:00
@libaibuaidufu 好像是前端插件的问题
Ritter
2019-09-24 17:52:42 +08:00
解决了 找了一天
前端请求文件时 responseType 需要设置为"Blob"
标识响应为二进制数据
Vegetable
2019-09-24 18:00:41 +08:00
后端不用看了,没问题,前端的问题.前端代码过于魔幻,你那个 data 确定是文件吗?为了验证你可以先将 xlsx 改成 1 个字符的 txt 文件来测试.这样前端比较容易判断数据是在哪里多出来的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/603735

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX