Почему почти наверняка связано с вашей скоростью соединения. Если вы не подключаетесь через локальную сеть к рассматриваемому компьютеру, вы, скорее всего, будете подключаться через широкополосное соединение потребительского уровня. Они всегда настроены так, что скорость загрузки намного выше скорости загрузки. Как следствие, загрузка этого 20-мегабайтного файла, для загрузки которого требуется около одной минуты, займет 10 и более минут для загрузки по тому же соединению.
Что вы можете сделать с этим, кроме переключения на широкополосное соединение корпоративного уровня? Не так уж и много, эти биты будут передаваться только так быстро по имеющемуся соединению и не быстрее. Однако вы можете по крайней мере информировать пользователя о том, как идет загрузка. PHP начиная с версии 5.2 предоставляет хуки, которые вы можете использовать для отслеживания хода загрузки файла. Вы можете использовать javascript для мониторинга этих хуков и отображения индикатора выполнения пользователю.
http://www.phpriot.com/articles/php-ajax-file-uploads