Python Lambda无Flask上传本地图片:修复格式不支持问题
解决Python Lambda处理multipart/form-data图片上传后格式异常的问题
当Lambda收到multipart/form-data格式的请求时,event的body里会包含分隔边界、文件头这类冗余信息,直接保存的话必然导致图片格式损坏。下面是具体的修复方案:
核心处理步骤
- 从请求的
Content-Type头里提取multipart的分隔边界 - 对event的body进行Base64解码(Lambda默认会把二进制请求体编码成Base64格式)
- 用分割边界拆分内容,剔除无效块,提取真实的图片二进制数据
- 将纯二进制数据写入目标路径(Lambda临时目录或存储服务)
完整代码示例
import base64 import os def lambda_handler(event, context): # 1. 从Content-Type中获取分隔边界(兼容大小写的header键) content_type = event['headers'].get('Content-Type') or event['headers'].get('content-type') boundary = content_type.split('boundary=')[-1].strip() # 2. 解码Base64格式的请求体 decoded_body = base64.b64decode(event['body']) # 3. 用边界拆分内容,过滤空元素并定位文件块 parts = decoded_body.split(f'--{boundary}'.encode()) file_content = None for part in parts: if b'Content-Disposition: form-data' in part: # 拆分文件头与实际内容(以两个连续换行符为分隔) header, content = part.split(b'\r\n\r\n', 1) # 移除尾部的换行符和结束边界标记 file_content = content.rstrip(b'\r\n--') break if not file_content: return {'statusCode': 400, 'body': '未找到有效文件'} # 4. 保存到Lambda临时目录(可替换为S3上传逻辑) # 可选:从header中提取原文件名 header_str = header.decode('utf-8') filename = [item for item in header_str.split(';') if 'filename' in item][0].split('=')[-1].strip('"') save_path = os.path.join('/tmp', filename) with open(save_path, 'wb') as f: f.write(file_content) return { 'statusCode': 200, 'body': f'图片已成功保存至 {save_path}' }
关键细节说明
- 边界提取:注意请求头的键可能是
Content-Type或小写的content-type,需兼容两种情况 - Base64解码:若Lambda未配置
Binary Media Types,请求体默认会被Base64编码,必须解码才能拿到原始二进制数据 - 内容拆分:每个multipart块的结构为
边界 + 头信息 + 两个换行 + 文件内容,拆分后要剔除尾部的结束标记和冗余换行 - 动态文件名:可以从
Content-Disposition头里的filename字段提取原文件名,让代码适配不同格式的图片上传
内容的提问来源于stack exchange,提问作者kirthika S
相关产品推荐
相关产品推荐

