2017-10-12 16 views
1

, 나는 백그라운드 작업에서이 작업을 수행하고 싶습니다 . Sidekiq 또는 Resque와 같은 인기있는 백그라운드 작업 옵션은 매개 변수를 저장하기 위해 Redis에 의존하므로 redis를 통해 파일 개체를 전달할 수 없습니다.패스 파일은 내가 큰 업로드,</p> <pre><code>def create file = params[:file] upload = Upload.create(file: file, filename: "img.png") end </code></pre> <p>그러나 표준 파일 입력을 통해 요청 PARAMS에서 파일을 수신하고있어

나는 Tempfile을 사용할 수 있지만 Heroku와 같은 일부 플랫폼에서는 로컬 저장소가 신뢰할 수 없습니다.

"모든"플랫폼에서 신뢰할 수있는 옵션은 무엇입니까?

답변

0

먼저 (로컬 또는 AWS S3) 파일을 저장해야합니다. 그런 다음 파일 경로 또는 uuid을 백그라운드 작업에 대한 매개 변수로 전달하십시오.

매개 변수에 Tempfile이 전달되는 것을 피하기 위해 을 강력히 권장합니다. 이 개체는 오래된 개체가 메모리에 저장되어 오래된 데이터 문제가 발생합니다.

1

Amazon S3과 같은 서비스에 직접 업로드 한 다음 배경 작업에 적합한 것으로 파일을 처리하는 것이 좋습니다.

사용자가 파일을 업로드하면 안전하게 S3에 저장된다는 확신을 가질 수 있습니다. 공용 액세스를 금지하기 위해 개인 버킷을 사용할 수 있습니다. 그런 다음 백그라운드 작업에서 파일의 S3 URI를 전달하고 백그라운드 작업자가 파일을 다운로드하도록하여 업로드를 처리 할 수 ​​있습니다.

백그라운드 작업자가 파일을 어떻게 처리하는지 알 수는 없지만 다시 다운로드하면 필요하지 않을 수도 있습니다. 결국 어딘가에 저장됩니다.

저는 과거에 carrierwave-direct 보석을 성공으로 사용했습니다. 당신이 Heroku를 언급하고 있기 때문에, 그들은 S3에 직접 파일을 업로드하기위한 상세한 guide을 가지고 있습니다. 당신이 이미지 업로드 속도 또는 배경으로 밀어 중 원하는처럼

0

없음 임시 파일은

소리가 난다. 여기에 my suggestions from another post입니다. 그것이 당신이 찾고있는 것이라면 그들은 당신을 도울 것입니다.

내가이 질문을 발견 한 이유는 CSV 파일을 저장하고 배경 작업을 해당 파일의 정보가있는 데이터베이스에 추가하려고했기 때문입니다.

나는 해결책이있다.

질문이 약간 불분명하고 나 자신의 질문을 게시하고 내 자신의 질문에 대답하기에는 너무 게으르므로 여기에 답변을 게시 할 것입니다. lol

다른 친구들과 마찬가지로 클라우드 스토리지 서비스에 파일을 저장하십시오. Amazon의 경우 :

# 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 

이 정보가 필요합니다.또한 마이그레이션

# 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 

과 작업을 필요 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 

에서 동일한 코드 그러나 다른 버킷 이름을 사용

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