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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:45:02