복붙노트

[REDIS] 활성 작업 / 백그라운드 작업에 파일 전달

REDIS

활성 작업 / 백그라운드 작업에 파일 전달

나는 표준 파일 입력을 통해 요청 PARAMS에서 파일을 수신하고있어

def create
  file = params[:file]
  upload = Upload.create(file: file, filename: "img.png")
end

그러나, 대형 업로드, 나는 백그라운드 작업에서이 작업을 수행하고 싶습니다. Sidekiq 또는 Resque 같은 인기 백그라운드 작업 옵션은 그냥 레디 스를 통해 파일 오브젝트를 통과 할 수 있도록 매개 변수를 저장하기 위해 레디 스에 따라 달라집니다.

나는 임시 파일을 사용할 수 있지만 같은 Heroku가 같은 일부 플랫폼에서, 로컬 스토리지는 신뢰할 수 없습니다.

어떤 옵션 나는 "어떤"플랫폼이 신뢰할 수 있도록해야합니까?

해결법

  1. ==============================

    1.당신이 백그라운드 작업에 맞는 볼로 내가 파일을 처리 한 후 아마존 S3와 같은 서비스에 직접 업로드 건의 할 것입니다.

    당신이 백그라운드 작업에 맞는 볼로 내가 파일을 처리 한 후 아마존 S3와 같은 서비스에 직접 업로드 건의 할 것입니다.

    사용자가 파일을 업로드 할 때, 당신은 휴식을 안전하게 S3에 저장됩니다 드릴 수 있습니다. 당신은 공용 액세스를 금지하기위한 개인 물통을 사용할 수 있습니다. 그런 다음, 백그라운드 작업에서 해당 파일의 S3 URI를 전달하여 업로드를 처리하고 배경 작업자가 파일을 다운로드하도록 할 수 있습니다.

    나는 당신의 배경 작업자가 파일을 수행하는지는 모르겠지만, 다시 다운로드하는 것은 필요하지 않을 수도있는 것은 물론이다. 그것은 결국 어딘가에 저장합니다.

    나는 성공 과거에 carrierwave-직접 보석을 사용했습니다. 당신에게 Heroku를 언급하고 있기 때문에, 그들은 업로드에 대한 자세한 안내는 S3에 파일을 직접 있습니다.

  2. ==============================

    2.없음 임시 파일 없습니다

    없음 임시 파일 없습니다

    당신이 이미지 업로드 최대 중 속도를 원하거나 배경에 밀어 넣 것 같은데. 여기에 또 다른 포스트에서 내 제안이다. 즉 당신이 찾고있는 거라면 어쩌면 그들은 당신을 도울 것입니다.

    나는 CSV 파일을 저장하고 해당 파일의 정보와 데이터베이스에 대한 나의 백그라운드 작업 추가 기능을 가지고 싶었 기 때문에 나는이 질문을 발견하는 이유입니다.

    나는 해결책을 가지고 있습니다.

    당신 때문에 문제는 조금 불분명 나는 내 자신의 질문을 게시하고 내 자신의 질문에 대답하기 너무 게으른 해요, 난 그냥 여기에 대한 답변을 게시합니다. 롤

    다른 친구들 말했듯이, 일부 클라우드 스토리지 서비스에 파일을 저장합니다. 아마존의 경우, 다음이 필요합니다

    # Gemfile
    gem 'aws-sdk', '~> 2.0' # for storing images on AWS S3
    gem 'paperclip', '~> 5.0.0' # image processor if you want to use images
    

    당신은 또한이 필요합니다. production.rb에서 동일한 코드 그러나 다른 버킷 이름을 사용

    # config/environments/development.rb
    Rails.application.configure do
      config.paperclip_defaults = {
        storage: :s3,
        s3_host_name: 's3-us-west-2.amazonaws.com',
        s3_credentials: {
          bucket: 'my-bucket-development',
          s3_region: 'us-west-2',
          access_key_id: ENV['AWS_ACCESS_KEY_ID'],
          secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
        }
      }
    end
    

    또한 마이그레이션이 필요합니다

    # db/migrate/20000000000000_create_files.rb
    class CreateFiles < ActiveRecord::Migration[5.0]
      def change
        create_table :files do |t|
          t.attachment :import_file
        end
      end
    end
    

    및 모델

    class Company < ApplicationRecord
      after_save :start_file_import
    
      has_attached_file :import_file, default_url: '/missing.png'
      validates_attachment_content_type :import_file, content_type: %r{\Atext\/.*\Z}
    
      def start_file_import
        return unless import_file_updated_at_changed?
        FileImportJob.perform_later id
      end
    end
    

    및 작업

    class FileImportJob < ApplicationJob
      queue_as :default
    
      def perform(file_id)
        file = File.find file_id
        filepath = file.import_file.url
    
        # fetch file
        response = HTTParty.get filepath
        # we only need the contents of the response
        csv_text = response.body
        # use the csv gem to create csv table
        csv = CSV.parse csv_text, headers: true
        p "csv class: #{csv.class}" # => "csv class: CSV::Table"
        # loop through each table row and do something with the data
        csv.each_with_index do |row, index|
          if index == 0
            p "row class: #{row.class}" # => "row class: CSV::Row"
            p row.to_hash # hash of all the keys and values from the csv file
          end
        end
      end
    end
    

    컨트롤러에서

    def create
      @file.create file_params
    end
    
    def file_params
      params.require(:file).permit(:import_file)
    end
    
  3. ==============================

    3.먼저 (로컬 또는 AWS S3 중 하나를) 저장 장치에 파일을 저장해야합니다. 그런 다음 파일 경로를 통과하거나 백그라운드 작업에 매개 변수로 UUID.

    먼저 (로컬 또는 AWS S3 중 하나를) 저장 장치에 파일을 저장해야합니다. 그런 다음 파일 경로를 통과하거나 백그라운드 작업에 매개 변수로 UUID.

    난 강력 매개 변수에 임시 파일을 전달 피하는 것이 좋습니다. 오래된 데이터의 문제를 일으키는, 날짜 밖으로 얻을 수있는 메모리에있는이 저장 객체입니다.

  4. from https://stackoverflow.com/questions/46705045/pass-file-to-active-job-background-job by cc-by-sa and MIT license