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

如何在S3-Lambda-SQS-EC2链路中下载文件名含空格的S3文件

问题根因

S3触发Lambda事件时,事件体中s3.object.key字段为URL编码格式:空格会被编码为+,其余特殊字符会按规则做百分号编码。现有代码未对该字段做解码就直接拼接S3路径发送至SQS,导致EC2端解析得到的对象键包含编码字符,与S3中存储的实际对象键不匹配,调用下载接口时返回404。

修复方案

核心修复逻辑在Lambda侧,对S3事件传递的对象键做标准URL解码即可,无需自定义编码规则,也无需大幅调整现有链路逻辑。

  1. 在Lambda代码中引入URL解码依赖,修正对象键获取逻辑:
    # 代码顶部导入标准库工具
    from urllib.parse import unquote_plus
    import json
    
    # 捕获S3事件信息的逻辑调整为
    s3_bucket = event['Records'][0]['s3']['bucket']['name']
    # 对编码后的对象键做解码,自动还原空格、特殊字符为原始值
    s3_key = unquote_plus(event['Records'][0]['s3']['object']['key'])
    
  2. 原有JSON序列化、发送SQS的逻辑无需修改,此时拼接得到的s3://路径已经使用原始对象键:
    # 原有逻辑保持不变即可
    sqs_message = json.dumps({'from_s3': 's3://{b}/{k}'.format(b=s3_bucket, k=s3_key)})
    # 后续调用SQS发送接口的逻辑正常执行
    
注意事项
  • 不要用简单的replace('+', ' ')处理key,该方式无法兼容中文、/、特殊符号等其他被百分号编码的字符,使用标准库unquote_plus是处理S3事件对象键的标准方案。
  • EC2端现有正则解析逻辑无需调整,修复后从SQS消息中解析得到的s3_key就是S3中存储的真实键值,直接传入boto3的download_file方法即可正常完成下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:24:30