You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中将FPDF对象上传到AWS S3的参数校验错误处理咨询

错误原因

S3的put_object方法的Body参数仅支持字节、字节数组或类文件对象类型,你直接传入FPDF实例对象不符合参数校验规则,所以抛出该错误。

解决方案

FPDF库的output()方法支持直接返回PDF的字节内容,不需要先写入本地磁盘,只需调整两处代码即可解决问题:

  1. 调用pdf.output()获取PDF字节流作为Body参数的值
  2. 修正S3路径拼接逻辑,避免目录和文件名之间缺少分隔符导致路径错误
  3. 额外优化:避免使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 13:06:03