File API
A File API em JavaScript é uma ferramenta poderosa que permite aos desenvolvedores interagir com arquivos no lado do cliente, possibilitando selecionar, ler e manipular arquivos em aplicações web.
File API em JavaScript: Interagindo com Arquivos do Usuário
A File API em JavaScript é uma ferramenta poderosa que permite aos desenvolvedores web interagir com arquivos no lado do cliente, possibilitando que os usuários selecionem, leiam e manipulem arquivos dentro de aplicações web. Essa API tem diversas aplicações, incluindo upload de arquivos, processamento de conteúdo gerado pelo usuário e realização de operações relacionadas a arquivos. Neste artigo, exploraremos o que é a File API, seus benefícios, quando utilizá-la e alguns casos de uso comuns.
O que é a File API?
A File API é uma API JavaScript que fornece acesso a arquivos selecionados pelo usuário por meio de campos de entrada de arquivo (<input type="file">) ou arquivos arrastados para páginas web. Ela expõe uma pequena família de interfaces que trabalham em conjunto:
File— representa um único arquivo escolhido pelo usuário. Carrega metadados comoname,size(em bytes),type(tipo MIME) elastModified(um timestamp). UmFileé um tipo especial deBlob.Blob— um bloco de dados binários imutáveis ("Binary Large Object"). TodoFileé umBlob, mas você também pode criar seus próprios blobs para download ou upload. Veja o capítulo dedicado ao JavaScript Blob para mais detalhes.FileList— a coleção semelhante a um array retornada porinput.files. Acesse seus elementos com[0]ou itere sobre ela.FileReader— um leitor assíncrono que carrega o conteúdo de um arquivo na memória como texto, uma data URL ou umArrayBuffer.
Como tudo isso é executado no navegador, você pode inspecionar, validar e visualizar arquivos antes de qualquer coisa chegar a um servidor.
A File API apenas lê arquivos que o usuário explicitamente fornece. Uma página nunca pode abrir silenciosamente arquivos arbitrários do disco do visitante — isso é um limite de segurança intencional.
Métodos de leitura em resumo
O FileReader expõe quatro métodos de leitura. Escolha o que corresponde ao resultado desejado:
| Método | Tipo de resultado | Uso típico |
|---|---|---|
readAsText(file) | string | .txt, .csv, .json, código-fonte |
readAsDataURL(file) | string de URL data: | pré-visualizações de imagem/áudio/vídeo via src |
readAsArrayBuffer(file) | ArrayBuffer | parsing binário, hashing, inspeção de bytes |
readAsBinaryString(file) | string de bytes | legado; prefira readAsArrayBuffer |
Navegadores modernos também expõem atalhos baseados em promessas diretamente no blob: await file.text(), await file.arrayBuffer() e file.stream(). Esses frequentemente substituem o FileReader em código novo e combinam naturalmente com async/await.
Quando Usar a File API
A File API é especialmente útil quando você deseja:
- Gerenciar uploads de arquivos — permitir que os usuários selecionem e enviem arquivos de seus dispositivos.
- Visualizar arquivos — exibir uma miniatura de uma imagem escolhida ou mostrar o texto de um documento antes do upload.
- Validar no cliente — rejeitar o tipo MIME errado ou um arquivo muito grande antes de gastar largura de banda com um upload.
- Manipular arquivos localmente — recortar imagens, editar texto ou analisar CSV sem uma ida ao servidor.
Para PDFs, vale uma ressalva: a File API não gera PDFs. Ela apenas seleciona, lê e salva arquivos. Para criar um PDF, você precisa de uma biblioteca como o jsPDF, e a File API (via Blob) pode então acionar o download.
Exemplo Básico: Lendo Conteúdo de Arquivo
Aqui está um exemplo simples usando a File API em JavaScript para ler um arquivo de texto selecionado pelo usuário e exibir seu conteúdo. Esta demonstração ajudará você a entender como interagir com arquivos em seus dispositivos usando tecnologias web.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>File Reader Example</title>
</head>
<body>
<h1>Read Text File</h1>
<p>First, choose a text file, then click the 'Read File' button to see your file's contents.</p>
<input type="file" id="fileInput" accept=".txt" />
<button onclick="readFile()">Read File</button>
<pre id="fileContents"></pre>
<script>
function readFile() {
const fileInput = document.getElementById("fileInput");
const file = fileInput.files[0]; // Get the first file selected by the user
if (file) {
const reader = new FileReader();
reader.onload = function (e) {
const contents = e.target.result;
document.getElementById("fileContents").textContent = contents;
};
reader.onerror = function (e) {
console.error("Error reading file:", e.target.error.message);
};
reader.readAsText(file); // Read the file as text
} else {
alert("Please select a file.");
}
}
</script>
</body>
</html>Neste código:
- Seleção de Arquivo: O usuário seleciona um arquivo de texto (um arquivo com extensão .txt) usando o elemento de entrada de arquivo.
- Leitura do Arquivo: Quando o usuário clica no botão "Read File", o arquivo selecionado é lido como texto. Note que as operações do
FileReadersão assíncronas; o callbackonloadé executado somente após o arquivo ter sido completamente lido. - Exibição do Arquivo: O conteúdo do arquivo é exibido em um elemento
<pre>, preservando a formatação do arquivo de texto.
Este exemplo fornece uma demonstração direta da capacidade da File API de ler e interagir com arquivos selecionados pelo usuário em uma aplicação web.
Inspecionando Metadados de Arquivo
Muitas vezes você precisa dos detalhes de um arquivo antes de fazer qualquer outra coisa — para validá-lo ou para mostrar ao usuário o que ele escolheu. Todo objeto File expõe esses metadados de forma síncrona, sem necessidade de leitura:
const file = fileInput.files[0];
console.log(file.name); // e.g. "report.pdf"
console.log(file.type); // MIME type, e.g. "application/pdf"
console.log(file.size); // size in bytes, e.g. 12048
console.log(file.lastModified); // ms since the Unix epochUma tarefa comum é converter a contagem de bytes em algo legível por humanos:
function formatBytes(bytes) {
if (bytes === 0) return "0 B";
const units = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, i)).toFixed(1) + " " + units[i];
}
console.log(formatBytes(0)); // "0 B"
console.log(formatBytes(900)); // "900.0 B"
console.log(formatBytes(2048)); // "2.0 KB"
console.log(formatBytes(5242880)); // "5.0 MB"Validando Arquivos Antes do Upload
A validação no lado do cliente fornece feedback imediato ao usuário e evita uploads desnecessários. Sempre revalide no servidor também — as verificações no cliente são uma conveniência, não uma garantia de segurança, pois qualquer pessoa pode contorná-las.
function validateImage(file) {
const allowedTypes = ["image/png", "image/jpeg", "image/webp"];
const maxSize = 2 * 1024 * 1024; // 2 MB
if (!allowedTypes.includes(file.type)) {
return "Only PNG, JPEG, or WebP images are allowed.";
}
if (file.size > maxSize) {
return "File is too large (max 2 MB).";
}
return null; // null means "valid"
}
// Simulate two checks:
console.log(validateImage({ type: "image/gif", size: 1000 }));
// "Only PNG, JPEG, or WebP images are allowed."
console.log(validateImage({ type: "image/png", size: 500 }));
// nullPré-visualizando uma Imagem Antes do Upload
Para exibir uma miniatura de uma imagem escolhida, leia-a como uma data URL e atribua essa string ao src de um elemento <img>. O navegador decodifica o payload base64 diretamente — sem envolvimento do servidor.
<input type="file" id="imageInput" accept="image/*" />
<img id="preview" alt="Preview" width="200" />
<script>
const input = document.getElementById("imageInput");
const preview = document.getElementById("preview");
input.addEventListener("change", () => {
const file = input.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (e) => {
preview.src = e.target.result; // a "data:image/...;base64,..." URL
};
reader.readAsDataURL(file);
});
</script>Para arquivos de mídia grandes, prefira URL.createObjectURL(file) em vez de uma data URL — ele retorna uma referência curta blob: sem copiar o arquivo inteiro para uma string. Lembre-se de chamar URL.revokeObjectURL() quando a pré-visualização não for mais necessária para que o navegador possa liberar a memória.
Lendo um Arquivo com Promises Modernas
Nos navegadores atuais, você pode ignorar completamente o FileReader e usar await nos próprios métodos do blob. Isso é mais limpo quando você já está dentro de uma função async:
async function readTextFile(file) {
const text = await file.text();
return text.trim().split("\n").length; // count of lines
}
// Simulate a File with the same API as the real Blob:
const fakeFile = new Blob(["line 1\nline 2\nline 3"]);
readTextFile(fakeFile).then((lines) => console.log(lines)); // 3Enviando um Arquivo para um Servidor
Assim que um arquivo é selecionado, você pode enviá-lo com fetch e um corpo FormData. O navegador define os cabeçalhos corretos de multipart/form-data automaticamente — não defina Content-Type você mesmo:
async function uploadFile(file) {
const formData = new FormData();
formData.append("upload", file, file.name);
const response = await fetch("/api/upload", {
method: "POST",
body: formData,
});
return response.ok;
}Veja o capítulo Fetch API para o modelo completo de requisição/resposta.
Armadilhas Comuns
FileReaderé assíncrono. O resultado só está disponível dentro deonload; lerreader.resultna linha seguinte retornanull.input.filespode conter múltiplos arquivos. Adicione o atributomultipleao input e itere oFileList; caso contrário, você só veráfiles[0].- O
valueé limpo ao cancelar em alguns navegadores. Reselecionar o mesmo arquivo pode não dispararchange; redefinainput.value = ""primeiro se precisar detectar isso. file.typepode estar vazio. Para extensões desconhecidas, o tipo MIME pode ser""; nunca confie nele como única verificação.- Object URLs vazam memória. Cada
URL.createObjectURL()deve ser correspondido com umURL.revokeObjectURL().
Conclusão
A File API em JavaScript capacita os desenvolvedores web a trabalhar com arquivos do usuário diretamente dentro de aplicações web, abrindo possibilidades para aprimorar as interações do usuário e proporcionar uma experiência de usuário fluida. Seja construindo um uploader de arquivos, um editor de documentos ou qualquer aplicação que exija manipulação de arquivos, a File API equipa você com as ferramentas para criar soluções ricas em funcionalidades de gerenciamento de arquivos no lado do cliente.
Para ir além, explore o capítulo JavaScript Blob para construir e baixar seus próprios dados binários, Drag and Drop com JavaScript para permitir que os usuários soltem arquivos na página, e a Fetch API para enviar arquivos a um servidor.