使用boto3上传内存中XLS文件至S3时遇参数验证错误求助
解决boto3上传内存中XLS文件到S3的参数验证错误
我来帮你搞定这个问题——错误提示里的ParamValidationError说明你传给put_object的Body参数类型不符合boto3的要求,它不接受你当前传入的<class '__main__.portfolio_object'>这种自定义类型。
先给你划重点:boto3的put_object方法里,Body参数只认这几种类型:bytes二进制数据、类文件对象(比如BytesIO)、文本字符串(文本字符串只适合纯文本文件,XLS这种二进制文件优先用前两种)。
你贴的代码里用open(ep, "rb").read()得到的是bytes类型,理论上是能正常上传的,但错误提示显示你实际传的是自定义的portfolio_object,说明你运行的代码和贴出来的不一样?不管怎样,我给你两种靠谱的内存中XLS文件上传方案:
方案1:传入bytes二进制数据
如果你是在内存中生成了XLS的二进制内容(比如从其他对象导出),先确保它是bytes类型,再直接传入:
# 假设你已经通过某种方式得到了内存中的XLS二进制数据 portfolio_binary = b"..." # 替换成你的实际XLS二进制内容 # 上传到S3 s3_client.put_object(Body=portfolio_binary, Bucket='test', Key='test/test/test.xlsx')
比如用pandas生成XLS到内存再转bytes的完整示例:
import pandas as pd from io import BytesIO import boto3 s3_client = boto3.client('s3') # 生成示例表格数据 df = pd.DataFrame({'序号': [1, 2], '内容': ['测试1', '测试2']}) # 将XLS写入内存中的BytesIO对象 output = BytesIO() with pd.ExcelWriter(output, engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='Sheet1') output.seek(0) # 务必将文件指针移到开头 portfolio_binary = output.getvalue() # 转换成bytes类型 # 上传到S3 s3_client.put_object(Body=portfolio_binary, Bucket='test', Key='test/test/test.xlsx')
方案2:直接传入类文件对象
如果你已经有一个类文件对象(比如BytesIO),可以不用转成bytes,直接传入Body:
output.seek(0) # 一定要先把指针移到文件开头 s3_client.put_object(Body=output, Bucket='test', Key='test/test/test.xlsx')
错误根源梳理
你遇到的问题核心是:实际传入的Body是portfolio_object这种自定义类型,boto3无法识别它。你需要检查这个对象有没有导出二进制数据的方法——比如如果它是某个XLS处理库的实例,可能有save()到BytesIO或者to_bytes()之类的方法,把它转换成boto3能接受的类型再传进去就行。
内容的提问来源于stack exchange,提问作者Tampa
相关产品推荐
相关产品推荐

