Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Trabalhando com binários grandes

Se eu quisesse enviar e receber os binários de pequenas fotos ou arquivos no Angular eu poderia usar "data uri". Mas caso eu quisesse permitir ao ao usuário que fizesse o download de arquivos grandes o uso de "data uri" se tornaria impraticável.

Como poderíamos, por exemplo, baixar um grande relatório (excel, pdf, etc...) gerado em tempo de execução usando como parâmetros, dados enviados pelo cliente (controller Angular)?

Obrigado.

5 respostas

A solução mais simples é você passa os parâmetros para sua API através do Angular. Sua API gera o arquivo e devolve como resposta para o Angular a URL que aponta para o arquivo criado.

Ou você pode apelar para bibliotecas de terceiros. Vejamos um exemplo:

http://stackoverflow.com/questions/16670754/angularjs-simple-file-download

Estou fazendo uns testes aqui e estou tendo a impressão de que o angular impede a abertura da janela de download mesmo eu tendo configurado no "header" (da resposta no lado do servidor) que o tipo mime é "application/octet-stream". Porquê isso acontece? O comportamento do browser não deveria ser mostrar a janelinha de download padrão?

Não faço ideia. Você viu a solução que sugeri? Nela, seu servidor não devolve o arquivo, ele devolve a URL do arquivo e você acessa o arquivo através de um link criado dinamicamente pelo Angular.

1 - Angular realiza envia os parâmetros do relatório para uma API X.

2 - API gera seja lá o que for e no final devolve a URL do recurso criado em disco.

3 - Angular recebe a URL e cria dinamicamente um link que aponta para o recurso.

Se não quiser fazer assim, vai ter que usar bibliotecas de terceiros que fazem vários workarounds para realizar o que você quer.

Veja um exemplo:

http://blog.neilni.com/2016/04/23/download-file-in-angular-js/

solução!

Vi sua solução, e tive uma idéia baseada nela. Eu poderia criar um link dinâmico com "data uri" para fazer algo semelhante, já que o Angular "atrapalha" o download de arquivos?

Seria assim:

1 - Angular realiza envia os parâmetros do relatório para uma API X.

2 - API gera seja lá o que for e no final devolve uma string Base64 do recurso em um objeto JSON com o tipo mime do arquivo.

3 - Angular recebe o JSON e cria dinamicamente um link com a string Base64.

4-Angula clica no link.

5-Angular apaga o link para liberar memória.

Não pensei em base64, pensei em devolver um LINK para o arquivo criado no servidor. Mas sua solução parece ser exequível.