AJAX request fails when sending FormData() including empty file input in Safari 10.13.4 AJAX request fails when sending FormData() including empty file input in Safari 10.13.4 ajax ajax

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.