AJAX request fails when sending FormData() including empty file input in Safari 10.13.4
Andrei Herford's solution will crash other browsers that do not support the entries() method of FormData - using try/catch will only find execution errors, not syntax errors.
Our solution was to use plain JavaScript to remove the empty file input element before creating the FormData object, thus:
for (i = 0; i < form.elements.length; i++) { if (form.elements[i].type == 'file') { if (form.elements[i].value == '') { form.elements[i].parentNode.removeChild(form.elements[i]); } }}
I use FormData throughout my site and can verify that this is a problem with the latest version of Safari. Removing the empty file fixes the problem. Here's the code that worked for me:
var form = $('#formID'); var data = new FormData(form[0]) //hack to fix safari bug where upload fails if file input is empty if (document.getElementById("fileID").files.length == 0 ) { //if the file is empty data.delete('fileID'); //remove it from the upload data }
I used this solution and works for me.
var $form = $('#website_settings_form');var $inputs = $('input[type="file"]:not([disabled])', $form); //select input files $inputs.each(function(_, input) { if (input.files.length > 0) return $(input).prop('disabled', true) //if the input doesn't have uploaded files will be disable }) var formData = new FormData($form[0]);// create the form data $inputs.prop('disabled', false);//enable fields again.