我想从S3获取一个PDF文件,然后从FastAPI后端将其返回到前端.

这是我的代码:

@router.post("/pdf_document")
def get_pdf(document : PDFRequest) :
    s3 = boto3.client('s3')
    file=document.name
    f=io.BytesIO()
    s3.download_fileobj('adm2yearsdatapdf', file,f)
    return StreamingResponse(f, media_type="application/pdf")

此API返回200状态代码,但不返回PDF文件作为响应.

推荐答案

由于整个文件数据已经加载到内存中,因此使用StreamingResponse没有什么意义.相反,您应该使用Response,方法是传递文件字节(使用BytesIO.getvalue()获取包含缓冲区全部内容的字节),定义media_type,并设置Content-Disposition头,以便可以在浏览器中查看文件或将其下载到用户设备.有关更多详细信息,请查看this以及thisthis的答案.

from fastapi import Response

@app.get("/pdf")
def get_pdf():
    ...
    buffer = io.BytesIO()
    ...
    headers = {'Content-Disposition': 'attachment; filename="out.pdf"'}
    return Response(buffer.getvalue(), headers=headers, media_type='application/pdf')

要在浏览器中查看PDF文件而不是下载,请使用:

headers = {'Content-Disposition': 'inline; filename="out.pdf"'}

Python相关问答推荐

剧作家Python没有得到回应

仅从风格中获取 colored颜色 循环

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

线性模型PanelOLS和statmodels OLS之间的区别

Python中的嵌套Ruby哈希

运行Python脚本时,用作命令行参数的SON文本

scikit-learn导入无法导入名称METRIC_MAPPING64'

ODE集成中如何终止solve_ivp的无限运行

如何获得每个组的时间戳差异?

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

如何并行化/加速并行numba代码?

基于形状而非距离的两个numpy数组相似性

为什么if2/if3会提供两种不同的输出?

如何防止Pandas将索引标为周期?

为什么Python内存中的列表大小与文档不匹配?

使用Python异步地持久跟踪用户输入

如何过滤组s最大和最小行使用`transform`'

使用嵌套对象字段的Qdrant过滤

合并相似列表

如何从数据框列中提取特定部分并将该值填充到其他列中?