Standard html has input element with file type.
Components exist which allow asynchronous file upload with progress reporting.
As far as I understand this can be done by splitting file in chunks and sending multiple requests within 'file upload' session. For this to work JavaScript must have access to file's contents, however I do not know how to do it without FileAPI appeared as part of HTML5.
Ajax-ish file upload can be achieved in the following way:
1) embed an iframe on your html page (this will be where the actual upload occurs):
2) set your form target to the iframe:
3) handle your upload in upload.php
4) once upload completes (success or fail) load a view and post a message to the parent window:
5) receive the response in your original script:
This Sitepoint article has a good example of how to track progress (using modern php). It basically involves a lot of pinging to get the latest progress bar, but I have found you can easily fake progress by slowly incrementing your progress bar from 0 - Random number between 50 and 90 and then once you receive the final "success" message pushing it all the way to 100%