Improving on panzi's answer, you can use the FormData object to send files with Ajax in a very simple manner:
<html>
<head>
<title>HTML5 File API</title>
</head>
<script type="text/javascript">
// <!--
// See: https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Using_FormData_objects
function upload() {
    var uploadRequest = new XMLHttpRequest,
        uploadForm = document.getElementById('file_upload');
    function transferProgress(progressEvent) {
    /*Executes For each update of the progress of the Ajax transfer.*/
        // show progress bar or something....
    }
    function transferComplete() {
    /*Executes when the transfer is complete.*/
        //Do something like show a nice message...
    }
    function transferFailed() {
    /*Executes when the transfer fails.*/
        alert('Upload failed!');
    }
    function transferCanceled() {
    /*Executes when the transfer is canceled.*/
        alert('Upload canceled!');
    }
    uploadRequest.upload.addEventListener('progress', transferProgress, false);
    //uploadRequest.upload.addEventListener('load', transferComplete, false); // transfer complete, but this doesn't mean a response from the server has been received.
    uploadRequest.addEventListener('load', transferComplete, false); // ajax request complete, response from the server has been received and all has been processed.
    uploadRequest.upload.addEventListener('error', transferFailed, false);
    uploadRequest.upload.addEventListener('abort', transferCanceled, false);
    uploadRequest.open('POST', action, true);
    uploadRequest.send(new FormData(uploadForm));
}
// -->
</script>
<body>
<form id="file_upload" enctype="multipart/form-data">
    <input type="text" id="text" value="blah blah blah"/>
    <input type="file" onchange="upload();"/>
</form>
</body>
</html>