python - 无法使用 FastAPI 打开和读取上传的 zip 文件的内容
问题描述
我目前正在使用 Python Framework FastAPI 为自己开发一个小后端项目。我做了一个端点,用户应该能够上传 2 个文件,而第一个是 zip 文件(包含 X .xmls),后者是一个普通的 .xml 文件。
代码如下:
@router.post("/sendxmlinzip/")
def create_upload_files_with_zip(files: List[UploadFile] = File(...)):
if not len(files) == 2:
raise Httpex.EXPECTEDTWOFILES
my_file = files[0].file
zfile = zipfile.ZipFile(my_file, 'r')
filelist = []
for finfo in zfile.infolist():
print(finfo)
ifile = zfile.open(finfo)
line_list = ifile.readlines()
print(line_list)
这应该打印 .zip 文件中的文件内容,但会引发异常
AttributeError:“SpooledTemporaryFile”对象没有“可搜索”属性
在行中ifile = zfile.open(finfo)
经过大约 3 天的研究,涉及大量试验和错误,尝试使用不同的函数,如 .read() 或 .extract(),我放弃了。因为 python 文档从字面上说,这应该可以通过这种方式实现......
对于不了解 FastAPI 的您来说,它是 Restful Webservices 的后端 fw,并且正在使用 Starlette 数据结构进行 UploadFile。请原谅我,如果我监督了一些非常明显的事情,但我确实试图检查每个角落,这可能是导致错误的可能原因,例如:
- 检查是否有其他实现可能
- 检查 .zip 文件是否正确
- 检查,我附上正确的文件(笑)
- 调试看看,后端来的实际数据是否确实是.zip文件
解决方案
这是一个已知的 Python 错误:
SpooledTemporaryFile 不完全满足 IOBase 的抽象。即 ,
seekable
,readable
和writable
缺失。这是在寻找 SpooledTemporaryFile 支持的 lzma 文件时发现的。
正如@larsks 在他的评论中所建议的那样,我会尝试将假脱机文件的内容写入一个 new TemporaryFile
,然后对其进行操作。只要您的文件不是太大,它应该也能正常工作。
推荐阅读
- mysql - 重新安装 MySQL 时出现错误“无法使用给定密码连接到 MySQL”
- r - 时间间隔之间的Difftime()?(右)
- javascript - 如何通过单击 HTML 网页上的按钮来运行 python 脚本?
- java - 用两件事分割一个字符串?
- php - 我怎样才能获得php实时浏览器输出
- sql - CASE ELSE 最短日期
- android - 尝试使用 AsyncTask 从 API 获取 Json 响应我总是得到空结果
- java - Intellij 中的黄瓜未定义步骤参考
- node.js - mongoose pull 命令从购物车中删除产品
- java - 谷歌翻译 (android) 功能的名称是什么,我可以通过该应用搜索任何突出显示的文本?