如何打开使用 Carrierwave 和 Fog 上传到 Amazon S3 的 CSV 文件?

How do I open a CSV file that I uploaded with Carrierwave and Fog to Amazon S3?

我有一个名为 client_billing_file 的模型,我在其中使用 Carrierwave 上传 CSV 文件,如下所示:

mount_uploader :billing_file_name, UsageFileUploader

并且我在提交创建新记录后 5 分钟将作业安排到 运行:

after_commit :generate_usage_file, on: :create

def generate_usage_file
  Resque.enqueue_in(5.minutes, GenerateUsageFileQueue, id, admin.email)
end

这是我的后台工作:

def self.perform(client_billing_file_id, email)
  cbf = ClientBillingFile.find(client_billing_file_id)
  filepath = cbf.billing_file_name.current_path
  csv_file = CSV.read(filepath, headers: true)
  .
  .
  .
end

这在我的开发和测试环境中有效,但当我尝试在暂存环境(它实际上将文件上传到 S3 存储桶)中打开 CSV 文件时,它失败了。我检查了存储桶,文件正在正确上传到指定目录,但由于某种原因,作业抛出以下错误:

Exception Errno::ENOENT
Error No such file or directory @ rb_sysopen - my_path/my_file.csv

版本:

我尝试了 Jared Beck 的想法并且现在有效,基本上我将这个条件添加到我的 BG 工作中:

if Rails.env.production? || Rails.env.staging?
  url = cbf.billing_file_name.url
  cbf.billing_file_name.download!(url)
end

所以最终的代码是这样的:

def self.perform(client_billing_file_id, email)
  cbf = ClientBillingFile.find(client_billing_file_id)
  if Rails.env.production? || Rails.env.staging?
    url = cbf.billing_file_name.url
    cbf.billing_file_name.download!(url)
  end
  filepath = cbf.billing_file_name.current_path
  csv_file = CSV.read(filepath, headers: true)
  .
  .
  .
end