Eu tive uma exigência semelhante na minha empresa, resolvi com isso: link
É exatamente como você, você faz o upload do arquivo, tem até o indicador de progresso, e você pode enviar um email, mesmo com um pwd para digitar para baixar o arquivo. É brilhante!
Apenas uma coisa: lembre-se de desativar output_buffering adicionando isto ao seu .htaccess:
php_value output_buffering off
Se você não fizer isso, cada download exigirá tanto a memória do php quanto o tamanho do arquivo (o que pode facilmente enfraquecer o servidor ou resultar em um erro 500).
Espero que isso ajude:)
Máximo