Working with file uploads on IE9 and Rails < 4

I am trying to get back into the swing of documenting my findings as I wrestle with tough bugs and issues. Often times I just plough on with the solution but don’t bother to reflect on how I got to it, and it’s a valuable excercise to train one’s train of thought. In other words, warning: You are about to head into a rant of rabbit holes and sad IE exceptions.

Click here to just get to the solution I found.

Sadly though, some stories don’t end up with a happy closure. There are times where one must lick one’s wounds and surrender to a completely different solution than what one expected. Let me explain the quandary.

I’m working on a Rails 3 app which, among many other things, uploads files. A very simple operation that rails out of the box supports using its ujs, but you can certainly switch over to jquery’s fine file upload plugin to gain access to drag-drop, and all sorts of other goodies. All is fine until we test in the only browser the client seems to like - good old IE9.

Turns out that ie9 doesn’t support XMLHttpRequest, but the workaround is to submit an iFrame with the contents of our request. And in order to do that, one needs the ability to add hooks to jquery’s ajax, which happens starting v1.5 (or perhaps write the entire iFrame code).

For reasons unknown, this particular project uses an archaic version of JavaScriptMVC that wasn’t fully integrated as its creators intended - and refactoring into something more common or even the newest version is out of the question for the time being. The included version for jquery was 1.4 (and there was no clear guidelines on upgrading portions individually), so I hacked through jquery versions until the remaining JMVC code didn’t complain (1.4 -> 1.6 gains you ajax hooks on Jquery and a bunch of bug fixes, which were needed for the iframe transport included in fileupload plugin.

Once that was set up, I ran into older IE9 implementations not supporting Array.indexOf. That was finally fixed with a shim that gets included directly into the code, and at this point we’re ready to continue.

If you read this far down, your head must be hurting as much as mine. Brace yourself - we keep on going!

This brought me into diving into jquery-ujs and how it was being used in the site. I spent too much time reading into it (but leanred a bunch on the actual implementation), only to come back to the crux of the matter: with some form changes (namely, adding a submit input) I was finally sending the file to Rails, yet fileuploader was not handling the response correctly.

I’ve tried every use-case, scoured the SO seas and spent a couple of days in the wonderful world of frontend exceptions and IE-specific woes. And at this point, I’ve reached too far in. Time to back out and actually throw a question out to the internet.

How it All Actually Ended Up

A coworker introduced me to Plupload, which was created in a previous era of aggressive browsers and little to no standarization. We have an app with older code that actually works with that, so I’m probably going to take that code and continue on with my life. Sometimes you have to take your learnings and move on.

I wonder how that applies to the rest of one’s life experience…