js: Properly submit multipart/form-data

This is not IE <10 compatible. Fix follows. ;-)

refs #8758
This commit is contained in:
Johannes Meyer 2015-07-15 15:25:40 +02:00
parent f3c8f2229f
commit c1d9cde312
2 changed files with 31 additions and 6 deletions

View File

@ -199,6 +199,7 @@
var $form = $(event.currentTarget).closest('form'); var $form = $(event.currentTarget).closest('form');
var url = $form.attr('action'); var url = $form.attr('action');
var method = $form.attr('method'); var method = $form.attr('method');
var encoding = $form.attr('enctype');
var $button = $('input[type=submit]:focus', $form).add('button[type=submit]:focus', $form); var $button = $('input[type=submit]:focus', $form).add('button[type=submit]:focus', $form);
var $target; var $target;
var data; var data;
@ -230,6 +231,10 @@
method = method.toUpperCase(); method = method.toUpperCase();
} }
if (typeof encoding === 'undefined') {
encoding = 'application/x-www-form-urlencoded';
}
if ($button.length === 0) { if ($button.length === 0) {
$button = $('input[type=submit]', $form).add('button[type=submit]', $form).first(); $button = $('input[type=submit]', $form).add('button[type=submit]', $form).first();
} }
@ -266,14 +271,22 @@
url = icinga.utils.addUrlParams(url, dataObj); url = icinga.utils.addUrlParams(url, dataObj);
} else { } else {
data = $form.serializeArray(); if (encoding === 'multipart/form-data') {
data = new FormData($form[0]);
} else {
data = $form.serializeArray();
}
if (typeof autosubmit === 'undefined' || ! autosubmit) { if (typeof autosubmit === 'undefined' || ! autosubmit) {
if ($button.length && $button.attr('name') !== 'undefined') { if ($button.length && $button.attr('name') !== 'undefined') {
data.push({ if (data instanceof FormData) {
name: $button.attr('name'), data.append($button.attr('name'), $button.attr('value'));
value: $button.attr('value') } else {
}); data.push({
name: $button.attr('name'),
value: $button.attr('value')
});
}
} }
} }
} }

View File

@ -100,13 +100,25 @@
headers['X-Icinga-WindowId'] = 'undefined'; 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 self = this;
var req = $.ajax({ var req = $.ajax({
type : method, type : method,
url : url, url : url,
data : data, data : data,
headers: headers, headers: headers,
context: self context: self,
contentType: contentType,
processData: ! isFormData
}); });
req.$target = $target; req.$target = $target;