Un esempio funzionante vale più di mille parole…

index.html:

codice:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Sending forms with FormData &ndash; MDN</title>
<script type="text/javascript">
"use strict";

function ajaxSuccess () {
	alert(this.responseText);
}

function AJAXSubmit (oFormElement) {
	if (!oFormElement.action) { return; }

	var

		oField, sFieldType, nFile, oReq = new XMLHttpRequest(), sSearch = "",
		sMethod = oFormElement.method.toUpperCase(), bIsPost = sMethod === "POST";

	oReq.onload = ajaxSuccess;
	for (var nItem = 0; nItem < oFormElement.elements.length; nItem++) {
		oField = oFormElement.elements[nItem];
		if (!oField.hasAttribute("name")) { continue; }
		sFieldType = oField.nodeName.toUpperCase() === "INPUT" ? oField.getAttribute("type").toUpperCase() : "TEXT";
		if (sFieldType === "FILE") {
			for (nFile = 0; nFile < oField.files.length; sSearch += "&" + escape(oField.name) + "=" + escape(oField.files[nFile++].name));
		} else if ((sFieldType !== "RADIO" && sFieldType !== "CHECKBOX") || oField.checked) {
			sSearch += "&" + escape(oField.name) + "=" + escape(oField.value);
		}
	}
	oReq.open(sMethod, bIsPost ? oFormElement.action : oFormElement.action.replace(/(?:\?.*)?$/, sSearch.replace(/^&/, "?")), true);
        bIsPost && oReq.setRequestHeader("Content-Type", "application\/x-www-form-urlencoded");
	oReq.send(bIsPost ? sSearch.replace(/^&/, "") : null);
}
</script>
</head>
<body>

<h1>Sending forms with FormData</h1>

<form action="register.php" method="post" onsubmit="AJAXSubmit(this); return false;">
	<fieldset>
		<legend>Registration example</legend>
		


			First name: <input type="text" name="firstname" />

			Last name: <input type="text" name="lastname" />
		</p>
		


			<input type="submit" value="Submit" />
		</p>
	</fieldset>
</form>

</body>
</html>
register.php:

Codice PHP:
<?php

  
/* register.php */

  
header("Content-type: text/plain");

  echo 
":: data received via GET ::\n\n";
  
print_r($_GET);

  echo 
"\n\n:: Data received via POST ::\n\n";
  
print_r($_POST);

  echo 
"\n\n:: Data received as \"raw\" (text/plain encoding) ::\n\n";
  if (isset(
$HTTP_RAW_POST_DATA)) { echo $HTTP_RAW_POST_DATA; }

  echo 
"\n\n:: Files received ::\n\n";
  
print_r($_FILES);

?>
Se devi uploadare file le cose si complicano enormemente e ti rimando a questa guida