Detectar quando o navegador recebe o download do arquivo

Eu tenho uma página que permite ao usuário baixar um arquivo gerado dinamicamente. Demora muito tempo para gerar, então eu gostaria de mostrar um indicador de "espera". O problema é que não consigo descobrir como detectar quando o navegador recebeu o arquivo, então posso ocultar o indicador.

Estou fazendo a solicitação de forma oculta, que publica POSTs no servidor e segmenta um iframe oculto para seus resultados. Assim, não substituo a janela inteira do navegador pelo resultado. Eu ouço um evento "load" no iframe, na esperança de que ele seja disparado quando o download for concluído.

Devolvo um cabeçalho "Content-Disposition: attachment" com o arquivo, que faz com que o navegador mostre a caixa de diálogo "Salvar". Mas o navegador não dispara um evento "load" no iframe.

Uma abordagem que tentei é usar uma resposta de várias partes. Por isso, enviaria um arquivo HTML vazio, assim como o arquivo para download anexado. Por exemplo:

Content-type: multipart/x-mixed-replace;boundary="abcde"

--abcde
Content-type: text/html

--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf

file-content
--abcde

Isso funciona no Firefox; ele recebe o arquivo HTML vazio, aciona o evento "load" e mostra a caixa de diálogo "Salvar" para o arquivo que pode ser baixado. Mas falha no IE e no Safari; O IE dispara o evento "load", mas não faz o download do arquivo, e o Safari faz o download do arquivo (com o nome e o tipo de conteúdo errados) e não dispara o evento "load".

Uma abordagem diferente pode ser fazer uma chamada para iniciar a criação do arquivo, depois pesquisar o servidor até que esteja pronto e, em seguida, faça o download do arquivo já criado. Mas eu prefiro evitar a criação de arquivos temporários no servidor.

Alguém tem uma idéia melhor?

questionAnswers(17)

yourAnswerToTheQuestion