在AWS Lambda Python中解析FormData提交的Base64内容,提取用户名与文件
从Multipart FormData中提取用户名与文件内容
你当前拿到的是multipart/form-data格式的原始字节流,手动分割解析容易出错,推荐用以下两种方案处理:
方案1:使用multipart库(推荐)
该库专门用于解析multipart类型数据,步骤如下:
- 若Lambda环境未预装
multipart,需将其打包为Lambda层或包含在部署包中。 - 解析代码示例:
import base64 import multipart def lambda_handler(event, context): # 解码Base64编码的请求体 body_bytes = base64.b64decode(event['body']) # 从请求头中提取boundary分隔符 content_type = event['headers']['Content-Type'] boundary = content_type.split('boundary=')[1].encode('utf-8') # 初始化解析器并处理数据 parser = multipart.MultipartParser(body_bytes, boundary) username = None file_content = None file_name = None for part in parser.parts(): if part.name == 'username': username = part.text elif part.name == 'file': file_name = part.filename # 文本文件解码为字符串,二进制文件直接保留bytes file_content = part.raw.read().decode('utf-8') return { 'statusCode': 200, 'body': { 'username': username, 'file_name': file_name, 'file_content': file_content } }
方案2:使用Python标准库cgi(无需额外依赖)
如果不想引入第三方库,可利用Python内置的cgi模块模拟表单解析环境:
import base64 import cgi from io import BytesIO def lambda_handler(event, context): body_bytes = base64.b64decode(event['body']) content_type = event['headers']['Content-Type'] # 构建CGI解析所需的环境变量与输入流 environ = { 'CONTENT_TYPE': content_type, 'CONTENT_LENGTH': str(len(body_bytes)) } fp = BytesIO(body_bytes) # 解析表单数据 form = cgi.FieldStorage(fp=fp, environ=environ, keep_blank_values=True) # 提取字段值 username = form.getvalue('username') file_item = form['file'] file_name = file_item.filename # 文本文件转字符串,二进制文件保留bytes file_content = file_item.file.read().decode('utf-8') return { 'statusCode': 200, 'body': { 'username': username, 'file_name': file_name, 'file_content': file_content } }
关键注意点
- 若上传的是二进制文件(如图片、压缩包),请移除
decode('utf-8'),直接保留bytes类型,方便后续存储到S3等服务。 - 使用第三方库时,需确保Lambda环境能访问到该库(通过层或打包部署)。
- 确认API Gateway集成设置为传递原始Base64请求体,不要自动解析。
内容的提问来源于stack exchange,提问作者ReactNewbie123
相关产品推荐
相关产品推荐

