如何打开使用 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
版本:
- Ruby2.6.6
- Rails 4.2.11
- 载波 0.8.0
- 迷雾 1.38.0
我尝试了 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
我有一个名为 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
版本:
- Ruby2.6.6
- Rails 4.2.11
- 载波 0.8.0
- 迷雾 1.38.0
我尝试了 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