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

如何将本地目录中特定扩展名的文件批量上传至AWS S3存储桶

上传指定扩展名文件到AWS S3的方案

首先明确:s3_client.upload_file() 仅支持上传单个文件,不识别通配符(比如*.log),所以你直接用这个写法会报错。下面提供几种可行的解决方案:

方案1:使用AWS CLI(推荐,无需写代码)

AWS CLI的s3 sync命令原生支持文件过滤,能快速完成批量上传,无需编写代码。命令格式如下:

aws s3 sync ./本地目录路径 s3://你的存储桶名称/目标文件夹 --exclude "*" --include "*.log"
  • --exclude "*":先排除所有文件
  • --include "*.log":再包含所有.log后缀的文件
  • 如果需要递归上传子目录里的.log文件,直接加--recursive参数即可

方案2:使用boto3遍历上传(代码实现)

如果必须用boto3实现,可以结合Python的glob模块匹配目标文件,然后逐个上传:

import boto3
import glob
import os

# 初始化S3客户端
s3_client = boto3.client('s3')

# 本地目录路径
local_dir = './你的本地文件夹路径'
# S3存储桶名称
S3_BUCKET = '你的存储桶名称'
# S3目标文件夹(注意末尾可以加/,也可以不加)
s3_folder = '目标文件夹路径/'

# 匹配当前目录下所有.log文件(递归子目录用glob.glob(f"{local_dir}/**/*.log", recursive=True))
for log_file in glob.glob(f"{local_dir}/*.log"):
    # 获取文件名,用于构造S3对象键
    file_name = os.path.basename(log_file)
    # 构造S3对象的完整键
    s3_key = f"{s3_folder}{file_name}"
    # 执行上传
    s3_client.upload_file(log_file, S3_BUCKET, s3_key)
    print(f"已完成上传: {log_file} -> s3://{S3_BUCKET}/{s3_key}")

如果需要保留本地的目录结构(比如子目录里的.log文件上传到S3对应子目录),可以调整s3_key的构造逻辑:

# 替换本地目录前缀,得到文件相对路径
relative_path = os.path.relpath(log_file, local_dir)
s3_key = f"{s3_folder}{relative_path}"

补充说明

  • boto3没有内置接口直接支持通配符批量上传,核心原因是upload_file和upload_fileobj都是针对单个文件的上传接口
  • 如果上传的文件数量极大,建议使用s3transfer模块(boto3底层依赖的传输工具),它支持并发上传,效率更高,但本质还是基于匹配后的文件列表遍历上传

内容的提问来源于stack exchange,提问作者Shahar Hamuzim Rajuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:25:31