From c1d9cde312d2a7306819c013aad41d28b3365e1b Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 15 Jul 2015 15:25:40 +0200 Subject: [PATCH] js: Properly submit multipart/form-data This is not IE <10 compatible. Fix follows. ;-) refs #8758 --- public/js/icinga/events.js | 23 ++++++++++++++++++----- public/js/icinga/loader.js | 14 +++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/public/js/icinga/events.js b/public/js/icinga/events.js index 00a0ff9f4..2ba666f47 100644 --- a/public/js/icinga/events.js +++ b/public/js/icinga/events.js @@ -199,6 +199,7 @@ var $form = $(event.currentTarget).closest('form'); var url = $form.attr('action'); var method = $form.attr('method'); + var encoding = $form.attr('enctype'); var $button = $('input[type=submit]:focus', $form).add('button[type=submit]:focus', $form); var $target; var data; @@ -230,6 +231,10 @@ method = method.toUpperCase(); } + if (typeof encoding === 'undefined') { + encoding = 'application/x-www-form-urlencoded'; + } + if ($button.length === 0) { $button = $('input[type=submit]', $form).add('button[type=submit]', $form).first(); } @@ -266,14 +271,22 @@ url = icinga.utils.addUrlParams(url, dataObj); } else { - data = $form.serializeArray(); + if (encoding === 'multipart/form-data') { + data = new FormData($form[0]); + } else { + data = $form.serializeArray(); + } if (typeof autosubmit === 'undefined' || ! autosubmit) { if ($button.length && $button.attr('name') !== 'undefined') { - data.push({ - name: $button.attr('name'), - value: $button.attr('value') - }); + if (data instanceof FormData) { + data.append($button.attr('name'), $button.attr('value')); + } else { + data.push({ + name: $button.attr('name'), + value: $button.attr('value') + }); + } } } } diff --git a/public/js/icinga/loader.js b/public/js/icinga/loader.js index b2e8061e2..e7645f313 100644 --- a/public/js/icinga/loader.js +++ b/public/js/icinga/loader.js @@ -100,13 +100,25 @@ headers['X-Icinga-WindowId'] = 'undefined'; } + // This is jQuery's default content type + var contentType = 'application/x-www-form-urlencoded; charset=UTF-8'; + + var isFormData = data instanceof FormData; + if (isFormData) { + // Setting false is mandatory as the form's data + // won't be recognized by the server otherwise + contentType = false; + } + var self = this; var req = $.ajax({ type : method, url : url, data : data, headers: headers, - context: self + context: self, + contentType: contentType, + processData: ! isFormData }); req.$target = $target;