2016-06-03 4 views
3

Мы пытаемся использовать aws S3 для хранения файлов. Мы создали простой REST API в JAVA для загрузки и извлечения файла.AWS S3 добавить/установить/обновить/указать метаданные пользователя с заданным адресом

Клиенты, требующие обновления файлов, используют наши API REST, которые предоставляют назначенный URL для PUT/GET файла. Мы используем AWS SDK для java для генерации предварительно подписанных URL-адресов.

Нам нужно добавить некоторые метаданные в файлы, когда они обновляются на S3. Поскольку мы не контролируем загрузку непосредственно на S3, есть ли способ добавить эту информацию, пока мы генерируем предварительно подписанный URL-адрес? Не будет хорошо, если бы клиенты предоставили эту информацию в качестве части заголовков своих запросов.

ответ

1

Мы наткнулись на тот же вопрос сегодня и пытаются использовать

// does not work 
request.putCustomRequestHeader(Headers.S3_USER_METADATA_PREFIX + "foo", "bar"); 

, который, к сожалению, на самом деле не работает, он добавляет метаданные, но вызывающий в presigned URL должен еще предоставить метаданные, используя заголовки запроса что то, что клиент не должен делать.

Наконец, мы обнаружили, что использование GeneratePresignedUrlRequest#addRequestParameter делает работу на удивление:

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest("bucket", "yourFile.ending"); 
request.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "foo", "bar"); 
// import com.amazonaws.services.s3.Headers; needed 

presigned URL, то выглядит что-то вроде

https://bucket.s3.region.amazonaws.com/yourFile.ending?x-amz-meta-foo=bar&X-Amz-Security-Token=... 

Метаданные могут быть четко видно в URL, используя почтальона PUT к этому файлу с использованием upload-file в теле создается файл с правильными метаданными в ведре.

Единственная не очень красивая часть об этом заключается в том, чтобы указать внутренний префикс заголовка aws для метаданных пользователя.