基于Amazon API Gateway p26的单文件转多文件上传改造咨询
改造Lambda函数支持多文件上传到S3
嘿,我看你已经把HTML表单改成多文件选择模式了,现在只需要调整Lambda函数的逻辑,就能实现批量上传啦!咱们直接看怎么改:
现有代码的问题
原来的Lambda代码只处理了单个名为file的表单字段,而且只上传一次文件。现在你的HTML里用了name="file[]"的多文件输入,每个选中的文件都会作为一个独立的form-data部分被发送,所以需要遍历所有带文件名的部分,逐个上传到S3。
修改后的Lambda函数代码
import json import base64 import boto3 import email def lambda_handler(event, context): s3 = boto3.client("s3") post_data = base64.b64decode(event['body']) content_type = event["headers"]['content-type'] ct = "Content-Type: "+content_type+"\n" # 解析multipart表单数据 msg = email.message_from_bytes(ct.encode()+post_data) uploaded_files = [] # 处理多部分内容 if msg.is_multipart(): for part in msg.get_payload(): # 只处理带文件名的文件部分 filename = part.get_filename() if filename: # 获取解码后的文件内容 file_content = part.get_payload(decode=True) # 上传到S3 try: s3.put_object( Bucket="zdjeciatotxt", Key=filename, Body=file_content ) uploaded_files.append(filename) except Exception as e: return { 'statusCode': 500, 'body': json.dumps(f"上传文件 {filename} 失败: {str(e)}") } else: return { 'statusCode': 400, 'body': json.dumps("请求格式错误,请使用multipart/form-data格式") } # 返回成功上传的文件列表 return { 'statusCode': 200, 'body': json.dumps(f"成功上传以下文件: {', '.join(uploaded_files)}") }
关键改动说明
- 批量处理逻辑:遍历所有
form-data部分,只要是带文件名的部分(也就是用户选中的文件),就单独上传到S3 - 错误处理:给每个文件上传添加异常捕获,哪个文件出问题就返回对应的错误信息,不会因为一个文件失败导致全部上传终止
- 结果反馈:新增
uploaded_files列表记录成功上传的文件名,最后返回给前端明确的成功提示 - 简化结构:去掉了原来的
multipart_content字典,直接按需处理每个文件,减少不必要的内存占用
额外注意事项
- API Gateway大小限制:默认情况下API Gateway的请求大小上限是10MB,如果需要上传更大的文件,需要在API Gateway的设置里调整
payload limit,或者考虑用S3预签名URL的方式(不过小文件用当前方案完全没问题) - 文件名覆盖问题:如果用户上传同名文件,会直接覆盖S3里的现有文件。要是想避免覆盖,可以给文件名加前缀,比如拼接时间戳:
from datetime import datetime # 替换Key的赋值 Key=f"{datetime.now().strftime('%Y%m%d%H%M%S')}_{filename}" - 权限验证:确保Lambda的IAM角色已经拥有S3的
PutObject权限,这个你原来单文件上传时应该已经配置好了,多文件上传不需要额外权限
内容的提问来源于stack exchange,提问作者Ewa Malkowska
相关产品推荐
相关产品推荐

