IE drops file uploads on the floor

On top of the whole X-UA-Compatible (for some obscure value of Compatible) debacle, last week gave me one more reason to hate Internet Explorer: the way it handles injection of file upload fields into the document. I was writing some code to allow an arbitrary number of files to be uploaded, one by one, through a hidden iframe (read: ‘Ajax’ file uploads) and came up against the following.

There are two ways of injecting new HTML into the document. One is with strings and innerHTML, and one is with HTMLElement objects, createElement and appendChild. I was using the latter, via a library I’ve got to make the process much nicer to use:

var form = $.HTML.form({
    action: 'blah', method: 'POST',
    target: 'some_iframe', enctype: 'multipart/form-data'
}, function(HTML) {
    HTML.input({type: 'file', name: 'myFile'});

// The same as
var form = document.createElement('form');
form.action = // ...
var input = document.createElement('input');
input.type = //...

So I create a form for each file, and inject it into the page on demand when the user wants to upload a file. Trouble is, you’ll find that IE passes the filename as a string to the server, instead of the file’s contents, which is a bit of a non-starter. Instead, you need to build the form as a string, and use innerHTML to add it to the document (or some other nice insertion method if your library supports it):

var form = '<form action="blah" method="POST" ' +
        'target="some_iframe" enctype="multipart/form-data">' +
    '<input type="file" name="myFile" />' +

I hate it when IE makes me use hacky, standards-ignorant code. Bah. I did try this trick which I found somewhere via Google:

var input = document.createElement(
        '<input type="file" name="myFile" />');

This didn’t work either, and actually has all the overhead of object creation and string-building combined, so I wasn’t that keen anyway.

If you’ve enjoyed this article, you might enjoy my recently published book JavaScript Testing Recipes. It’s full of simple techniques for writing modular, maintainable JavaScript apps in the browser and on the server.