Como converter um ZIP para Base64
- Arraste um arquivo
.zippara a caixa ou escolha-o no seletor de arquivos. - Saída como começa em Base64 puro. Use JSON se quiser o nome do arquivo, o tipo e o tamanho junto, ou HTML
<a download>para um link de download. - Deixe Quebrar em 76 desligado, a menos que a string vá para o corpo de um e-mail MIME.
- Use Copiar saída, ou Salvar como .txt para arquivos grandes.
Compacte primeiro, depois codifique
O Base64 acrescenta cerca de um terço ao que você der a ele. A compressão reduz texto, JSON, CSV, HTML e logs antes disso, então a ordem importa. Um pequeno teste com um arquivo JSON de 219.398 bytes, uma página HTML e uma folha de estilo:
| Abordagem | Caracteres a enviar |
|---|---|
| Só o arquivo JSON, codificado em Base64 | 292.532 |
| Os três arquivos compactados em ZIP (19.149 bytes), depois Base64 | 25.532 |
Imagens, vídeos, MP3s e arquivos já compactados quase não encolhem, mas agrupá-los em um ZIP ainda transforma muitos arquivos em um único campo. Para um único payload de texto, o gzip é uma opção mais leve; veja Gzip e Base64.
Onde ZIPs em Base64 são usados
- APIs de deploy e automação: alguns serviços que executam código ou hospedam sites aceitam o pacote inteiro como um ZIP codificado em Base64 dentro de uma requisição JSON.
- CI e cofres de segredos: uma pasta de certificados ou arquivos de configuração pode ser compactada e guardada como um único segredo em Base64, e depois restaurada no pipeline com
base64 -d. - Exportações em lote e anexos: um conjunto de relatórios ou notas fiscais segue em uma requisição, em vez de um campo por arquivo.
Montando o ZIP no código
O Python consegue criar o arquivo na memória e codificá-lo sem gravar um arquivo temporário:
import base64, io, zipfile
from pathlib import Path
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w", zipfile.ZIP_DEFLATED) as z:
for path in Path("site").rglob("*"):
if path.is_file():
z.write(path, path.relative_to("site"))
package = base64.b64encode(buf.getvalue()).decode("ascii")
O ZIP_DEFLATED é essencial: o padrão, ZIP_STORED, não compacta nada. Mais sobre streaming e quebras de linha em Base64 em Python.
Conferindo um ZIP em Base64
| Base64 começa com | Significado |
|---|---|
UEsDBBQA | ZIP cuja primeira entrada precisa da versão 2.0 para extrair, o caso habitual de entradas compactadas |
UEsDBAoA | a primeira entrada só precisa da versão 1.0, que algumas ferramentas gravam para entradas sem compressão |
UEsFBg | um arquivo vazio, sem nada dentro |
Se a string começa com UEsFBg, o arquivo foi criado sem nenhum arquivo dentro, um resultado frequente de um caminho errado em um script de build. Base64 para ZIP decodifica uma string e lista os arquivos de dentro, o jeito mais rápido de conferir se o ZIP contém o que você espera.
Perguntas frequentes
Por que arquivos DOCX, XLSX e JAR também começam com UEsDB?
Eles são arquivos ZIP com um layout interno fixo. UEsDB é o Base64 de PK\x03\x04, o cabeçalho de arquivo local que abre todo ZIP não vazio, seja qual for a extensão.
Codificar em Base64 compacta um ZIP ainda mais?
Não. O Base64 deixa qualquer entrada cerca de 33% maior, e um ZIP já está compactado. O ganho vem de compactar primeiro: arquivos compressíveis encolhem antes de o acréscimo do Base64 entrar.
Posso codificar um ZIP protegido por senha?
Sim. Um arquivo compactado criptografado é codificado como qualquer outro arquivo. O destinatário ainda precisa da senha para extraí-lo.