FileSaver: Salve arquivos com JavaScript

 

[download id=”245″]

Este tutorial serve para quem precisa criar pequenos arquivos de texto e salva-los em um formato que o pc do usuário final possa ler. Para isso utilizaremos a biblioteca do FileSaver.js para eftuar a lógica de criação e baixar o arquivo na máquina cliente. Então vamos começar!

Passo 1

Baixe o script do FileSaver.min.js no link (https://github.com/eligrey/FileSaver.js/) ou junto com nosso código fonte acima e copie-o para o seu local de trabalho. Caso queira conhecer melhor o código, você pode baixar a versão não minificada, em qualquer outro caso não vale a pena.

Passo 2

Vamos criar alguns inputs html para que possamos salvar nossos dados. Precisaremos de um input para o nome do arquivo, um textarea para o texto do arquivo e um botão para iniciarmos a rotina.

<html>
<head>
   <style>
   div {
     min-width: 300px;
     width: 50%;
     margin: 10px auto;
   }
   input,
   textarea {
     width: 100%;
     min-width: 250px;
   }
   </style>
</head>
<body>
   <h3>Salvar arquivo com JavaScript</h3>
   <div>
     <label for="input-fileName">Nome do Arquivo</label><br/>
     <input type="text" id="titulo" placeholder="Nome do Arquivo">
   </div>
   <div>
     <label for="textarea">Texto</label><br/>
     <textarea id="texto" placeholder="Digite um texto para salva-lo"></textarea>
   </div>
   <div>
     <button onclick="salvar()">Salvar</button>
   </div>
</body>
</html>

Passo 3

O código acima já serve como uma base simples para implementarmos nosso código. Vamos adicionar, antes da tag de fechamento do body, a biblioteca do FileSaver e logo após colocaremos a seguinte função JavaScript.

  <!-- Biblioteca que adicionara o código -->
   <script type="text/javascript" src="FileSaver.min.js"></script>
   <!-- função ao clicar em salvar -->
   <script>
   function salvar() {
      let texto = document.getElementById("texto").value;
      let titulo = document.getElementById("titulo").value;
      let blob = new Blob([texto], { type: "text/plain;charset=utf-8" });
      saveAs(blob, titulo + ".txt");
   }
   </script>
</body>
</html>

Como função do FileSaver que cria o arquivo precisa de um objeto blob para definir a formatação além do texto do arquivo, criamos o objeto utilizando o valor obtido no textarea com id texto e definimos que será codificado em utf-8 (valor padrão para formatação de texto no Brasil).

Tendo feito isso, basta chamar a função saveAs(), passando como parâmetros o blob e o título concatenado com o formato desejado. Note que você pode colocar outros formatos (ex.: XML, CSV), mas terá que garantir que o conteúdo possa ser lido pelo sistema que o abrir.

Passo 4)

O passo final é o teste. Rode o código e preencha os campos de título e texto para ver se ao salvar o arquivo para download aparecerá na sua tela. Ele apareceu? Tem conteúdo dentro? Se a respostas das perguntas anteriores for sim, então parabéns, seu código está funcionando.


Possíveis problemas

É necessário observar que nem todos s navegadores onde ele será utilizado dão suporte ao Blob e também, se o título ou o texto não existirem, talvez seja necessário informar o usuário ou colocar valores padrões para o título ou texto


Conclusão

Como é possível ver, criar um arquivo de texto utilizando apenas o JavaScript é super fácil. Caso você leve em consideração os possíveis problemas, você poderá fazer uma ferramenta mais flexível e completa que permita ao seu usuário criar e editar pequenos arquivos de forma rápida e eficiente

Conheça a W3.JS

Introdução

Muitos de nós conhecemos o site da w3schools que aparece em 80% das buscas de informações se tratando de HTML, CSS, Bootstrap, JavaScript, Jquery e outras tecnologias dos quais eles fornecem diversas páginas com conteúdo didático gratuito. Apesar de não ser novidade, muitas pessoas não sabem que eles criaram o W3.CSS e o W3.JS que são duas bibliotecas disponíveis para o público. A primeira tenta fornecer funcionalidades similares ao Bootstrap, que não está no escopo do que veremos, e a segunda fornece diversas pequenas funcionalidades que facilitam a interatividade das páginas mantendo tudo em HTML e no front-end.

Funcionalidades

Dentre as funcionalidades da biblioteca, podemos mencionar os controles de visualização:

  • w3.hide, w3.show, w3.toggleShow: Respectivamente oculta, exibe ou alterna a visualização de um elemento HTML
<h2>Teste</h2>
                                
<button onclick="w3.hide('h2')">Hide</button>
<button onclick="w3.show('h2')">Show</button>
<button onclick="w3.toggleShow('h2')">Toggle</button>
  • w3.removeClass, w3.addClass, w3.toggleClass: Respectivamente remove, adiciona ou alterna a existência de uma classe CSS em um elemento HTML. O toggle também permite alternar entre 2 classes ao invés de simplesmente remover/adicionar uma.
<p id="London" class="class1">City</p>
                                
<style>
    .marked{
        text-decoration: underline;
    }
    .class1{
        color: black;
    }
    .class2{
        color: red;
    }
</style>

<button onclick="w3.addClass('#London','marked')">Add Class</button>
<button onclick="w3.removeClass('#London','marked')">Remove Class</button>
<button onclick="w3.toggleClass('#London','marked')">Toggle</button>
<button onclick="w3.toggleClass('#London','class1','class2')">Toggle</button>
  • w3.addStyle: Adiciona a propriedade style a um elemento HTML.
<input oninput="w3.filterHTML('#id01', 'li', this.value)">
<ul id="#id01">
    <li>Afonso</li>
    <li>Bruna</li>
    <li>Carlos</li>
    <li>Diego</li>
    <li>Emma</li>
</ul>
  • w3.sortHTML: Ordena um grupo de elementos HTML:
<button onclick="w3.sortHTML('#id01', 'li')">Sort</button>
<ul id="#id01">
    <li>Emma</li>
    <li>Afonso</li>
    <li>Diego</li>
    <li>Carlos</li>
    <li>Bruna</li>
</ul>
  • w3.slideshow: exibe elementos sequencialmente, um por vez.
<img class="nature" src="img_fjords.jpg"/> 
<img class="nature" src="img_mountains.jpg"/> 
<img class="nature" src="img_nature.jpg"/>

<script> 
    w3.slideshow(".nature"); 
</script>
  • w3.displayObject: Exibe os dados de um objeto JavaScript no HTML
<div id="id01"> {{firstName}} {{lastName}} </div> 
<script> 
    var myObject = { "firstName": "John", "lastName": "Doe" }; 
    w3.displayObject("id01", myObject); 
</script>
  • w3.includeHTML: Inclui um trecho de código HTML externo na página/componente atual.
<div w3-include-html="arquivoExterno.html"></div>
<script>
    w3.includeHTML();
</script>
  • w3.getHttpObject: Lê um arquivo do servidor
w3.getHttpObject("customers.js", funcaoExecutadaAposGet());

Vantagens e Desvantagens

Vantagens:

  • Bem mais leve que muitas outras bibliotecas
  • A maioria das funcionalidades é fácil de implementar
  • Curva de aprendizado pequena

Desvantagens:

  • Poucas funcionalidades disponíveis.
  • Não há muito material fora do site deles
  • A utilização em projetos grandes é inexistente.

Conclusão

Além de ser leve e fácil de aprender, a biblioteca W3 permite que seu projeto tenha diversas funcionalidades essenciais em um ambiente simples e de alta customização. Se você tiver um bom conhecimento dos métodos nativos do JavaScript e combinar essa biblioteca com eles, poderá manipular o DOM e trabalhar com templates e dados dinâmicos sem muitos problemas. Por outro lado, se não for bem planejado, seu projeto poderá acabar com pelo menos 2 bibliotecas que terão funcionalidade semelhantes ou você despenderá muito tempo fazendo customizações e implementações para manter um ambiente que não atende todas as necessidades do seu sistema.

Veja qual a diferença entre Framework e Biblioteca

Está pergunta é muito comum as vezes é a causadora de discussões em círculos de desenvolvedores pois framework e bibliotecas podem ter significados diferentes para pessoas diferentes e em momentos diferentes. No entanto existe uma definição geral que tentarei descrever aqui com a finalidade de simplificar e esclarecer cada um.

Biblioteca

Uma biblioteca é uma coleção organizada de funcionalidade uteis. Um exemplo de biblioteca padrão poderá incluir funcionalidades para manipular string, datas, eventos, animações, etc… Cada uma destas funções retornará valores para a aplicação que a está invocando que então poderá ser manipulada de acordo com a necessidade.

Bibliotecas normalmente fornecem um nível mais alto de abstração que serve para facilitar implementações que sofrem inconsistências devido a variáveis externas. Por exemplo, uma chamada AJAX normalmente depende da API XMLHttpRequest mas a mesma precisa de várias linhas de código para lidar com as inconsistências entre os navegadores. Por isso uma biblioteca pode fornecer um método ajax() que lidará com essas mudanças, deixando você livre para se preocupar com a implementação da lógica de negócio.

Uma biblioteca pode reduzir o tempo de desenvolvimento de pois não a necessidade de se preocupar com detalhes. Por outro lado, um bug dentro da biblioteca pode se tornar difícil de descobrir e corrigir, não há garantias que os responsáveis pela biblioteca irão corrigi-lo em tempo hábil e uma atualização pode mudar a API de forma a causar mudanças em seu código.

Frameworks

Um framework é o esqueleto de uma aplicação que requer que você utilize um design de software especifico e insira sua própria lógica em certos momentos. As funcionalidades como eventos, armazenamento e ligação de dados são fornecidas prontas para o desenvolvedor.

Comparado com uma biblioteca, o nível de abstração é mais alto e somado as diversas funcionalidades prontas, o desenvolvimento dos primeiros 80% será incrivelmente rápido. Por outro lado, os 20% restantes podem ser mais difíceis que a primeira parte se eles saírem das limitações do framework, atualizações são muito difíceis de serem implementadas e ao mesmo tempo o código se torna obsoletos relativamente rápido.