python - 从 fastapi 返回多个文件
问题描述
使用fastapi,我不知道如何发送多个文件作为响应。例如,要发送单个文件,我将使用类似这样的东西
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/image_from_id/")
async def image_from_id(image_id: int):
# Get image from the database
img = ...
return Response(content=img, media_type="application/png")
但是,我不确定发送图像列表是什么样的。理想情况下,我想做这样的事情:
@app.get("/images_from_ids/")
async def image_from_id(image_ids: List[int]):
# Get a list of images from the database
images = ...
return Response(content=images, media_type="multipart/form-data")
但是,这会返回错误
def render(self, content: typing.Any) -> bytes:
if content is None:
return b""
if isinstance(content, bytes):
return content
> return content.encode(self.charset)
E AttributeError: 'list' object has no attribute 'encode'
解决方案
我对@kia 在 Python3 和最新的 fastapi 上的回答有一些问题,所以这是一个我正在工作的修复,它包括 BytesIO 而不是 Stringio,修复响应属性和删除顶级存档文件夹
import os
import zipfile
import io
def zipfiles(filenames):
zip_filename = "archive.zip"
s = io.BytesIO()
zf = zipfile.ZipFile(s, "w")
for fpath in filenames:
# Calculate path for file in zip
fdir, fname = os.path.split(fpath)
# Add file, at correct path
zf.write(fpath, fname)
# Must close zip for all contents to be written
zf.close()
# Grab ZIP file from in-memory, make response with correct MIME-type
resp = Response(s.getvalue(), media_type="application/x-zip-compressed", headers={
'Content-Disposition': f'attachment;filename={zip_filename}'
})
return resp
@app.get("/image_from_id/")
async def image_from_id(image_id: int):
# Get image from the database
img = ...
return zipfiles(img)
推荐阅读
- excel - 多列到固定列
- python - 如何同时绘制具有 2 个值的颜色图?
- javascript - React Native Axios 使用 GET 方法获取 NULL response.data
- regex - 使用正则表达式在 postgresql 中提取最后一个单词
- linux - 在用破折号分隔的日期字段上使用 Linux 排序命令时遇到问题
- python - 根据字典列表中的值获取键
- java - 我没有导入 Maven 项目选项
- assembly - 计算数组中数字之间的差异(Assembly,Irvine)
- apache-spark - Apache Spark 中的 ExternalSorter 和 ExternalAppendOnlyMap 有什么区别?
- html - 在服务器上上传网站后无法加载资源(未找到)(内部服务器错误)