복붙노트

[RUBY-ON-RAILS] activestorage의 직접 업로드를 사용하여 S3에 업로드 할 때 어떻게 접두사를 지정하려면?

RUBY-ON-RAILS

activestorage의 직접 업로드를 사용하여 S3에 업로드 할 때 어떻게 접두사를 지정하려면?

표준 S3의 구성 :

AWS_ACCESS_KEY_ID:        [AWS ID]
AWS_BUCKET:               [bucket name]
AWS_REGION:               [region]
AWS_SECRET_ACCESS_KEY:    [secret]

이 5.2 코드 (단지 관련 코드 그림 참조) 레일과 나는 S3 (직접 업로드 사용)에 파일을 업로드 할 수 있습니다 :

form.file_field : my_asset, direct_upload을 : 사실

이것은 효과적으로 양식을 제출하기에, 내 S3 버킷의 루트에 내 자산을 둘 것이다.

어떻게 (나는 S3의 폴더를 모방 할 수 그래서, 예를 들어, "개발 /") 접두어를 지정할 수 있습니다?

해결법

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

    1.죄송합니다, 그 현재 수 없습니다. 활성 저장 독점적으로 사용할 수 있도록 나는 양동이를 만드는 게 좋을 것.

    죄송합니다, 그 현재 수 없습니다. 활성 저장 독점적으로 사용할 수 있도록 나는 양동이를 만드는 게 좋을 것.

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

    2.S3에 나의 현재 해결 방법은 (ActiveStorage가 has_one_attached 및 has_many_attached 매크로 경로를 통과 할 수있는 옵션을 소개 적어도까지)을 move_to 방법을 구현하는 것입니다.

    S3에 나의 현재 해결 방법은 (ActiveStorage가 has_one_attached 및 has_many_attached 매크로 경로를 통과 할 수있는 옵션을 소개 적어도까지)을 move_to 방법을 구현하는 것입니다.

    정상적으로 (버킷의 상단에) 지금처럼 내가 S3에 이미지 저장 ActiveStorage을시키는거야 그래서, 다음 폴더 구조로 파일을 이동.

    move_to 방법은 기본적으로 복사합니다 다음 통과 폴더 구조로 파일은 버킷의 루트에 넣어 된 파일을 삭제합니다. 당신이 그것을 원하는 곳이 방법은 파일 끝납니다.

    그래서 우리는 드라이버 정보를 저장 한 경우, 예를 들면 : 이름과 drivers_license, 그들 저장 당신은 이미 버킷의 상단에 있다는 그래서 그 일을하고있다.

    그리고 (나는 도우미에서 광산을 넣어) 다음을 구현 :

            module DriversHelper
    
              def restructure_attachment(driver_object, new_structure)
    
              old_key = driver_object.image.key
    
              begin
                # Passing S3 Configs
                config = YAML.load_file(Rails.root.join('config', 'storage.yml'))
    
                s3 = Aws::S3::Resource.new(region: config['amazon']['region'],
                                           credentials: Aws::Credentials.new(config['amazon']['access_key_id'], config['amazon']['secret_access_key']))
    
                # Fetching the licence's Aws::S3::Object
                old_obj = s3.bucket(config['amazon']['bucket']).object(old_key)
    
                # Moving the license into the new folder structure
                old_obj.move_to(bucket: config['amazon']['bucket'], key: "#{new_structure}")
    
    
                update_blob_key(driver_object, new_structure)
              rescue => ex
                driver_helper_logger.error("Error restructuring license belonging to driver with id #{driver_object.id}: #{ex.full_message}")
              end
              end
    
              private
    
              # The new structure becomes the new ActiveStorage Blob key
              def update_blob_key(driver_object, new_key)
                blob = driver_object.image_attachment.blob
                begin
                  blob.key = new_key
                  blob.save!
                rescue => ex
                  driver_helper_logger.error("Error reassigning the new key to the blob object of the driver with id #{driver_object.id}: #{ex.full_message}")
                end
              end
    
              def driver_helper_logger
                @driver_helper_logger ||= Logger.new("#{Rails.root}/log/driver_helper.log")
              end
            end
    

    키에 그 참조가 오류를 반환하지 않도록 그것은 블롭 키를 업데이트하는 것이 중요합니다.

    키 오히려 그것의 새로운 위치보다 (버킷의 상단에) 그것의 이전 위치에 찾습니다 이미지를 참조하려고 시도하는 모든 기능을 업데이트되지 않습니다.

    나는 나의 컨트롤러에서이 함수를 호출하고있어 곧 파일이 저장 될 때 (즉, 행동을 만들에) 그것이 아니더라도 원활한 보이는 그래서.

    이 최선의 방법이 될 수는 없지만, 지금은 작동합니다.

    참고 : 당신이 준 예를 바탕으로, new_structure 변수는 new_structure = "개발 / # {driver_object.image.key}"이 될 것입니다.

    이게 도움이 되길 바란다! :)

  3. ==============================

    3.당신의 대답을, 소니아을 주셔서 감사합니다.

    당신의 대답을, 소니아을 주셔서 감사합니다.

    난 당신의 솔루션을 시도하고 잘 작동,하지만 난 덮어 첨부 파일에 문제가 발생했습니다. 그 일을하는 동안 나는 종종 IntegrityError을 얻었다. 나는이와 검사 처리가 레일 핵심 팀이 패스 기능을 통과 추가하지 않으려는 이유가 될 수 있다고 생각합니다. 그것은 업로드 방법의 전체 로직을 변경 필요합니다.

    ActiveStorage : 첨부 #의 create_from_blob 방법은 수 또한 ActiveStorage :: Blob 오브젝트를 사용할 수 있습니다. 그래서 나는 다른 접근 방식을 시도했다 :

    내 사용이 솔루션은 그 같은했다 :

    def attach file # method for attaching in the model
      blob_key = destination_pathname(file)
      blob = ActiveStorage::Blob.find_by(key: blob_key.to_s)
    
      unless blob
        blob = ActiveStorage::Blob.new.tap do |blob|
          blob.filename = blob_key.basename.to_s
          blob.key = blob_key
          blob.upload file
          blob.save!
        end
      end
    
      # Attach method from ActiveStorage
      self.file.attach blob
    end
    

    물방울의 주요 I에 대한 전체 경로 이름을 통과 덕분에 서버에 파일 구조를 원하는 받았다.

  4. from https://stackoverflow.com/questions/48389782/how-to-specify-a-prefix-when-uploading-to-s3-using-activestorages-direct-upload by cc-by-sa and MIT license