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

Python Lambda将Base64转DICOM后上传AWS S3失败求助

解决Lambda将Base64转DCM文件上传S3的问题

一、先确认Lambda执行角色权限

你的S3桶启用了「Block all public access」,必须通过IAM角色授权让Lambda拥有上传权限,不能依赖公开访问策略。给Lambda的执行角色添加以下IAM权限策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::你的桶名/*"
        }
    ]
}

注意替换你的桶名为实际存储桶名称,确保Resource路径覆盖你要上传的目标前缀。

二、正确的代码实现方案

Lambda的本地可写目录只有/tmp,Base64解码后可直接用字节流上传(更高效),以下是两种可行方案:

方案1:直接用put_object上传字节流(推荐)

跳过本地文件写入,直接把解码后的DCM字节数据上传到S3:

import boto3
import base64

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    # 从event中获取Base64编码的DCM数据(移除可能的前缀如"data:application/dicom;base64,")
    base64_data = event['body'].split(',')[-1] if ',' in event['body'] else event['body']
    
    # 解码Base64为字节流
    dcm_bytes = base64.b64decode(base64_data)
    
    # 上传到S3
    bucket_name = "你的桶名"
    s3_key = "目标路径/文件名.dcm"  # 示例:"dicom_files/patient_001.dcm"
    
    try:
        s3_client.put_object(
            Bucket=bucket_name,
            Key=s3_key,
            Body=dcm_bytes
        )
        return {"statusCode": 200, "message": "上传成功"}
    except Exception as e:
        print(f"上传失败:{str(e)}")
        return {"statusCode": 500, "message": f"上传失败:{str(e)}"}

方案2:写入临时文件后用upload_file上传

如果必须用本地文件方式,确保文件写入/tmp目录:

import boto3
import base64
import os

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    base64_data = event['body'].split(',')[-1] if ',' in event['body'] else event['body']
    dcm_bytes = base64.b64decode(base64_data)
    
    # 写入Lambda临时目录
    temp_file_path = "/tmp/temp.dcm"
    with open(temp_file_path, 'wb') as f:
        f.write(dcm_bytes)
    
    bucket_name = "你的桶名"
    s3_key = "目标路径/文件名.dcm"
    
    try:
        s3_client.upload_file(temp_file_path, bucket_name, s3_key)
        # 可选:清理临时文件
        os.remove(temp_file_path)
        return {"statusCode": 200, "message": "上传成功"}
    except Exception as e:
        print(f"上传失败:{str(e)}")
        return {"statusCode": 500, "message": f"上传失败:{str(e)}"}

三、常见排查要点

  • 查看CloudWatch日志:Lambda执行日志会明确给出失败原因(比如AccessDenied、NoSuchBucket、解码错误等),这是最快定位问题的方式。
  • 验证Base64数据有效性:部分输入会带data:application/dicom;base64,前缀,必须移除后再解码,否则会导致解码失败。
  • 确认桶名和路径正确性:检查桶名拼写,S3 key路径若含特殊字符需做URL编码。
  • VPC环境权限检查:如果Lambda在VPC内运行,需确保VPC配置了S3访问权限(VPC端点或NAT网关)。

内容的提问来源于stack exchange,提问作者Talha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:42:52