19
I've tried various techniques and had most success with SWFUpload.
You create and interact with an SWFUpload object using Javascript, but uses a (hidden) Flash file for file selection, uploading and upload progress monitoring. You can specify a wide range of Javascript event handlers (uploadStarted, uploadProgress, uploadError etc.) that the Flash will call during the upload progress making it very flexible. It also implements a file queue, so it works well for single or multiple files.
Links: