如何使用RubyonRails将excel文件上载到S3 bucket中
在我们的rails 6项目中,我想将excel文件上传到S3 bucket中,并将文件链接发送到电子邮件,并提供从电子邮件下载xls功能。请帮帮我 我已经使用下面的代码生成了excel文件,并且在我们的项目中设置了S3配置如何使用RubyonRails将excel文件上载到S3 bucket中,ruby,ruby-on-rails-3,amazon-s3,axlsx,Ruby,Ruby On Rails 3,Amazon S3,Axlsx,在我们的rails 6项目中,我想将excel文件上传到S3 bucket中,并将文件链接发送到电子邮件,并提供从电子邮件下载xls功能。请帮帮我 我已经使用下面的代码生成了excel文件,并且在我们的项目中设置了S3配置 xlsx = GenerateSpreadsheetService.new(all_data, file_name).call 现在我的问题是,如何将上述excel文件上传到S3 bucket中,并将文件链接发送到电子邮件,以及如何从电子邮件中提供下载xls功能 clas
xlsx = GenerateSpreadsheetService.new(all_data, file_name).call
现在我的问题是,如何将上述excel文件上传到S3 bucket中,并将文件链接发送到电子邮件,以及如何从电子邮件中提供下载xls功能
class ImportCsvDataJob < ApplicationJob
queue_as :default
def perform(file_name, column)
begin
keywords = []
all_data = []
file_path = get_file_path(file_name)
spreadsheet = Roo::Excelx.new(file_path)
(2..spreadsheet.last_row).each do |i|
keywords << {"language_code": "en", "location_code": 2840, "keyword": "allintitle: #{spreadsheet.row(i)}"}
end
response = GetTaskService.new(keywords).call
response["tasks"].map{|task|
keyword = task["data"]["keyword"].gsub('allintitle: ','')
result = GetTaskService.new.get_values(task["id"])
all_data << {keyword: keyword.to_s, value: result["tasks"][0]["result"][0]["se_results_count"]}
}
## Create records
CsvImport.create(all_data)
## Generate excel file
xlsx = GenerateSpreadsheetService.new(all_data, file_name).call
## send email
SendEmailJob.perform_now(xlsx, file_name)
## remove temp storage file after processing
File.delete(Rails.root + "public/spreadsheets/#{file_name}")
rescue Exception => e
Rails.logger.info "--error-----#{e.message}--"
end
end
end
亚马逊给了你答案:
require 'aws-sdk-s3'
s3 = Aws::S3::Resource.new(region:'us-west-2')
obj = s3.bucket('bucket-name').object('key')
obj.upload_file('/path/to/source/file')
您只需设置区域、bucket名称,然后最后一行上的文件路径就是存储此xls文件的位置。看起来您正在使用一些随机文件名将其存储在/public/spreadsheets中。我是如何解决此问题的?
time=time.zone.now.strftime(“%Y%m%d%H%m%S”)
xlsx=GenerateSpreadsheetService.new(所有数据、文件名)。调用
path=Tempfile.new(“data_35;{time}.xlsx”).path
file=file.open(路径,“wb”){| f | f.write(xlsx)}
s3=Aws::s3::Resource.new(区域:APP_CONFIG[“s3_region”]、凭证:Aws::credentials.new(APP_CONFIG[“s3_访问密钥”]、APP_CONFIG[“s3_密钥”]))
obj=s3.bucket(APP_CONFIG[“s3_bucket”]).object(“data_35;{time}.xlsx”)
对象上传_文件(路径)
预签名的url=obj.presigned的url(:put,bucket:APP_CONFIG[“s3_bucket”],key:“data_35;{time}.xlsx”,expires_in:604800)
FileUrl.create(key:“data#{time}.xlsx”,file_public_url:obj.public_url,file_presigned_url:presigned_url),如果存在presigned_url?
到目前为止,您尝试了什么?你能给我们看看你的代码并告诉我们你遇到了什么具体问题吗?嗨@JohnRotenstein,谢谢你的评论。我已经在这里分享了我所有的代码,请现在检查..Hi@tgmerritt,谢谢你的评论,我想知道如何将文件路径设置为S3/public/spreadsheets是我第一次存储输入excel文件的本地目录,但实际上我想上传输出excel文件,该文件不存储在xlsx=GenerateSpreadsheetService.new(所有数据,文件名)下面的任何目录中。Call您应该先将文件写入某个目录。如果您试图创建一个文件并将其保存在内存中,然后上传到S3,那么您将经历一段糟糕的时光。只需使call()函数以将文件写入磁盘结束,并立即将要上载的任务排队即可。
class SendEmailJob < ApplicationJob
queue_as :default
def perform(xlsx, file_name)
SendEmailService.new(xlsx, file_name).call
end
end
class SendEmailService
def initialize(xlsx, file_name)
@xlsx = xlsx
@email = "test@example.com"
@subject = "excel file"
@file_name = file_name
end
def call
KeywordMailer.send_csv(@email, @subject, @xlsx, @file_name).deliver_now!
end
end
require 'aws-sdk-s3'
s3 = Aws::S3::Resource.new(region:'us-west-2')
obj = s3.bucket('bucket-name').object('key')
obj.upload_file('/path/to/source/file')