如何将本地目录指定后缀的文件上传至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
相关产品推荐
相关产品推荐

