I think it is because one of your rules is a callback, and the callback function is doing the upload. The callback will always be called so the upload is always being done.
You should only do the upload once all the error checking is done, not as part of the error checking.
I have not done a file upload for some time but I would check all the fields for errors first, then if they pass the error checking, do a an attempt at the file upload. If that fails you can repopulate your form and send a message about the upload error.
I hope I have understood your code properly and that this is of some help,
Best wishes,
Paul.