Yaf*_*ili 7 python pdf amazon-s3 boto3 fastapi
我想从 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")
Run Code Online (Sandbox Code Playgroud)
此 API 返回200状态代码,但不返回 PDF 文件作为响应。
由于整个文件数据已加载到内存中,因此没有实际原因使用StreamingResponse. 您应该改为使用Response, 通过传递文件字节(用于BytesIO.getvalue()获取包含缓冲区全部内容的字节)、定义media_type以及设置Content-Disposition标题,以便可以在浏览器中查看 PDF 文件或将其下载到用户的设备。有关更多详细信息和示例,请查看此答案以及此和此。相关答案也可以在这里找到。
另外,由于调用方法buffer时 会被丢弃close(),因此您还可以使用 FastAPI/Starlette在返回响应后BackgroundTasks关闭buffer,以释放内存。或者,您可以使用 获取字节pdf_bytes = buffer.getvalue(),然后使用 关闭缓冲区buffer.close(),最后使用return Response(pdf_bytes, headers=...。
from fastapi import Response, BackgroundTasks
@app.get("/pdf")
def get_pdf(background_tasks: BackgroundTasks):
buffer = io.BytesIO() # BytesIO stream containing the pdf data
# ...
background_tasks.add_task(buffer.close)
headers = {'Content-Disposition': 'inline; filename="out.pdf"'}
return Response(buffer.getvalue(), headers=headers, media_type='application/pdf')
Run Code Online (Sandbox Code Playgroud)
要下载 PDF 文件而不是在浏览器中查看,请使用:
headers = {'Content-Disposition': 'attachment; filename="out.pdf"'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9164 次 |
| 最近记录: |