Wrap upload with progress in a promise