2016-11-13 1 views
0

나는 Heroku가 장기간의 파일 저장 장치를 가지고 있지 않아서 S3 등으로 이동해야한다는 것을 발견했습니다. 새로운 비트와 조각들이 많아서 CarrierWave-direct을 사용하여 S3로 직접 업로드 한 다음 delayed_job을 처리하는 것이 내 Rails 앱에서 작동하는 방법을 이해해야합니까?레일즈, Amazon S3 스토리지, CarrierWave-Direct 및 delayed_job -이게 맞습니까?

내가 내가 올바르게 코딩 경우 어떻게해야한다고 생각 것은 다음

  1. 내가 설정 내 버킷을 (를) S3 계정에 가입하고 인증 세부 사항은 내가 필요 등 그 수 내가 직접 업로드 화이트리스트 내가 CarrierWave & CarrierWave-direct (또는 유사)에 사용
  2. 내 업로드 (이후 다운로드) 방지에서 크로스 도메인을 중지하지 않는 것이 확인
  3. (적절하게 내 사용자로부터 숨겨진)에서 프로그램에 대한 업로드 중에 내 앱을로드하지 않도록 내 업로드를 만듭니다.
  4. S3는 임의의 액세스 ('파일 이름') 정보를 생성하므로 동일한 이름의 파일을 업로드하는 여러 사용자와 파일을 덮어 쓰는 것에 대해 걱정할 필요가 없습니다. 원본 이름을 신경 쓰면 메타 데이터를 사용하여 저장할 수 있습니다.
  5. CarrierWave-direct은 업로드 후 '업로드 완료'URL로 사용자 브라우저를 리디렉션합니다. 여기서 delayed_job 또는 팝업을 만들 수 있습니다. '죄송합니다. 잘못되었습니다'알림.
  6. 이 시점에서 사용자는 작업이 시도되고 다른 작업으로 이동한다는 것을 알고 있습니다.
  7. delayed_job 작업은 S3 API를 사용하여 파일에 액세스하고 완료되면 입력 파일을 삭제할 수 있습니다.
  8. delayed_job이 완료되어 사용자에게 일반적인 방법으로 예를 들어 알려줍니다. 이메일.

누락 되었습니까? 감사.

답변

0

귀하는 필요한 프로세스에 대해 잘 알고 있습니다. 복잡한 레이어를 한 번 더 던지려면 ---이 모든 것을 새로운 ActiveJob으로 마무리해야합니다. ActiveJob은 귀하가 선택한 프로세서 (귀하의 경우 DelayedJobs)를 통해 단순히 레일 내부의 배경 처리를 처리합니다. 그것은 또한 당신이 덜 번거 로움과 프로세서를 전환 할 수 있습니다,

bin/rails g job process_this_thing 

활성 작업은 작업을 처리하는 몇 가지 "레일 방식"을 제공합니다 ...하지만 그런 다음, 당신은 레일 생성기를 통해 채용 정보를 생성 할 수 있습니다.

따라서 carrierwave 업 로더를 만들 수 있습니다 (carrierwave 문서 참조). 그런 다음 해당 업 로더를 모델에 연결하십시오. carrierwave_direct의 경우 파일 필드와 모델 양식의 연결을 해제하고 파일 필드를 자체 양식으로 이동해야합니다 (carrierwave-direct에서 제공하는 url 메서드 사용).

파일을 업로드하도록 선택한 다음 레코드를 저장할 수 있습니다. 또는 레코드를 저장 한 다음 파일을 처리하십시오. 설정 프로세스는 귀하가 선택한 것에 따라 크게 다릅니다.

Carrierwave 및 carrierwave-direct는 carrierwave 이니셜 라이저에 넣는 안개 자격 증명을 기반으로 파일을 저장할 위치를 결정하고 업 로더에서 store_dir 경로 (설정 한 경우)를 사용하여 알립니다.

Carrierwave는 버전 등을 정의하는 업 로더를 제공합니다. Carrierwave_direct 기능은 S3 버킷에 직접 업로드하고 백그라운드에서 버전을 처리합니다.Active Jobs는 DelayedJobs를 통해 백그라운드 처리를 제공합니다. 안개는 carrierwave와 S3 버킷 사이의 링크입니다.

모델에 boolean 플래그를 추가해야합니다.이 플래그는 carrierwave_direct가 이미지를 업로드 할 때 true로 설정되고 작업 처리가 버전을 처리 할 때 false로 설정되어야합니다. 이렇게하면 끊어진 링크 대신 (작업이 실행 중이고 아직 완료되지 않은 상태에서) '이 문제는 아직 처리 중입니다 ...'와 같이 표시됩니다.

RailsCast는이 작업을 완료하는 데 필요한 완벽한 리소스입니다. 이것을 확인하십시오 : https://www.youtube.com/watch?v=5MJ55_bu_jM