[REDIS] 활성 작업 / 백그라운드 작업에 파일 전달
REDIS활성 작업 / 백그라운드 작업에 파일 전달
나는 표준 파일 입력을 통해 요청 PARAMS에서 파일을 수신하고있어
def create
file = params[:file]
upload = Upload.create(file: file, filename: "img.png")
end
그러나, 대형 업로드, 나는 백그라운드 작업에서이 작업을 수행하고 싶습니다. Sidekiq 또는 Resque 같은 인기 백그라운드 작업 옵션은 그냥 레디 스를 통해 파일 오브젝트를 통과 할 수 있도록 매개 변수를 저장하기 위해 레디 스에 따라 달라집니다.
나는 임시 파일을 사용할 수 있지만 같은 Heroku가 같은 일부 플랫폼에서, 로컬 스토리지는 신뢰할 수 없습니다.
어떤 옵션 나는 "어떤"플랫폼이 신뢰할 수 있도록해야합니까?
해결법
-
==============================
1.당신이 백그라운드 작업에 맞는 볼로 내가 파일을 처리 한 후 아마존 S3와 같은 서비스에 직접 업로드 건의 할 것입니다.
당신이 백그라운드 작업에 맞는 볼로 내가 파일을 처리 한 후 아마존 S3와 같은 서비스에 직접 업로드 건의 할 것입니다.
사용자가 파일을 업로드 할 때, 당신은 휴식을 안전하게 S3에 저장됩니다 드릴 수 있습니다. 당신은 공용 액세스를 금지하기위한 개인 물통을 사용할 수 있습니다. 그런 다음, 백그라운드 작업에서 해당 파일의 S3 URI를 전달하여 업로드를 처리하고 배경 작업자가 파일을 다운로드하도록 할 수 있습니다.
나는 당신의 배경 작업자가 파일을 수행하는지는 모르겠지만, 다시 다운로드하는 것은 필요하지 않을 수도있는 것은 물론이다. 그것은 결국 어딘가에 저장합니다.
나는 성공 과거에 carrierwave-직접 보석을 사용했습니다. 당신에게 Heroku를 언급하고 있기 때문에, 그들은 업로드에 대한 자세한 안내는 S3에 파일을 직접 있습니다.
-
==============================
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.먼저 (로컬 또는 AWS S3 중 하나를) 저장 장치에 파일을 저장해야합니다. 그런 다음 파일 경로를 통과하거나 백그라운드 작업에 매개 변수로 UUID.
먼저 (로컬 또는 AWS S3 중 하나를) 저장 장치에 파일을 저장해야합니다. 그런 다음 파일 경로를 통과하거나 백그라운드 작업에 매개 변수로 UUID.
난 강력 매개 변수에 임시 파일을 전달 피하는 것이 좋습니다. 오래된 데이터의 문제를 일으키는, 날짜 밖으로 얻을 수있는 메모리에있는이 저장 객체입니다.
from https://stackoverflow.com/questions/46705045/pass-file-to-active-job-background-job by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 레디 스와 통신 할 컬을 남용 (0) | 2020.02.20 |
---|---|
[REDIS] SSL을 통해 레디 스에 셀러리 연결 한 후 응답이 없습니다 (0) | 2020.02.17 |
[REDIS] 레디 스에게 평가 명령을 실행하는 것은 nodeJS에서 루아 스크립트를 실행하려면 (0) | 2020.02.15 |
[REDIS] 레디 스에서 SCAN / HSCAN 명령에 대한 COUNT의 권장 값이 있습니까? (0) | 2020.02.15 |
[REDIS] 레디 스`SCAN` : 방법과 일치하는 적절한 시간에 최종 결과를 확인 할 수 키를 newcomming 사이의 균형을 유지하기 위해? (0) | 2020.02.13 |