[RUBY-ON-RAILS] activestorage의 직접 업로드를 사용하여 S3에 업로드 할 때 어떻게 접두사를 지정하려면?
RUBY-ON-RAILSactivestorage의 직접 업로드를 사용하여 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.죄송합니다, 그 현재 수 없습니다. 활성 저장 독점적으로 사용할 수 있도록 나는 양동이를 만드는 게 좋을 것.
죄송합니다, 그 현재 수 없습니다. 활성 저장 독점적으로 사용할 수 있도록 나는 양동이를 만드는 게 좋을 것.
-
==============================
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.당신의 대답을, 소니아을 주셔서 감사합니다.
당신의 대답을, 소니아을 주셔서 감사합니다.
난 당신의 솔루션을 시도하고 잘 작동,하지만 난 덮어 첨부 파일에 문제가 발생했습니다. 그 일을하는 동안 나는 종종 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에 대한 전체 경로 이름을 통과 덕분에 서버에 파일 구조를 원하는 받았다.
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
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 3.1 include_root_in_json 레일 (0) | 2020.03.04 |
---|---|
[RUBY-ON-RAILS] 레일 v3의 문자 인코딩 문제 / 루비 1.9.2 (0) | 2020.03.04 |
[RUBY-ON-RAILS] 레일 : 부울의 유효성 검사 포함은 테스트를 실패 (0) | 2020.03.04 |
[RUBY-ON-RAILS] Heroku가 업로드 - 프리 D 자산은 실패 (0) | 2020.03.04 |
[RUBY-ON-RAILS] 왜 attr_accessor 레일에 필요하다? (0) | 2020.03.04 |