Safari 5 form submission bug
Avishkar Autar · 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();
}
});
}
Thank you very much for this post, I googled this by something like “safari multipart/form-data” and was able to fix my little ajax preview Wikipedia script; otherwise I’m not sure I’d have enough patience to track this down myself.