У меня есть пара проблем, которые я вижу.
Во-первых, я не могу успешно установить заголовок Content-Length из скрипта. Когда я пытаюсь это сделать, я получаю сообщения об ошибках в Chrome. Похоже, что в этом нет необходимости, поскольку браузер устанавливает правильную длину содержимого для всех моих тестовых случаев.
Во-вторых, вы добавляете заголовок Content-Type и помещаете искусственный заголовок Content-Type в тело вашего запроса:
var request = 'Content-Type: multipart/form-data; boundary=' + boundary + CRLF + CRLF;
Эта строка должна быть удалена. Вы уже устанавливаете правильный заголовок. Вы не можете фактически установить заголовки в теле в любом случае. Вероятно, это источник вашей проблемы: эта строка делает ваше тело запроса недействительным, поэтому, конечно, сервер не может его проанализировать.
После некоторых экспериментов я разработал рабочий пример того, как это можно сделать. Я проверял это в последних версиях Chrome, Firefox 4, IE9 и IE6. Библиотеки не использовались, хотя, конечно, если они у вас есть, это значительно упростит код.
Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы.