Principais pontos
- Escolha o protocolo do servidor e os requisitos de recuperação antes de comparar os componentes visuais das bibliotecas.
- Trate o envio em blocos e a capacidade de retomada como propriedades diferentes e, depois, verifique a recuperação após recarregar a página.
- Compare o contrato do endpoint, a acessibilidade, os estados de falha e a trajetória de manutenção usando os mesmos dados de teste.
A melhor biblioteca JavaScript de upload de arquivos não é a que tem a lista de recursos mais longa. É aquela cujo modelo de estado, contrato de transferência, interface e comportamento em falhas combinam com o produto que sua equipe consegue manter. Uppy, FilePond e Dropzone se sobrepõem na seleção de arquivos e no progresso, mas divergem bastante quando a rede falha ou quando um servidor precisa reconciliar um trabalho parcial.
O que mais importa
- Use o Uppy para um fluxo de upload modular com tus, fontes remotas ou integração direta com a Transloadit.
- Use o FilePond quando uma experiência refinada de campo de arquivo e plugins voltados a imagens importarem mais do que a portabilidade de protocolo.
- Use o Dropzone para um fluxo XHR simples de arrastar e soltar quando o contrato de blocos e o perfil de manutenção dele forem adequados à aplicação.
Comece pelo contrato de upload, não pela área de soltar arquivos
As três bibliotecas conseguem deixar um campo de arquivo com aparência moderna. Essa é a parte menos cara de um upload em produção. Primeiro, decida para onde vão os bytes, qual protocolo o receptor usa, quando um upload passa a ser durável e qual identificador conecta o progresso no navegador a um registro da aplicação. Um upload direto para armazenamento de objetos, um servidor tus, um endpoint multipart convencional e um serviço de processamento têm contratos de autorização e de conclusão diferentes, mesmo quando a interface parece idêntica.
Esta comparação seleciona três bibliotecas de upload independentes para navegador que oferecem componentes de interface e documentam um contrato de servidor. Defina a recuperação com precisão. “Suporta blocos” pode significar apenas que uma única sessão de página consegue tentar novamente o envio de um bloco que falhou. Um fluxo retomável precisa manter uma identidade de upload emitida pelo servidor, descobrir o offset aceito e continuar com segurança depois que o cliente perde o estado. Defina também cancelamento, expiração, requisições finais duplicadas e o que a interface mostra quando a transferência termina, mas a validação ou o processamento assíncrono falhou.
Destino dos bytes
Nomeie o primeiro receptor e o responsável pela cópia durável, em vez de tratar todo caminho do navegador até um serviço como “upload direto”.
Contrato do protocolo
Registre os métodos, cabeçalhos, identificadores, regras de offset, requisição de finalização e semântica de novas tentativas que o servidor precisa implementar.
Conclusão no produto
Defina se sucesso significa bytes aceitos, armazenamento durável, conteúdo inspecionado, derivados concluídos ou um ativo publicado.
Use o Uppy para fluxos modulares e infraestrutura retomável
O Uppy separa seu mecanismo de estado dos plugins de interface e de upload. Uma equipe pode usar o Dashboard para um seletor integrado, o DragDrop para uma área menor, o Tus para um endpoint retomável ou o plugin Transloadit para uma Assembly de upload e processamento. Essa composição é valiosa quando um produto precisa de vários tipos de origem ou quando a experiência visível deve mudar sem substituir a camada de transferência.
A contrapartida é a área de superfície da arquitetura. A compatibilidade de plugins, os estilos, o tratamento de eventos e o endpoint escolhido continuam exigindo manutenção. Provedores remotos usam a infraestrutura do Companion em vez de expor credenciais de terceiros no navegador; as equipes podem hospedá-lo por conta própria ou usar o Companion hospedado incluído na Transloadit. O Uppy é uma boa escolha padrão para transferências grandes ou instáveis quando o back-end já usa tus, e é o caminho com manutenção ativa mais curto até a Transloadit, porque o plugin oficial cuida da criação da Assembly e da coordenação do upload.
Ideal para
Produtos que precisam de retomada via tus, fontes remotas, vários formatos de interface ou processamento da Transloadit em um único fluxo observável.
Pontos de atenção
A quantidade de plugins, o Companion auto-hospedado ou hospedado pela Transloadit para fontes remotas, a integração de CSS e a responsabilidade pelos eventos do ciclo de vida.
Não presuma
Usar o Uppy não torna retomável um endpoint multipart arbitrário, nem transfere para o cliente a autorização e a persistência dos ativos.
Use o FilePond para um campo de arquivo refinado e plugins de imagem
O FilePond parte de um elemento input e o transforma em um campo de arquivo compacto e configurável. Seu catálogo de plugins abrange pré-visualização, recorte, redimensionamento, transformação, metadados e validação de imagens, o que o torna atraente para formulários em que os usuários precisam de feedback visual imediato sobre imagens. Adaptadores para frameworks podem ajudar a integrá-lo naturalmente a um sistema de componentes existente, mas o ciclo de vida no servidor continua sendo um contrato do FilePond.
Esse contrato é explícito. Sem envio em blocos, process aceita um arquivo e retorna um identificador de arquivo no servidor; revert remove um upload temporário; restore recupera um arquivo temporário interrompido ou enviado anteriormente. Com envio em blocos, o POST inicial de process não carrega nenhum arquivo e retorna um identificador de transferência; em seguida, o FilePond envia requisições PATCH com os blocos e requisições HEAD de recuperação para o endpoint patch configurado. Esse pode ser um bom design quando a aplicação controla ambos os lados. Ele não é intercambiável com tus só porque ambos os designs enviam blocos e usam requisições HEAD.
Ideal para
Formulários e fluxos de trabalho voltados a imagens que se beneficiam de uma apresentação refinada do campo de arquivo e de plugins no lado do cliente escolhidos deliberadamente.
Pontos de atenção
Registro de plugins, manipulação de imagens no lado do cliente em dispositivos com recursos limitados, limpeza de arquivos temporários e o ciclo de vida personalizado no servidor.
Não presuma
Que uma transformação no lado do cliente substitui a inspeção autoritativa no servidor, ou que o envio em blocos do FilePond consegue ser retomado em um endpoint tus.
Use o Dropzone para um fluxo XHR convencional de arrastar e soltar
O Dropzone transforma um elemento HTML em uma área de upload de arrastar e soltar, fornece pré-visualizações e progresso e envia arquivos via XMLHttpRequest. Sua configuração é direta, e uma equipe com um endpoint de aplicação convencional consegue chegar rapidamente a uma experiência funcional. Envio opcional em blocos, blocos paralelos, limites de novas tentativas, geração de miniaturas e redimensionamento de imagens no lado do cliente ampliam esse caminho sem exigir um framework de interface separado.
Boa parte do significado fica a cargo do back-end. Ele precisa interpretar os campos de bloco do Dropzone, armazenar dados parciais com segurança, montar cada arquivo exatamente uma vez e distinguir uma nova tentativa de um segundo upload. A recuperação após navegação ou reinício do navegador não fica garantida só por ativar o envio em blocos. Na data de publicação, a tag latest do Dropzone no npm é 6.0.0-beta.2, enquanto a última linha estável é 5.9.3; o exemplo usa a exportação ESM nomeada do beta 6. Fixe a linha pretendida e teste o formato de importação em vez de copiar a configuração entre versões.
Ideal para
Aplicações existentes, renderizadas no servidor ou no cliente, que querem uma área configurável para soltar arquivos sobre um endpoint que a equipe já controla.
Pontos de atenção
Montagem de blocos, a incompatibilidade entre envio em blocos e uploadMultiple, finalização idempotente, limpeza após novas tentativas, acessibilidade de pré-visualizações personalizadas e a linha de versão escolhida.
Não presuma
Que novas tentativas de blocos dentro da página ativa oferecem o mesmo contrato de recuperação que um protocolo retomável com URLs de upload persistentes.
Compare as três nas mesmas dimensões
Em arquitetura de transferência, o Uppy tem o caminho orientado a protocolo mais claro, por meio do plugin Tus, e um caminho direto para processamento, por meio do plugin Transloadit. O FilePond tem um ciclo de vida documentado no servidor da aplicação, com operações de arquivos temporários e um protocolo opcional de blocos. O Dropzone usa uploads XHR comuns e acrescenta metadados de blocos e novas tentativas configuráveis. Nenhum desses contratos é intrinsecamente correto para todo back-end.
Quanto ao formato da interface, o FilePond favorece uma experiência compacta de campo de arquivo, o Uppy vai de um estado headless até um Dashboard completo, e o Dropzone gira em torno de um elemento que se torna uma área para soltar arquivos com pré-visualizações. Em fluxos de trabalho com imagens, o FilePond oferece um amplo conjunto de plugins de imagem específicos; o Uppy e o Dropzone também oferecem pré-visualização ou miniaturas, mas não devem ser escolhidos como processadores de mídia autoritativos. Em portabilidade, prefira um protocolo de comunicação aberto quando for importante trocar o cliente ou o servidor de forma independente.
Uppy
Prefira quando composição modular, tus, provedores remotos ou um repasse oficial para a Transloadit compensarem a superfície de integração maior.
FilePond
Prefira quando um campo de arquivo refinado e plugins de imagem se encaixarem no produto e a equipe aceitar o ciclo de vida específico dele no servidor.
Dropzone
Prefira quando uma área XHR configurável para soltar arquivos se encaixar em um endpoint existente e a equipe puder assumir a montagem dos blocos e os limites de recuperação.
Prototipe cada biblioteca com um contrato de servidor real
Estas configurações apontam intencionalmente para três contratos de endpoint diferentes. O exemplo do Uppy precisa de um servidor tus. O exemplo do FilePond precisa de handlers process, patch, revert e restore que implementem a semântica de blocos dele. O exemplo do Dropzone precisa de um endpoint que entenda e monte blocos do Dropzone. Trocar o nome do pacote mantendo a mesma URL não torna o servidor compatível.
Os limites numéricos também não são intercambiáveis, de propósito: o maxFileSize do Uppy é expresso em bytes, enquanto o maxFilesize do Dropzone é expresso em mebibytes (MiB). O exemplo do FilePond omite um plugin de tamanho para manter o foco no ciclo de vida no servidor; o código de produção precisa adicionar e aplicar um limite adequado tanto no cliente quanto no servidor.
Use os exemplos como estrutura para experimentos, não como autorização de produção. Emita permissões de upload de curta duração a partir de um servidor confiável, associe-as ao usuário e à operação atuais, aplique limites de bytes e de quantidade no receptor e retorne um identificador opaco que a aplicação possa reconciliar. Remova os logs de console antes de publicar e renderize os erros em uma região de status acessível perto do controle de upload.
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Tus from '@uppy/tus'
import '@uppy/core/css/style.min.css'
import '@uppy/dashboard/css/style.min.css'
const uppy = new Uppy({
restrictions: {
allowedFileTypes: ['image/*', 'video/*'],
maxFileSize: 500 * 1024 * 1024,
maxNumberOfFiles: 10,
},
})
.use(Dashboard, {
inline: true,
target: '#uppy',
})
.use(Tus, {
endpoint: 'https://uploads.example.com/files/',
retryDelays: [0, 1_000, 3_000, 5_000],
})
uppy.on('complete', ({ successful }) => {
console.log('Uploaded files:', successful)
})import { create, registerPlugin } from 'filepond'
import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type'
import FilePondPluginImagePreview from 'filepond-plugin-image-preview'
import 'filepond/dist/filepond.min.css'
import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css'
registerPlugin(FilePondPluginFileValidateType, FilePondPluginImagePreview)
const input = document.querySelector('input[type="file"]')
if (!(input instanceof HTMLInputElement)) {
throw new Error('Missing file input')
}
create(input, {
acceptedFileTypes: ['image/*'],
chunkSize: 5_000_000,
chunkUploads: true,
server: {
process: '/api/filepond/process',
patch: '/api/filepond/patch/',
revert: '/api/filepond/revert',
restore: '/api/filepond/restore/',
},
})import { Dropzone } from 'dropzone'
const dropzone = new Dropzone('#dropzone', {
acceptedFiles: 'image/*,video/*',
chunkSize: 2_000_000,
chunking: true,
forceChunking: true,
maxFilesize: 500,
retryChunks: true,
retryChunksLimit: 3,
url: '/api/dropzone/upload',
})
dropzone.on('success', (file, response) => {
console.log('Upload accepted:', file.name, response)
})
dropzone.on('error', (file, message) => {
console.error('Upload failed:', file.name, message)
})Teste o comportamento em falhas antes de escolher a vencedora
Submeta todas as candidatas aos mesmos dados de teste e às mesmas falhas: uma imagem minúscula, um vídeo grande, um arquivo com zero bytes, uma extensão enganosa, uma conexão interrompida, um recarregamento de página, uma autorização expirada, uma requisição final duplicada, um cancelamento pelo usuário e uma rejeição do servidor depois que todos os bytes chegam. Meça os bytes retransmitidos, o tempo de recuperação, o trabalho duplicado no servidor, o vazamento de arquivos temporários e se o usuário consegue entender o estado.
Em seguida, teste a divisão de responsabilidades da integração. Verifique o acesso por teclado, a movimentação do foco, os anúncios de erro, a localização, o uso de memória em dispositivos móveis, o comportamento do framework ao desmontar componentes, as atualizações de dependências e a observabilidade do endpoint. A decisão deve registrar a linha de versão, os plugins selecionados, o protocolo do servidor, o responsável pelo estado dos ativos e o plano de substituição. Esse registro importa mais do que um ranking genérico porque explica por que a escolha continua adequada depois que o desenvolvedor original sai.
Recuperação de rede
Interrompa a transferência em diferentes offsets, recarregue a página e verifique exatamente quais bytes e identificadores do servidor são reaproveitados.
Idempotência no servidor
Repita as requisições de blocos e de conclusão e comprove que um único upload lógico gera um único resultado durável na aplicação.
Estado acessível
Confirme que a seleção, o progresso, o cancelamento, a rejeição e a conclusão continuam compreensíveis sem depender de arrastar e soltar nem da visão.
Caminho de manutenção
Fixe as versões dos pacotes selecionados e mantenha-os atualizados, execute a integração real na CI e guarde dados de teste para os casos-limite do protocolo.
Detalhes técnicos que vale a pena conhecer
- O Uppy Core gerencia o estado compartilhado dos uploads, publica eventos de ciclo de vida e aplica restrições de seleção; plugins instalados separadamente adicionam interfaces e transportes, como Dashboard, Tus ou Transloadit.
- O plugin Tus do Uppy delega a transferência ao cliente tus, de modo que um endpoint que implemente o protocolo tus pode retomar a partir de um offset de upload confirmado pelo servidor em vez de reiniciar o arquivo inteiro.
- O plugin Transloadit do Uppy cria Assemblies, faz o upload via tus, pode obter parâmetros assinados da Assembly por meio de uma função assemblyOptions que chama um servidor confiável e pode, opcionalmente, aguardar os resultados de codificação.
- O FilePond documenta as operações de servidor process, revert, restore, load, fetch, patch e remove; o modo de envio em blocos começa com um POST sem arquivo e depois envia os blocos e as requisições de recuperação ao endpoint patch.
- No FilePond, a pré-visualização de imagens, a validação de tipo de arquivo e os recursos de recorte, redimensionamento, filtro e transformação de imagens são fornecidos por plugins opcionais que precisam ser registrados e mantidos de forma deliberada.
- O Dropzone faz upload via XMLHttpRequest e pode dividir arquivos em blocos, tentar novamente os blocos que falharam ou fazer upload de blocos em paralelo, mas o servidor da aplicação precisa montar e finalizar esses blocos corretamente.
- Uma configuração de arquivos permitidos ou aceitos no lado do cliente melhora o feedback, mas não constitui uma fronteira de segurança, porque as requisições podem contornar o código do navegador e os metadados do arquivo podem ser falsos ou incompletos.
- As três bibliotecas usam semânticas de endpoint, identificadores, comportamentos de cancelamento e metadados de blocos diferentes, então trocar o widget visível não preserva automaticamente o contrato de upload do back-end.
Uma abordagem prática
- 1
Registre o destino obrigatório dos bytes, o protocolo do servidor, a janela de recuperação e o estado final de sucesso.
- 2
Crie protótipos com todos os candidatos sérios usando o endpoint real, e não uma requisição simulada bem-sucedida.
- 3
Teste interrupção, recarregamento, conclusão duplicada, rejeição, cancelamento e autorização expirada.
- 4
Escolha com base na adequação medida ao produto e documente o contrato entre cliente e servidor que agora é responsabilidade da equipe.
Quando a Transloadit é útil
Use o plugin Transloadit do Uppy, que tem manutenção ativa, quando o navegador precisar criar uma Assembly, fazer o upload via tus e acompanhar os resultados do processamento. O Companion hospedado pela Transloadit pode dar suporte a fontes remotas. Uma interface do FilePond ou do Dropzone pode ser conectada por meio de uma integração personalizada, mas, nesse caso, sua equipe passa a ser responsável por esse adaptador e pelo comportamento de recuperação dele.
Limite da arquitetura
Uppy, FilePond e Dropzone são bibliotecas de upload executadas no navegador. Elas podem selecionar arquivos, exibir o progresso e transferir bytes de acordo com um contrato cliente-servidor configurado, mas não substituem a autorização no servidor, a inspeção de conteúdo, o armazenamento durável, o processamento de mídia nem os registros de ativos da aplicação.
Perguntas frequentes
Qual é a melhor biblioteca JavaScript de upload de arquivos?
O Uppy é a opção mais adequada para tus, fontes remotas ou a Transloadit; o FilePond é atraente para um campo de arquivo refinado e voltado a imagens; o Dropzone é útil para uma área convencional de soltar arquivos via XHR. A escolha correta é aquela cujo protocolo de servidor e comportamento em falhas correspondem aos da aplicação.
Upload em blocos é o mesmo que upload retomável?
Não. O envio em blocos divide um arquivo em pedaços. A capacidade de retomada, além disso, preserva uma identidade de upload, descobre o progresso já aceito e continua com segurança após uma interrupção. Avalie a recuperação após recarregamentos e com estado expirado, em vez de verificar apenas se existe uma opção de blocos.
O FilePond ou o Dropzone conseguem fazer upload para a Transloadit?
Eles podem enviar arquivos para uma integração personalizada, mas a Transloadit mantém um plugin oficial do Uppy que coordena a criação da Assembly, o upload via tus e os resultados. Com um adaptador para FilePond ou Dropzone, sua equipe fica responsável pela camada de tradução e pelo comportamento dela em caso de falha.
Restrições de tipo de arquivo no lado do cliente tornam um upload seguro?
Não. Elas oferecem feedback rápido, mas quem faz a chamada pode contornar o código do navegador, e os metadados podem ser enganosos. Aplique autorização, limites de bytes, regras sobre o conteúdo observado e política de armazenamento em limites confiáveis de servidor ou de processamento.
As imagens devem ser redimensionadas no navegador antes do upload?
Somente como uma otimização opcional de largura de banda ou de pré-visualização, quando perder o original for aceitável. O trabalho no navegador varia conforme o dispositivo e não substitui a inspeção autoritativa no servidor, derivados reproduzíveis, a política de metadados nem a retenção de um arquivo de origem.
Como uma equipe deve migrar entre bibliotecas de upload?
Congele o contrato atual entre cliente e servidor, defina identificadores e estados finais equivalentes, execute os dois clientes com os mesmos dados de teste de falha e migre uma superfície do produto de cada vez. Se os protocolos de comunicação forem diferentes, trate o adaptador do servidor como uma migração separada, e não como uma simples troca de componente visual.