Skip to content

Instantly share code, notes, and snippets.

@fabiogoll
Last active November 30, 2016 18:20
Show Gist options
  • Save fabiogoll/ff02783e44d3235cc7a66c040281c497 to your computer and use it in GitHub Desktop.
Save fabiogoll/ff02783e44d3235cc7a66c040281c497 to your computer and use it in GitHub Desktop.
Forçar download via ajax com saveblob ou link de acordo com o navegador
var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
var saveBlob = navigator.saveBlob || navigator.webkitSaveBlob || navigator.mozSaveBlob;
var downloadComSaveBlob = function (blob, nome) {
try {
$log.info('-- Tentando realizar o download com o método saveBlob --');
if (navigator.msSaveBlob) {
navigator.msSaveBlob(blob, nome);
} else if (saveBlob) {
saveBlob(blob, nome);
} else {
throw new Error('-- Este browser não suporta o método saveBlob --');
}
return true;
} catch (ex) {
$log.error(ex);
return false;
}
};
var downloadComLink = function (url, nome) {
var link = document.createElement('a');
if ('download' in link) {
try {
$log.info('-- Tentando realizar o download simulando um click em um link --');
link.setAttribute('href', url);
link.setAttribute('download', nome);
var event = new MouseEvent('click');
link.dispatchEvent(event);
return true;
} catch (e) {
$log.error(e.name);
$log.error(e.message);
return false;
}
} else {
return false;
}
};
/**
* SALVA ARQUIVOS OBITIDOS VIA REQUISIÇÕES HTTP A API
* @param data
* @param headers
*/
this.salvarArquivo = function salvarArquivo (data, headers) {
var cabecahos = headers();
// PEGA O NOME DO ARQUIVO
var pos1 = cabecahos['content-disposition'].indexOf('"') + 1;
var pos2 = cabecahos['content-disposition'].length - 1;
var nome = cabecahos['content-disposition'].substring(pos1, pos2);
// DETERMINA O TIPO DE CONTEÚDO
var contentType = cabecahos['content-type'];
// TENTA CRIAR UM BLOB
try {
if (URL) {
$log.info('-- Criando blob.. --');
blob = new Blob([data], {type: contentType});
url = URL.createObjectURL(blob);
}
} catch (erro) {
$log.error('-- Erro ao tentar criar um blob --');
$log.error(e);
}
// TENTA REALIZAR O DOWNLOAD UTILIZANDO O MÉTODO SAVEBLOB
if (blob) {
if (downloadComSaveBlob(blob, nome)) {
return true;
}
}
// TENTA REALIZAR O DOWNLOAD UTILIZANDO UM DOWNLOAD LINK
if (url) {
if (downloadComLink(url, nome)) {
return true;
}
}
// FALLBACK PARA ABRIR O CONTEÚDO EM NOVA ABA
if (url) {
try {
$log.info('-- Tentando realizar o download com window.location --');
window.location.assign(url);
return true;
} catch (e) {
$log.error(e.name);
$log.error(e.message);
}
}
$log.info('-- Nenhum método para salvar o arraybuffer obteve sucesso --');
return false;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment