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, para que eu possa ocultar o indicador.
Estou fazendo a solicitação em um formulário oculto, que POSTs para o servidor, e direciona um iframe oculto para seus resultados. Isso é para não substituir a janela inteira do navegador pelo resultado. Eu escuto um evento "load" no iframe, na esperança de que ele seja acionado quando o download for concluído.
Retorno um cabeçalho "Disposição de conteúdo: anexo" com o arquivo, o 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. Portanto, ele enviaria um arquivo HTML vazio, bem 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 "Save" do arquivo para download. Mas falha no IE e no Safari; O IE aciona o evento "load", mas não baixa o arquivo, e o Safari baixa o arquivo (com o nome e o tipo de conteúdo incorretos) e não aciona o evento "load".
Uma abordagem diferente pode ser fazer uma chamada para iniciar a criação do arquivo, pesquisar o servidor até que esteja pronto e fazer o download do arquivo já criado. Mas prefiro evitar criar arquivos temporários no servidor.
Alguém tem uma idéia melhor?