如何用FastAPI从内存缓冲区返回PDF?S3读取后无文件返回问题排查
解决FastAPI从S3获取PDF返回无文件的问题
你的代码返回200但没有PDF内容,核心原因是:使用s3.download_fileobj将文件写入io.BytesIO()后,字节流的指针停留在了数据流末尾,StreamingResponse从当前指针位置开始读取,自然读不到任何内容。
修正后的代码如下:
@router.post("/pdf_document") def get_pdf(document : PDFRequest) : s3 = boto3.client('s3') file_name = document.name f = io.BytesIO() s3.download_fileobj('adm2yearsdatapdf', file_name, f) # 重置字节流指针到起始位置,确保能读取完整内容 f.seek(0) return StreamingResponse( f, media_type="application/pdf", headers={"Content-Disposition": f"attachment; filename={file_name}"} )
关键说明:
f.seek(0)是必须的操作,把字节流的读取指针移到开头,让StreamingResponse能获取到完整的PDF数据。- 添加
Content-Disposition响应头,可以让浏览器自动识别这是PDF附件,直接触发下载或者在页面内预览,优化前端的交互体验。
内容的提问来源于stack exchange,提问作者Yafaa Ben Tili
相关产品推荐
相关产品推荐

