Sugiro fazer o upload diretamente para um serviço como o Amazon S3 e, em seguida, processar o arquivo como achar melhor em um trabalho em segundo plano.
Quando o usuário carrega o arquivo, você pode ter certeza de que ele será armazenado com segurança no S3. Você pode usar um bucket privado para proibir o acesso público. Em seguida, em sua tarefa em segundo plano, você pode processar o upload passando o URI do S3 do arquivo e permitir que seu funcionário em segundo plano baixe o arquivo.
Não sei o que seu trabalhador em segundo plano faz com o arquivo, mas nem é preciso dizer que baixá-lo novamente pode não ser necessário. Afinal, está guardado em algum lugar.
Eu usei a gema carrierwave-direct no passado com sucesso. Como você está mencionando o Heroku, eles têm um guia detalhado para fazer upload de arquivos diretamente para o S3.