python - 从 zip 的 SpooledTemporaryFile 获取信息
问题描述
我正在使用 Fast API 上传一个 zip 文件,它将文件作为 SpooledTemporaryFile 接收。我一直在尝试将该文件复制到磁盘上。我尝试过各种各样的事情;我觉得我已经取得进展的两个在下面。
我试图使用 zipfile.Zipfile,当我把它变成一个时,我无法解压缩它,因为它说它不是一个 zip。
我还上传了一个未压缩的单个文件并将 SpooledTemporaryFile 转换为 _io.BytesIO,但是,当我尝试读取单个文件(未压缩)的内容时,它返回空字节(b'')。
解决方案
我实际上正在做类似的事情并遇到了同样的问题。我想出的解决方案是使用选项File
(不是那个UploadFile
),将输入写入另一个文件,然后执行解压缩。
这是我使用 TemporaryDirectory 和用于输入和解压缩文件的单独目录的实现:
@router.post("/test_file/unzip")
def unzip_upload(file: bytes = File(...)):
with tempfile.TemporaryDirectory() as temp_dir:
os.chdir(temp_dir)
os.mkdir('input')
os.mkdir('unzipped')
with open("input/zip_file.zip", 'wb') as new_file:
new_file.write(file)
# print(f"output of listdir for /input {os.listdir(temp_dir + '/input')}")
with zipfile.ZipFile("input/zip_file.zip") as zip_file:
print(f"files in zip: {zip_file.namelist()}")
zip_file.extractall('unzipped')
unzipped_files = os.listdir('unzipped')
return {"unzipped files": unzipped_files}
如果您需要使用该UploadFile
选项,我可以使用它:
@router.post("/test_uploadfile/unzip")
def unzip_upload(file: UploadFile = File(...)):
with tempfile.TemporaryDirectory() as temp_dir:
os.chdir(temp_dir)
os.mkdir('input')
os.mkdir('unzipped')
with open("input/zip_file.zip", 'wb') as new_file:
new_file.write(file.file._file.getvalue())
# print(f"output of listdir for /input {os.listdir(temp_dir + '/input')}")
with zipfile.ZipFile("input/zip_file.zip") as zip_file:
print(f"files in zip: {zip_file.namelist()}")
zip_file.extractall('unzipped')
unzipped_files = os.listdir('unzipped')
return {"unzipped files": unzipped_files}
推荐阅读
- python - 如何更新熊猫数据框中选定的 datetime64 值?
- android - 从其他应用发送 Firebase 通知
- c# - 为什么我无法删除画布 WPF C# 中的图像?
- asp.net - 单元测试项目在 ASP.NET Core 2.1 中给出 Microsoft.AspNetCore.Mvc.Core 版本错误
- python - 使用正则表达式将字符串解析成组
- php - Laravel/Lumen 基于用户输入在中间件上绑定接口
- node.js - 只知道公司名称如何获取公司描述?
- docker - 我怎么知道第三方 docker 镜像可以访问我们的上传数据到容器
- javascript - 如何在打字稿中使用`Set.has`?
- arrays - 为什么在这个 C 代码中没有超出范围的索引?