S3 Предопределенные URL-адреса: недействительно в соответствии с политикой: условие политики не выполнено success_action_status - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь выдать предварительно подписанные URL-адреса через мой сервер, а затем загрузить через JavaScript в браузере. Все работает, когда я пропускаю поле: success_action_status, но я хочу установить его в 201, чтобы вернуть XML после загрузки.

На сервере:

s3_bucket = Aws::S3::Resource.new.bucket(UploadFile::DECK_BUCKET)
presigned_url = s3_bucket.presigned_post(
  :key => @upload_file.key,
  :content_length_range => 1..(10*1024),
  :success_action_status => '201',
  :signature_expiration => expire
)

data = { url: presigned_url.url, url_fields: presigned_url.fields }
render json: data, status: :ok

На клиенте:

this.file.change(function() {
  var formData = new FormData();
  formData.append("key", that.fields.key);
  formData.append("X-Amz-Credential", that.fields['x-amz-credential']);
  formData.append("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
  formData.append("X-Amz-Date", that.fields['x-amz-date']);
  formData.append("Policy", that.fields.policy);
  formData.append("X-Amz-Signature", that.fields['x-amz-signature']);
  formData.append("file", that.file[0].files[0]);
  formData.append("success_action_status", that.fields['success_action_status']);
  that.$http.post(that.url, formData).then(function(response) {
    console.log("yup")
    console.log(response)
  }, function(response) {
    console.log("nope")
    console.log(response)
  });

Опять же это работает, когда я опускаю поле success_action_status в presigned_post. Но когда я не получаю:

Invalid according to Policy: Policy Condition failed: ["eq", "$success_action_status", "201"]

Кто-нибудь знает, что происходит ?? Спасибо!

РЕШЕНИЕ:

formData.append("file", that.file[0].files[0]); должна быть последней вещью, добавленной к форме.

1 Ответ

1 голос
/ 13 апреля 2019

В документации нет ничего конкретного относительно того, почему это не сработает.

Обновление

Попробуйте поставить поле success_action_status перед полем файла

this.file.change(function() {
  var formData = new FormData();
  formData.append("key", that.fields.key);
  formData.append("X-Amz-Credential", that.fields['x-amz-credential']);
  formData.append("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
  formData.append("X-Amz-Date", that.fields['x-amz-date']);
  formData.append("Policy", that.fields.policy);
  formData.append("X-Amz-Signature", that.fields['x-amz-signature']);
  formData.append("success_action_status", that.fields['success_action_status']);
  formData.append("file", that.file[0].files[0]);
  that.$http.post(that.url, formData).then(function(response) {
    console.log("yup")
    console.log(response)
  }, function(response) {
    console.log("nope")
    console.log(response)
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...