Python中将FPDF对象上传到AWS S3的参数校验错误处理咨询
错误原因
S3的put_object方法的Body参数仅支持字节、字节数组或类文件对象类型,你直接传入FPDF实例对象不符合参数校验规则,所以抛出该错误。
解决方案
FPDF库的output()方法支持直接返回PDF的字节内容,不需要先写入本地磁盘,只需调整两处代码即可解决问题:
- 调用
pdf.output()获取PDF字节流作为Body参数的值 - 修正S3路径拼接逻辑,避免目录和文件名之间缺少分隔符导致路径错误
- 额外优化:避免使用
dir作为变量名,dir是Python内置函数,覆盖会引发潜在问题
修正后的完整代码如下:
import fpdf import boto3 # 原有FPDF生成逻辑不变 pdf = fpdf.FPDF() # Cover page pdf.add_page() pdf.set_font('Arial', 'B', 16) pdf.cell(175, 10, 'TEST - report',0,1,'C') # 修正后的S3上传逻辑 my_bucket = 'my-bucket-name' s3 = boto3.resource('s3') dir_name = 'my-dir-name' # 路径拼接增加斜杠分隔,保证目录层级正确 file_key = f"{dir_name}/test.pdf" # 适配不同版本的FPDF库: # 旧版fpdf库使用:Body=pdf.output(dest='S').encode('latin-1') # 新版PyFPDF2库使用:Body=pdf.output() s3.Bucket(my_bucket).put_object(Key=file_key, Body=pdf.output())
备选方案:使用BytesIO类文件对象上传
如果你后续需要对PDF内容做额外处理,也可以将PDF写入BytesIO类文件对象后再上传:
from io import BytesIO # FPDF生成逻辑和配置不变 pdf_bytes = BytesIO(pdf.output()) s3.Bucket(my_bucket).put_object(Key=file_key, Body=pdf_bytes)
内容的提问来源于stack exchange,提问作者sdom
相关产品推荐
相关产品推荐

