我想从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文件作为响应。
2条答案
按热度按时间ymdaylpp1#
由于整个文件数据已经加载到内存中,因此没有使用
StreamingResponse
的实际原因。您应该改为使用Response
,通过传递文件字节(使用BytesIO.getvalue()
获取包含缓冲区全部内容的字节),定义media_type
,以及设置Content-Disposition
头,以便PDF文件可以在浏览器中查看或下载到用户的设备。有关更多详细信息和示例,请查看this answer以及this和this。相关答案也可以在here中找到。此外,由于调用
close()
方法时会丢弃buffer
,因此您也可以使用FastAPI/Starlette的BackgroundTasks
在返回响应后关闭buffer
,以释放内存。或者,您可以使用pdf_bytes = buffer.getvalue()
获取字节,然后使用buffer.close()
关闭缓冲区,最后使用return Response(pdf_bytes, headers=...
。示例
要下载PDF文件而不是在borwser中查看,请用途:
bmvo0sr52#
我的缓冲区和代码发送pdf作为一个可下载的链接在http://127.0.0.1:8000/docs添加在标题字典“content-type”:“application/octet-stream”