Also remember that upload progress is just an estimate. The reason for that is because the only way to know what a persons upload speed actually is, is to put a file on the persons computer and upload it and time it.
Since most scripts dont want to do that because of either privacy/permission reasons (they would have to ask you for permission) they dont do it that way. There are two sides of the coin here, the user side sending and the server side receiving, they are both different so you just have to pick one when coding. How do we know when the image left the user if we dont have a file to test it with. We can tell when the server gets the file but how long to process that file and save it we dont know exactly. We have to wait until the php tells us its ready, and that can differ from machine to machine and config to config.
Have you ever noticed that even with youtube after you upload something there is another step it goes through to finish up. I believe that is because even they cant do it perfectly and that extra time is spent finishing the process.
So progress bars are nothing more than eye candy that take up recources, thats all they are.
I hope that explains it... :)