Avete fatto venire la curiosità anche a me… Provate un po' con questo codice:

codice:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Upload via ajax</title>
<script type="text/javascript">
function switchXHRState () {
	switch (this.readyState) {
		case 0: console.log("open() has not been called yet."); break;
		case 1: console.log("send() has not been called yet."); break;
		case 2: console.log("send() has been called, headers and status are available."); break;
		case 3: console.log("Downloading, responseText holds the partial data."); break;
		case 4: console.log("Complete!"); alert(this.responseText);
	}
}

function ajaxPost (oForm) {
	if (!window.FormData) { return true; }
	var oReq = new XMLHttpRequest();
	// Upload via ajax supportato; tolgo ?noajax=1 dall'attributo action
	oReq.open("POST", oForm.getAttribute("action").replace(/\?.*$/, ""), true);
	oReq.onreadystatechange = switchXHRState;
	oReq.send(new FormData(oForm));
	return false;
}
</script>
</head>
<body>
<form name="mioForm" action="invio.php?noajax=1" target="_blank" method="post" enctype="multipart/form-data" onsubmit="return ajaxPost(this);">
	

<input type="file" name="mioFile" />

	<input type="text" name="mioText" value="testo di prova">

	<input type="submit" value="Invia"></p>
</form>

</body>
</html>
Il nodo centrale della questione è il costruttore FormData, che dovrebbe funzionare su IE a partire dalla versione 10. Il resto è comunissimo javascript...
In ogni caso lo script è costruito in maniera tale che se FormData non è supportato viene aggiunta la stringa "?noajax=1" all'action del form e questo viene inviato comunque in una nuova finestra/scheda (di modo da consentire comunque di non abbandonare la pagina).