navigator - javascript get pdf file




Nome do arquivo blob JavaScript sem link (4)

A única maneira que conheço é o truque usado pelo FileSaver.js :

  1. Crie uma tag <a> oculta.
  2. Defina seu atributo href para o URL do blob.
  3. Defina seu atributo de download para o nome do arquivo.
  4. Clique na tag <a> .

Aqui está um exemplo simplificado ( jsfiddle ):

var saveData = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
        var json = JSON.stringify(data),
            blob = new Blob([json], {type: "octet/stream"}),
            url = window.URL.createObjectURL(blob);
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
    };
}());

var data = { x: 42, s: "hello, world", d: new Date() },
    fileName = "my-download.json";

saveData(data, fileName);

Eu escrevi este exemplo apenas para ilustrar a idéia, no código de produção use FileSaver.js.

Notas

  • Os navegadores mais antigos não são compatíveis com o atributo "download", pois fazem parte do HTML5.
  • Alguns formatos de arquivo são considerados inseguros pelo navegador e o download falha. Salvando arquivos JSON com extensão txt funciona para mim.

Como você define o nome de um arquivo de blob em JavaScript quando forçar o download através de window.location?

function newFile(data) {
    var json = JSON.stringify(data);
    var blob = new Blob([json], {type: "octet/stream"});
    var url  = window.URL.createObjectURL(blob);
    window.location.assign(url);
}

A execução do código acima faz o download de um arquivo instantaneamente sem uma atualização de página semelhante a:

bfefe410-8d9c-4883-86c5-d76c50a24a1d

Eu quero definir o nome do arquivo como meu-download.json em vez disso.


Eu só queria expandir a resposta aceita com suporte para o Internet Explorer (a maioria das versões modernas, de qualquer forma), e também arrumar o código usando o jQuery também:

$(document).ready(function() {
    saveFile("Example.txt", "data:attachment/text", "Hello, world.");
});

function saveFile (name, type, data) {
    if (data != null && navigator.msSaveBlob)
        return navigator.msSaveBlob(new Blob([data], { type: type }), name);
    var a = $("<a style='display: none;'/>");
    var url = window.URL.createObjectURL(new Blob([data], {type: type}));
    a.attr("href", url);
    a.attr("download", name);
    $("body").append(a);
    a[0].click();
    window.URL.revokeObjectURL(url);
    a.remove();
}

Aqui está um exemplo do Fiddle . Godspeed


Tarde, mas como eu tive o mesmo problema. Eu adiciono minha solução.

function newFile(data, fileName) {
    var json = JSON.stringify(data);
    //IE11 support
    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        let blob = new Blob([json], {type: "application/json"});
        window.navigator.msSaveOrOpenBlob(blob, fileName);
    } else {// other browsers
        let file = new File([json], fileName, {type: "application/json"});
        let exportUrl = URL.createObjectURL(file);
        window.location.assign(exportUrl);
        URL.revokeObjectURL(exportUrl);
    }
}

saveFileOnUserDevice = function(file){ // content: blob, name: string
        if(navigator.msSaveBlob){ // For ie and Edge
            return navigator.msSaveBlob(file.content, file.name);
        }
        else{
            let link = document.createElement('a');
            link.href = window.URL.createObjectURL(file.content);
            link.download = file.name;
            document.body.appendChild(link);
            link.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));
            link.remove();
            window.URL.revokeObjectURL(link.href);
        }
    }




html5-filesystem