Как загрузить файл xls в корзину S3, используя ruby на рельсах - PullRequest
0 голосов
/ 30 апреля 2020

В нашем проекте 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

1 Ответ

1 голос
/ 30 апреля 2020

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

Amazon дает вам ответ:

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 / электронных таблицах с произвольным именем файла.

...