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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:06