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

如何将本地目录指定后缀的文件上传至S3存储桶

批量上传.xlsx文件到S3的实现方案

你的现有代码是单文件上传的封装,只需补充文件遍历逻辑即可完成批量上传,修改方案如下:

1. 获取指定目录下所有.xlsx文件

使用Ruby内置的Dir.glob方法即可批量匹配指定后缀的文件:

  • 递归遍历目标目录及所有子目录下的.xlsx文件:Dir.glob("#{目标目录路径}/**/*.xlsx")
  • 仅遍历目标目录第一层的.xlsx文件(不包含子目录):Dir.glob("#{目标目录路径}/*.xlsx")

2. 完整可运行代码示例

# 原有单文件上传类,补充缺失的s3_resource初始化逻辑
class S3Uploader
  def initialize(bucket:, object_key:, input_file_path:)
    @bucket = bucket
    @object_key = object_key
    @input_file_path = input_file_path
  end

  def call
    object = s3_resource.bucket(bucket).object(object_key)
    object.upload_file(input_file_path)
  end

  private

  attr_reader :bucket, :object_key, :input_file_path

  # 请根据你的实际配置修改S3初始化参数
  def s3_resource
    @s3_resource ||= Aws::S3::Resource.new(
      region: '你的S3服务区域,如us-east-1、cn-north-1'
      # 如果你已经在环境变量中配置了AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,无需额外传credentials参数
    )
  end
end

# ------------------- 批量上传调用逻辑 -------------------
# 请修改下方三个参数为你的实际配置
local_xlsx_dir = '/Users/xxx/documents/excel_files' # 本地存放xlsx的目录路径
s3_bucket_name = 'your-bucket-name' # 你的S3存储桶名称
s3_save_prefix = 'excel_uploads/' # 上传到S3后的路径前缀,不需要可以留空

Dir.glob("#{local_xlsx_dir}/**/*.xlsx").each do |xlsx_file_path|
  # 生成S3的object_key,保留本地相对路径避免同文件名覆盖
  file_relative_path = Pathname.new(xlsx_file_path).relative_path_from(Pathname.new(local_xlsx_dir))
  s3_object_key = "#{s3_save_prefix}#{file_relative_path}"

  # 执行上传
  S3Uploader.new(
    bucket: s3_bucket_name,
    object_key: s3_object_key,
    input_file_path: xlsx_file_path
  ).call
  puts "上传完成:#{xlsx_file_path} => s3://#{s3_bucket_name}/#{s3_object_key}"
end

可选优化项

  • 可以添加异常捕获逻辑,避免单个文件上传失败中断整个批量任务
  • 大文件上传可以添加upload_file的分块上传参数,提高传输稳定性
  • 如果需要去重,可以在遍历前先对比本地文件和S3已存文件的哈希值再决定是否上传

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:48:01