Gears and HTML5 have a progress event in the HttpRequest object for submitting a file upload via AJAX.
http://code.google.com/apis/gears/api_httprequest.html#HttpRequestUpload http://developer.mozilla.org/en/Using_files_from_web_applications
Your other options as already answered by others are:
- Flash based uploader.
- Java based uploader.
- A second comet-style request to the web server or a script to report the size of data received. Some webservers like Lighttpd provide modules to do this in-process to save the overhead of calling an external script or process.
Technically there is a forth option, similar to YouTube upload, with Gears or HTML5 you can use blobs to split a file into small chunks and individually upload each chunk. On completion of each chunk you can update the progress status.