如何使用RubyonRails将excel文件上载到S3 bucket中

如何使用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

在我们的rails 6项目中,我想将excel文件上传到S3 bucket中,并将文件链接发送到电子邮件,并提供从电子邮件下载xls功能。请帮帮我

我已经使用下面的代码生成了excel文件,并且在我们的项目中设置了S3配置

 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中。

我是如何解决此问题的?
  • 生成excel工作表
  • time=time.zone.now.strftime(“%Y%m%d%H%m%S”)
    xlsx=GenerateSpreadsheetService.new(所有数据、文件名)。调用
    
  • 创建一个空目录
  • path=Tempfile.new(“data_35;{time}.xlsx”).path
    
  • 将excel文件写入此目录
  • 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)
    
  • 保存公共\u url和预签名\u url
  • 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')