首页 > 解决方案 > 无法使用 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。请原谅我,如果我监督了一些非常明显的事情,但我确实试图检查每个角落,这可能是导致错误的可能原因,例如:

标签: pythonapirestmultipartform-datafastapi

解决方案


这是一个已知的 Python 错误

SpooledTemporaryFile 不完全满足 IOBase 的抽象。即 , seekable,readablewritable缺失。

这是在寻找 SpooledTemporaryFile 支持的 lzma 文件时发现的。

正如@larsks 在他的评论中所建议的那样,我会尝试将假脱机文件的内容写入一个 new TemporaryFile,然后对其进行操作。只要您的文件不是太大,它应该也能正常工作。


推荐阅读