Я пытаюсь выдать предварительно подписанные 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]);
должна быть последней вещью, добавленной к форме.