Safari 5 form submission bug
Jul 6 2010 ยท Web Technologies
This applies specifically to Safari 5 (no problems in Safari 4) and forms with an enctype of multipart/form-data, submitted with a POST request built manually (for an AJAX [XMLHttpRequest] call).
Safari 5 injects a “charset=UTF-8” name/value pair into the ContentType field after the boundary string. This generates an invalid request. On the server-side of things, this resulted in no data in PHP’s $_POST global variable.
I tracked down the issues thanks to this post. The bug itself is a WebKit bug, described here.
The simple fix is to prevent Safari from automatically putting the charset parameter in by putting it in manually – before the boundary string. Here’s some jQuery code that demonstrates the issue/fix:
function ajaxSubmitForm(servlet, theForm, extraFunc)
{    
   var boundaryString = 'AaB03x';
   var boundary = '--' + boundaryString;
   var requestBody = new Array();
   
   requestBody.push(boundary);
   
   for (var i=0; i<theForm.length; i++)
   {
     requestBody.push('Content-Disposition: form-data; name="' + theForm.elements[i].name + '"');  
     requestBody.push('');
     requestBody.push(theForm.elements[i].value);
     requestBody.push(boundary);
   }
   var reqBodyText = requestBody.join('\r\n');   
   
    $.ajax({
        url: servlet,
        type: 'POST',
        contentType: 'multipart/form-data; charset=UTF-8; boundary=' + boundaryString + '',
        data: reqBodyText,
        error: function(reqobj, errType, exceptionObj){
            alert('Failed to submit form data.\r\nStatus = ' + reqobj.statusText);
        },
        
        success: function(xml)
        {            
            if(extraFunc != null)
                extraFunc();
        }
        
        });
}				








