【问题标题】:How to upload an excel file into S3 bucket using ruby on rails如何使用 ruby​​ on rails 将 excel 文件上传到 S3 存储桶
【发布时间】:2020-08-14 15:54:22
【问题描述】:

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

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

 xlsx = GenerateSpreadsheetService.new(all_data, file_name).call

现在我的问题是如何将上述 excel 文件上传到 S3 存储桶并将文件链接发送到电子邮件并提供从电子邮件下载 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
class GenerateSpreadsheetService
  def initialize(data = [], file_name)
    @data = data
    @file_name = file_name
  end

  def call
    ActionController::Base.new().render_to_string(template: "csv_imports/template.xlsx.axlsx", layout: false, formats: [:axlsx], locals: {:data => @data})
  end
end
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

【问题讨论】:

  • 到目前为止你尝试过什么?您能否向我们展示您的代码并告诉我们您遇到了什么具体问题?
  • 嗨@JohnRotenstein,感谢您的评论。我已经在这里分享了我所有的代码,请立即查看..

标签: ruby ruby-on-rails-3 amazon-s3 axlsx


【解决方案1】:

https://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html

亚马逊给你答案:

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')

您只需要设置区域、存储桶名称,然后最后一行的文件路径就是您存储此 xls 文件的位置。看起来您将其存储在 /public/spreadsheets 中,并带有一些随机文件名。

【讨论】:

  • 嗨@tgmerritt,感谢您的评论,我想知道如何将文件的路径设置为S3。 /public/spreadsheets 是我第一次存储输入 excel 文件的本地目录,但实际上我想上传输出 excel 文件,该文件我没有存储在 xlsx = GenerateSpreadsheetService.new(all_data, file_name ).调用
  • 您应该先将文件写入某个目录。如果您尝试创建一个文件并将其保存在内存中并上传到 S3,那么您将度过一段糟糕的时光。只需使 call() 函数以将文件写入磁盘结束,然后立即排队上传任务。
【解决方案2】:

我是如何解决这个问题的?

  1. 生成excel表格

   time = Time.zone.now.strftime("%Y%m%d%H%M%S")
   xlsx = GenerateSpreadsheetService.new(all_data, file_name).call
  1. 创建一个空目录

   path = Tempfile.new("data_#{time}.xlsx").path
  1. 将excel文件写入该目录

   file = File.open(path,"wb") {|f| f.write(xlsx) }
   s3 = Aws::S3::Resource.new(region: APP_CONFIG["s3_region"], credentials: Aws::Credentials.new(APP_CONFIG["s3_access_key"], APP_CONFIG["s3_secret_key"]))
   obj = s3.bucket(APP_CONFIG["s3_bucket"]).object("data_#{time}.xlsx")
   obj.upload_file(path)
   presigned_url = obj.presigned_url(:put, bucket: APP_CONFIG["s3_bucket"], key: "data_#{time}.xlsx", expires_in: 604800)
  1. 保存 public_url 和 presigned_url

   FileUrl.create(key: "data_#{time}.xlsx", file_public_url: obj.public_url, file_presigned_url: presigned_url) if presigned_url.present?

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2018-02-07
    相关资源
    最近更新 更多