Em alguns casos necessitamos permitir ao nossos usuário que façam o download de dados gerados ou adquiridos via Javascript. É uma tarefa relativamente simples. Vamos ao código.

Primeiramente devemos criar um Blob que será o conteúdo que será baixado. Um Blob representa um dado do tipo arquivo como dados brutos imutáveis. Para criar um objeto Blob utilizamos o construtor Blob(blobParts[],options), vamos a um exemplo.

let blobParts = ['{"nome":"Rodrigo","sobrenome":"Aramburu"}'];
let myBlob= new Blob(blobParts, {type : 'json/application'}); // o blob

Como vimos primeiro(linha 1) criamos o conteúdo do blob, que basicamente é um array de partes, após passamos este conteúdo para o construtor do blob como primeiro parâmetro e para o segundo passamos um objeto de opções informado que o mime-type do conteúdo é json.

Caso precise ler um Blob, você pode utilizar a classe FileReader que permite ler assincronamente arquivos utilizando blobs.

let reader = new FileReader();
reader.onload = function(event){
	console.log(reader.result);
};
reader.readAsText(meuBlob);

Basicamente o FileReader possui diversos métodos de leitura de blob para vários tipos de informação, utilizamos readAsText para ler o conteúdo do blob como texto mesmo. Uma vez feita a leitura o resultado será atribuído para o reader.result. Lembrando que a leitura é feita de forma assíncrona, então devemos configurar um manipulador de evento(onload) para realizar o que queremos com o resultado quando a leitura for finalizada.

Bom com o conteúdo que queremos realizar o download dentro de um blob podemos realizar o download propriamente dito. Para isso precisamos criar dinamicamente um elemento “a” atribuir o conteúdo para ele e realizar o clique para disparar o download. Vamos ao exemplo:

let data = 'Um conteúdo qualquer';
let blob = new Blob([data], { type: 'text/plain;charset=utf-8;' });
const link= window.document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'export.txt';
link.click();
window.URL.revokeObjectURL(link.href);

Começamos criando um elemento “a” na linha 3, logo após utilizamos o método URL.createObjectURL para criar um objeto URL através do blob de conteúdo que queremos realizar o download. Esse objeto URL atribuímos para o atributo href do link(elemento “a”) que criamos. Passamos para o atributo download do nosso link o nome do arquivo que será salvo na linha 5 e finalmente chamamos o método click() que irá disparar o download. Após isso utilizamos o método URL.revokeObjectURL() para liberar os recursos do objeto URL criado com o conteúdo do blob criado com o createObjectURL.

Podemos adquirir um blob para realizar o download de diversas maneiras, por exemplo a resposta retornada pela função fetch fornece um método blob() para gerar um blob de seu retorno.

 fetch('imagem.svg').then( async (result) =>{
     const blob = await result.blob();// recuperandoo um blob para baixar
     const anchor = window.document.createElement('a');

     anchor.href = window.URL.createObjectURL(blob);
     anchor.download = 'imagem.svg';
     anchor.click();
     window.URL.revokeObjectURL(anchor.href);
 });

Também podemos gerar um blob do conteúdo de um elemento canvas através da função toBlob dele.

let canvas = document.querySelector('#canvas');
let context = canvas.getContext('2d');

canvas.toBlob(
    blob => {
        const anchor = window.document.createElement('a');
        anchor.href = window.URL.createObjectURL(blob);
        anchor.download = 'export.jpg';
        anchor.click();
        window.URL.revokeObjectURL(anchor.href);

    },
    'image/jpeg',
    0.9,
);

A função toBlob recebe três argumentos o primeiro é uma função de callback que será chamada com o objeto blob criado, o segundo é mime-type e o terceiro a qualidade da imagem.

Veja os exemplos de download via javascript apresentados.

Bom era isso T++;