You need to enable JavaScript to run this app. 基于Rails实现Amazon S3存储桶文件拉取、OCR转换与清空功能问题
优惠活动
大模型
产品
解决方案
定价
更多

基于Rails实现Amazon S3存储桶文件拉取、OCR转换与清空功能问题

现有代码核心问题
  • 方法名不匹配:perform方法内调用的是get_s3_files,但你定义的S3文件获取方法名为pull_s3_files,调用逻辑完全不匹配
  • 传参逻辑错误:perform调用create_ocr_documents、remove_s3_objects时传入了s3_objects参数,但你定义的两个方法都没有接收参数的声明
  • 基础配置缺失:没有AWS S3客户端初始化逻辑,桶名留空,也没有实现PDF筛选、文件下载到本地临时目录的逻辑
  • 变量作用域混乱:@bucket、@object_key、tmp_file_path等变量没有赋值逻辑,运行时会直接报未定义错误
  • 功能逻辑断层:当前仅调用了PDF版本转换工具,没有对接OCR能力,也没有把S3拉取的文件和转换逻辑的输入路径做关联
  • 删除逻辑不符合需求:现有删除方法只能删单个对象,你需要的是处理完成后清空整个桶,逻辑完全不匹配
修复后的完整可运行代码
require 'tempfile'

class SyncronizeBucketJob < ApplicationJob
  queue_as :default

  # 替换为你实际使用的S3桶名称
  S3_BUCKET_NAME = 'your_bucket_name'
  # 替换为你实际的AWS区域,例如ap-northeast-1
  AWS_REGION = 'your_aws_region'

  def perform
    # 获取桶内所有有效PDF文件
    s3_pdf_objects = get_s3_pdf_objects
    return if s3_pdf_objects.blank?

    # 逐个处理PDF的OCR转换
    s3_pdf_objects.each do |s3_object|
      process_single_pdf(s3_object)
    end

    # 所有文件处理完成后清空S3桶
    clear_s3_bucket
  end

  private

  # 初始化S3资源
  def s3_resource
    @s3_resource ||= Aws::S3::Resource.new(
      region: AWS_REGION
      # 如果你没有通过IAM角色、环境变量配置AWS密钥,可在这里补充access_key_id、secret_access_key参数
    )
  end

  # 筛选桶内所有PDF文件
  def get_s3_pdf_objects
    bucket = s3_resource.bucket(S3_BUCKET_NAME)
    bucket.objects.select do |obj|
      obj.key.end_with?('.pdf') && obj.size > 0
    end
  end

  # 处理单个PDF的下载、转换、OCR、存储
  def process_single_pdf(s3_object)
    # 下载S3文件到本地临时文件
    tmp_pdf = Tempfile.new([File.basename(s3_object.key, '.pdf'), '.pdf'])
    s3_object.download_file(tmp_pdf.path)

    # 生成OCR输出路径
    ocr_output_path = tmp_pdf.path.gsub('.pdf', '_ocr.pdf')

    # 保留你原有的PDF版本转换逻辑
    Courts::Utils::PdfVersionConverter.new(
      input_path: tmp_pdf.path,
      output_path: ocr_output_path
    ).call

    # OCR转换逻辑,以常用的Tesseract为例,可替换为你实际使用的OCR服务
    `tesseract #{tmp_pdf.path} #{ocr_output_path.gsub('.pdf', '')} pdf`

    # 保存OCR结果到你的OcrDocument模型
    OcrDocument.create!(
      original_file_key: s3_object.key,
      ocr_result_file: File.open(ocr_output_path),
      file_size: s3_object.size
    )

    # 清理本地临时文件
    tmp_pdf.close
    tmp_pdf.unlink
    File.delete(ocr_output_path) if File.exist?(ocr_output_path)
  end

  # 清空整个S3桶
  def clear_s3_bucket
    bucket = s3_resource.bucket(S3_BUCKET_NAME)
    bucket.objects.batch_delete!
  end
end
运行前检查项
  • 先在Gemfile添加依赖:gem 'aws-sdk-s3'、gem 'rtesseract'(如果使用Tesseract做OCR,需要提前在服务器安装Tesseract运行环境),执行bundle install生效
  • 确认AWS账号权限:你使用的密钥/角色需要有S3桶的s3:GetObject、s3:ListBucket、s3:DeleteObject权限
  • 测试阶段建议先注释掉clear_s3_bucket的调用,确认OCR转换、数据存储逻辑完全正常后再开启删除逻辑,避免误删文件
  • 可根据业务需要添加异常捕获逻辑,处理S3下载失败、OCR转换失败等场景,避免任务异常中断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:18:03