1

Я был в состоянии иметь клиентов сторонних загружать файлы непосредственно в AWS s3, а затем обработать эти файлы с скрепкой с помощью следующей строки в модели:как назначить скрепку подать на AWS с помощью AWS SDK

my_object.file_attachment = URI.parse(URI.escape(my_bucket.s3.amazonaws.com/whatever.ext)) 

Эта строка загружает файл, обрабатывает его, а затем сохраняет его соответствующим образом. Проблема в том, что для того, чтобы эта строка работала, я должен предоставить анонимные привилегии чтения для места загрузки. Поэтому мой вопрос: как этого избежать? Моя мысль заключается в использовании AWS-SDK для загрузки файла - так что я пытался вещи, как:

file = Tempfile.new('temp', :encoding => 'ascii-8bit') 
bucket.objects[aws_key].read do |chunk| 
    file.write chunk 
end 
my_object.file_attachment = file 

и вариации на эту тему, но ничего не работает до сих пор. Любые идеи были бы наиболее полезными.

Решение Я не очень доволен

Вы можете создать временный привилегированного URL с помощью AWS SDK:

s3 = AWS::S3.new 
bucket = s3.buckets['bucket_name'] 
my_object.file_attachment = bucket.objects['relative/path/of/uploaded/file.ext'].url_for(:read) 
+0

Я просто ударил об этом сегодня. Вероятно, это объясняет, почему я получаю 403 Запрещенные ошибки. Вы когда-нибудь находили решение? Я не могу разрешить анонимное чтение, и у PaperClip уже есть учетные данные для чтения/записи. –

+0

@MarkBerry смотри edit to OP – laertiades

+0

Удивительный! Спасибо. Я обновил SDK 2 и опубликую как ответ. –

ответ

1

Как @laertiades говорит в его измененном вопрос, одно решение для создания временного, предварительно подписанного URL-адреса с использованием SDK AWS.

AWS SDK версии 1

В AWS SDK версии 1, который выглядит следующим образом:

s3 = AWS::S3.new 
bucket = s3.buckets['bucket_name'] 
my_object.file_attachment = bucket.objects['relative/path/of/uploaded/file.ext'].url_for(:read) 

AWS документация: http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method

AWS SDK версии 2

В AWS SDK версии 2 это выглядит так: необязательный параметр expires_in (кредит this answer на другой вопрос):

presigner = Aws::S3::Presigner.new 
my_object.file_attachment = presigner.presigned_url(:get_object, # get_object method means read-only 
           bucket: 'bucket-name', 
           key: "relative/path/of/uploaded/file.ext", 
           expires_in: 10.minutes.to_i # time should be in seconds 
          ).to_s 

AWS документация: http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Presigner.html