Principais pontos
- O Uppy cuida da seleção de arquivos e do progresso do upload; o plugin da Transloadit conecta os uploads à validação gerenciada, ao processamento e à exportação para o seu próprio armazenamento.
- Trate retomada, novas tentativas, idempotência e expiração como controles de confiabilidade separados, com comportamentos de falha diferentes.
- Mantenha a autorização de upload no servidor, valide as propriedades observadas dos arquivos e publique somente a partir de um armazenamento permanente controlado.
Uma API de upload de arquivos deve conectar upload autenticado → validação → processamento → armazenamento pertencente ao cliente. Este guia implementa esse caminho para uploads de imagens: o Uppy oferece a experiência de upload, a Transloadit executa o fluxo de trabalho de processamento gerenciado e o seu bucket S3 armazena o original aceito e a prévia. O Uppy também funciona de forma independente da Transloadit; sua aplicação continua responsável pela autenticação de usuários e por decidir quando um ativo está pronto para publicação.
O que mais importa
- Decida se a solução será desenvolvida internamente, comprada ou híbrida testando requisitos de recuperação, segurança, processamento e operação, e não apenas a demonstração em que tudo dá certo.
- Use exemplos específicos de frameworks somente quando o ciclo de vida, a autorização no servidor e o comportamento de recuperação deles puderem ser mantidos e testados.
Defina a tarefa de upload antes de escolher um widget
Um upload em produção começa antes de o primeiro byte se mover. A aplicação identifica o usuário, decide qual operação é permitida, descreve a quantidade e o tamanho de arquivos aceitáveis e cria um registro que pode sobreviver a uma aba do navegador. A transferência é apenas uma etapa. Validação, processamento, exportação, notificação e reconciliação determinam se o produto pode usar o arquivo com segurança depois.
Escreva um contrato de conclusão em termos de produto. “A requisição retornou 200” é um critério fraco; “o original e os derivados necessários estão armazenados sob este tenant, o registro do ativo indica suas versões e um callback duplicado não altera nada” é testável. Registre quais falhas os usuários podem tentar novamente, quais exigem um novo upload e quais deixam um estado visível para o operador fazer a recuperação.
Plano de controle
Transporta identidade, autorização, limites, escolha de fluxo de trabalho, metadados, status e referências de resultados, e não o conteúdo do arquivo em si.
Plano de dados
Transporta os bytes do arquivo entre o usuário, a aplicação, o serviço de upload, a camada de processamento e o destino de armazenamento durável.
Transição de confiança
Marca quando um upload não confiável passou pelas verificações exigidas para processamento, armazenamento, pré-visualização ou entrega pública.
Escolha um de quatro caminhos explícitos para os bytes
Na retransmissão pela aplicação, o navegador envia o arquivo ao seu servidor, e o seu servidor o encaminha ou armazena. Essa abordagem é fácil de entender e dá controle imediato à aplicação, mas cada byte consome seu tráfego de entrada, memória ou disco temporário, tempo de conexão e tráfego de saída. Ela é adequada para arquivos pequenos e pouco frequentes quando o servidor existente consegue impor limites e fazer streaming com segurança, sem armazenar corpos inteiros em buffer.
“Direto para a nuvem” é ambíguo, então nomeie o destino. O navegador pode fazer upload diretamente para o armazenamento de objetos com credenciais de curta duração, diretamente para serviços de processamento como a Transloadit, ou pedir a algum serviço que importe URLs remotas já existentes. O armazenamento direto minimiza os saltos quando o objetivo é apenas a persistência. O processamento direto mantém a aplicação fora do caminho dos dados enquanto o fluxo de trabalho valida, transforma e exporta os arquivos para um armazenamento próprio.
Retransmissão pela aplicação
Útil para cargas de trabalho modestas e políticas simples, mas a aplicação fica responsável pela capacidade de transferência, pelos timeouts, pelos arquivos temporários e pela escalabilidade.
Armazenamento de objetos direto
Ideal quando a primeira cópia durável é o resultado principal e o processamento posterior pode ser acionado de forma confiável a partir de um evento de armazenamento ou de uma fila.
Serviço de processamento direto
Útil quando o upload e a validação assíncrona, os derivados, os metadados ou a exportação para vários destinos pertencem a um único processo observável.
Importação de origem remota
Move os bytes de servidor para servidor, o que poupa a conexão do usuário, mas exige autorização explícita da origem e limites para a obtenção dos arquivos.
Projete a retomada separadamente das novas tentativas
Uma nova tentativa inicia uma operação de novo; uma transferência retomável continua um upload existente a partir de um offset de bytes confirmado pelo servidor. Com o tus, o cliente guarda a URL do upload, consulta no servidor o Upload-Offset e envia apenas os bytes restantes. Persista essa URL fora do estado transitório do componente caso a recuperação deva funcionar após uma atualização da página ou um travamento, e gere a impressão digital dos arquivos com cuidado para que o arquivo local de um usuário nunca seja associado ao recurso de upload de outro.
A retomada não torna o tempo ilimitado nem o processamento idempotente. Uma Assembly da Transloadit ainda tem oito horas, a partir da criação, para concluir o upload, e criar uma Assembly substituta pode duplicar trabalho, a menos que a aplicação reconcilie o identificador antigo. Defina como o cliente lida com pausa, tempo offline, recursos expirados, arquivos alterados, uploads abandonados e uma resposta de conclusão perdida depois que o servidor aceitou os bytes finais.
Identidade de retomada
Persista a URL de upload emitida pelo servidor junto com o usuário autenticado, a impressão digital do arquivo local, o tamanho esperado e o registro da operação.
Caminho de expiração
Quando o recurso de upload ou a Assembly expirar, crie uma nova operação e descarte o identificador obsoleto, em vez de tentar novamente indefinidamente.
Reconciliação da conclusão
Consulte o status durável após falhas de rede ambíguas, para que o cliente não presuma que uma resposta ausente significa bytes ausentes.
Autorize a intenção no servidor e desconfie dos bytes
O código do navegador pode conter uma Auth Key pública, mas nunca deve conter o Auth Secret da Transloadit nem credenciais de armazenamento permanentes. Autentique o usuário na sua aplicação, selecione um Template salvo no servidor e retorne parâmetros assinados de curta duração com um nonce exclusivo. Defina allow_steps_override como false quando o navegador não tiver um motivo legítimo para substituir Steps, pois, caso contrário, um grafo de Steps selecionado pelo cliente poderia alterar o comportamento de processamento ou de exportação.
Uma assinatura válida prova que o payload de parâmetros foi autorizado; ela não prova que os bytes enviados correspondem a um nome de arquivo, a uma extensão, a um tipo MIME declarado, a um tenant ou a uma política de moderação. Limite o corpo das requisições antes de qualquer trabalho custoso, inspecione as propriedades observadas dos arquivos, rejeite conteúdo não suportado, faça varreduras onde o modelo de ameaças exigir e mantenha resultados não confiáveis longe do armazenamento público até que o fluxo de trabalho atinja um estado aprovado.
Autorização de curta duração
Emita a permissão de upload somente após a autenticação na aplicação e restrinja-a a uma operação selecionada pelo servidor, por tempo limitado.
Propriedades observadas
Use o tipo detectado, as dimensões, a duração e outros metadados inspecionados para o roteamento, em vez de confiar apenas na extensão.
Quarentena antes da publicação
Separe o recebimento da entrega pública para que arquivos inválidos, maliciosos ou rejeitados pela política nunca se tornem, por padrão, um ativo da aplicação.
Separe o armazenamento durável do processamento de uploads
Um endpoint de upload não é automaticamente um sistema de registro. Decida qual bucket ou banco de dados de ativos é o dono do original, como os derivados se relacionam com ele, quais identificadores sobrevivem a renomeações e quem exclui cada cópia. A Transloadit retém resultados temporários por pelo menos 24 horas, enquanto as URLs de acesso a eles podem expirar após algumas horas. Exporte os arquivos que precisam persistir. URLs temporárias servem apenas para recuperação de curto prazo, não para incorporação nem para entrega repetida no produto.
Coloque a exportação dentro da Assembly quando o sucesso do fluxo de trabalho exigir tanto o processamento quanto a persistência. Um Robot de exportação pode usar credenciais de Template armazenadas para gravar os resultados no destino escolhido como parte do fluxo de trabalho. Como alternativa, faça primeiro o upload diretamente para um armazenamento próprio e acione o processamento a partir de um evento controlado. Esse caminho ganha uma cópia durável antecipada, mas adiciona orquestração e mais uma transferência até o processador.
Propriedade do original
Informe se o original é retido, por quanto tempo, sob qual chave de tenant e se fluxos de trabalho posteriores podem lê-lo novamente.
Linhagem dos derivados
Armazene o identificador da origem, a configuração do fluxo de trabalho, o papel da saída, as dimensões, o formato e o checksum necessários para explicar cada resultado.
Fronteira de entrega
Sirva ativos aprovados a partir de armazenamento permanente e de uma camada de entrega intencional, em vez de URLs temporárias de processamento.
Decida entre construir e comprar na fronteira de propriedade
Construa o caminho de transferência quando os requisitos forem restritos e a equipe estiver preparada para assumir todo o ciclo de vida. Um pequeno formulário autenticado que transmite arquivos curtos para um único bucket existente pode não justificar outra plataforma. Ainda assim, a estimativa deve incluir parsing de multipart, backpressure, imposição de limites de tamanho, retomabilidade ou sua ausência deliberada, limpeza, controles contra abuso, observabilidade, atualizações e suporte a falhas que ocorrem fora do tempo de vida da requisição.
Um serviço gerenciado se torna mais atraente à medida que o fluxo de trabalho combina redes instáveis, arquivos grandes, UX de navegador, fontes remotas, inspeção de mídia, transformação ou vários destinos de armazenamento. Comprar não elimina a responsabilidade da aplicação: verificações de tenant, autorização, registros de ativos, retenção, publicação e tratamento de incidentes continuam sendo seus. Um design híbrido costuma funcionar melhor, com armazenamento próprio e estado de negócio em torno de uma camada gerenciada de transferência e processamento.
Custo de construir
Contabilize engenharia, infraestrutura, plantão, manutenção de protocolo, revisão de segurança e suporte ao usuário, e não apenas as tarifas de armazenamento de objetos.
Custo de comprar
Modele bytes de upload, operações de processamento, novas tentativas, transferência de armazenamento, cobranças mínimas, nível de suporte e crescimento esperado.
Propriedade híbrida
Mantenha identidade, política, metadados e armazenamento permanente no seu produto enquanto delega o caminho de dados especializado e o trabalho de processamento.
Compare provedores com testes de falha, não com contagem de recursos
Crie um quadro de avaliação a partir da carga de trabalho real do produto. Compare clientes de navegador e mobile, suporte a protocolos abertos, tamanho máximo de arquivo, comportamento de concorrência, endpoints geográficos, importações remotas, abrangência de processamento, destinos de armazenamento, isolamento de credenciais, verificação de webhooks, retenção de status, suporte e opções de saída. Marque cada recurso como obrigatório, opcional ou irrelevante antes de consultar as páginas dos fornecedores.
Passe os mesmos dados de teste por cada candidato sério. Interrompa um upload grande, recarregue a página, envie um evento de conclusão duplicado, revogue credenciais de armazenamento, recuse um arquivo após o recebimento, exceda um limite e perca a resposta final. Meça a recuperação visível para o usuário, os bytes retransmitidos, o tempo até uma saída durável, as evidências para o operador e a limpeza. Um seletor de arquivos bem-acabado diz pouco sobre essas propriedades de produção.
Portabilidade de protocolo
Um protocolo aberto e retomável e clientes substituíveis reduzem o acoplamento na migração, mas os esquemas de fluxo de trabalho e de resultados ainda exigem planejamento de migração.
Evidências operacionais
Exija identificadores estáveis de job, estados terminais, timestamps, erros acionáveis, callbacks verificados e um procedimento documentado de reexecução.
Custos completos
Compare os custos de transferência, processamento, armazenamento, entrega, suporte, engenharia e recuperação de falhas em um volume mensal representativo.
Implemente um upload assinado com Uppy e Transloadit
No exemplo de navegador, o Uppy gerencia a seleção e a transferência tus, enquanto o plugin da Transloadit solicita parâmetros de Assembly à sua aplicação. O endpoint do servidor precisa autenticar o usuário atual antes de retornar o objeto de calcSignature. Ele deve selecionar o próprio Template em vez de aceitar Steps arbitrários ou um destino de armazenamento fornecido pelo chamador, e deve aplicar limite de taxa à autorização independentemente do tráfego de upload.
Antes de usar este exemplo, ative “Exigir uma assinatura correta” nas Configurações do Workspace, salve o Template abaixo e defina o ID dele em TRANSLOADIT_UPLOAD_TEMPLATE_ID no servidor. Armazene o acesso da AWS ao seu próprio bucket privado como credenciais de Template chamadas my_s3_credentials. A Auth Key pode chegar ao navegador; o Auth Secret e as credenciais da AWS não podem. O endpoint de assinatura precisa retornar Cache-Control: no-store para que cada operação autorizada receba parâmetros novos.
Instale @uppy/core, @uppy/dashboard e @uppy/transloadit no frontend e o SDK Node transloadit no servidor. Monte o exemplo do navegador depois que existir um elemento como <div id="photo-upload"></div>. Implemente /api/transloadit-params no seu framework com autenticação de sessão e autorização de upload antes de chamar a função auxiliar de assinatura. Rejeite requisições não autenticadas ou não autorizadas; a função auxiliar em si não é um endpoint de autenticação.
O exemplo permite uma única imagem JPEG, PNG ou WebP de até 10 MiB. As restrições do Uppy oferecem feedback imediato, enquanto os limites assinados auth.max_size e auth.max_number_of_files e o filtro do lado do servidor no Template aplicam a política. waitForEncoding: true aguarda a Assembly, incluindo a exportação, em vez de tratar a conclusão da transferência como a conclusão do fluxo de trabalho.
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Transloadit from '@uppy/transloadit'
import '@uppy/core/css/style.min.css'
import '@uppy/dashboard/css/style.min.css'
// Mount this once after <div id="photo-upload"></div> exists in your page.
const uppy = new Uppy({
restrictions: {
maxNumberOfFiles: 1,
maxFileSize: 10 * 1024 * 1024,
allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp'],
},
}).use(Dashboard, { inline: true, target: '#photo-upload' }).use(Transloadit, {
async assemblyOptions() {
const response = await fetch('/api/transloadit-params', {
credentials: 'same-origin',
cache: 'no-store',
})
if (!response.ok) {
throw new Error('Could not authorize this upload')
}
return response.json()
},
waitForEncoding: true,
retryDelays: [0, 1000, 3000, 5000, 10000],
})
uppy.on('transloadit:assembly-created', (assembly) => {
// Associate this ID with the server-side operation before the user leaves the page.
console.log('Assembly started:', assembly.assembly_id)
})
uppy.on('transloadit:complete', (assembly) => {
// Record completion against the ID persisted at transloadit:assembly-created.
console.log('Processing completed. Assembly:', assembly.assembly_id)
})
uppy.on('transloadit:assembly-error', () => {
// Show this through the application’s accessible status UI, not raw API errors or URLs.
console.error('Processing failed. Check the Assembly in your workspace.')
})
uppy.on('upload-error', () => {
// Transloadit API signature rejections and Assembly errors also reach this event.
// Failures thrown by assemblyOptions() use Uppy’s general error event instead.
// Deduplicate application notices.
console.error('The upload workflow failed. Check its status before retrying.')
})import { randomUUID } from 'node:crypto'
import { Transloadit } from 'transloadit'
function requiredEnvironmentValue(name: string): string {
const value = process.env[name]
if (value == null) throw new Error(`Missing environment variable: ${name}`)
return value
}
const transloadit = new Transloadit({
authKey: requiredEnvironmentValue('TRANSLOADIT_KEY'),
authSecret: requiredEnvironmentValue('TRANSLOADIT_SECRET'),
})
export function createAuthorizedUploadParameters(): { params: string; signature: string } {
// Call this only after the server has authenticated the request and authorized the operation.
const params = {
auth: {
expires: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
max_size: 10 * 1024 * 1024,
max_number_of_files: 1,
nonce: randomUUID(),
},
template_id: requiredEnvironmentValue('TRANSLOADIT_UPLOAD_TEMPLATE_ID'),
}
return transloadit.calcSignature(params)
}Conecte recebimento, validação, processamento e exportação
Uma única Assembly conecta o caminho completo: upload autenticado com Uppy → validação com /file/filter → processamento com /image/resize → exportação com /s3/store para um bucket pertencente ao cliente. O Template salvo dela fornece o fluxo de trabalho, e cada dependência use determina quais arquivos chegam ao próximo Step. O Uppy fornece a experiência de upload; é a Transloadit, e não o seu servidor de aplicação, que executa o fluxo de trabalho gerenciado.
O filtro verifica o tipo MIME detectado e o tamanho do arquivo e, em seguida, passa apenas as imagens aceitas para os Steps de pré-visualização e exportação. error_on_decline: true transforma uma rejeição em um erro da Assembly. As verificações de MIME e de tamanho não são varredura de malware nem moderação de conteúdo; adicione esses Steps antes do processamento e da exportação quando sua política exigir.
Use um bucket S3 privado com Block Public Access ativado e credenciais de Template com escopo adequado. acl: "bucket-default" omite uma ACL de objeto e depende da política de acesso do bucket; isso não torna privado um bucket público. A exportação armazena o original aceito e uma pré-visualização limitada a 1600 × 1600 pixels, em caminhos específicos da Assembly e do arquivo. Nenhuma das exportações lê diretamente de :original sem filtragem.
{
"allow_steps_override": false,
"steps": {
":original": {
"robot": "/upload/handle"
},
"accepted_images": {
"use": ":original",
"robot": "/file/filter",
"accepts": [
["${file.mime}", "regex", "^image/(jpeg|png|webp)$"]
],
"declines": [["${file.size}", ">", 10485760]],
"error_on_decline": true
},
"preview": {
"use": "accepted_images",
"robot": "/image/resize",
"resize_strategy": "fit",
"width": 1600,
"height": 1600
},
"exported": {
"use": ["accepted_images", "preview"],
"robot": "/s3/store",
"credentials": "my_s3_credentials",
"acl": "bucket-default",
"path": "uploads/${assembly.id}/${file.id}/${file.url_name}"
}
}
}Registrar a operação
Capture o Assembly ID quando transloadit:assembly-created for disparado, não apenas no callback de conclusão. Associe-o ao usuário autenticado e ao registro de upload no seu servidor; não trate um ID fornecido pelo navegador como prova de propriedade.
Confirmar a conclusão durável
Reconcilie o status no seu servidor ou verifique a assinatura de uma Assembly Notification. Exija ASSEMBLY_COMPLETED e as saídas esperadas tanto em results.accepted_images quanto em results.preview antes de marcar o ativo como pronto. Armazene as referências permanentes dos objetos dessas saídas, não URLs temporárias de processamento; uma URL de objeto privado ainda precisa de entrega autorizada.
Lidar com falha parcial
Mantenha não publicadas as operações que falharam e faça com que notificações de conclusão repetidas sejam inofensivas. O original pode ser exportado antes de a pré-visualização terminar, então um erro da Assembly não significa que o bucket está vazio. Reconcilie ou limpe os objetos parciais antes de tentar novamente.
Teste um vídeo grande, do upload interrompido à exportação privada
Para um fluxo de trabalho de vídeo, crie uma credencial de Template chamada large-upload-output usando credenciais IAM cuja permissão s3:PutObject esteja limitada ao prefixo privado upload-tests/. Siga a configuração de IAM do /s3/store para as permissões s3:ListBucket e s3:GetBucketLocation no nível do bucket; a consulta de localização é desnecessária quando a credencial de Template fornece bucket_region. Substitua YOUR_AUTH_KEY pela Auth Key do Workspace (não pelo Auth Secret dele), salve o Template abaixo e exija Signature Authentication nesse Template. Use um bucket privado com Block Public Access ativado e Object Ownership definido como Bucket owner enforced. A configuração acl: "bucket-default" omite uma ACL de objeto; o acesso continua controlado pelas políticas do seu bucket e do IAM. Para o teste, defina o TRANSLOADIT_UPLOAD_TEMPLATE_ID do endpoint de assinatura autenticado como o ID deste Template de vídeo salvo. Reutilize a integração com o Uppy acima com um arquivo selecionado pelo usuário e uma única instância do Uppy. Os limites do Template, de 256 MiB e de um único arquivo, são uma política de exemplo. Espelhe esses limites na opção restrictions do core do Uppy (maxFileSize, maxNumberOfFiles) para ter feedback antecipado no seletor; as verificações do lado do servidor continuam necessárias. Para este teste de vídeo, substitua a restrição exclusiva para imagens por allowedFileTypes: ["video/*"] e defina tanto o maxFileSize do navegador quanto o auth.max_size assinado como 256 * 1024 * 1024; mantenha ambos os limites de quantidade de arquivos em 1. Verifique os limites de upload e os formatos de origem suportados do seu Workspace antes de testar. O Template detecta uma família MIME de vídeo, cria uma versão MP4 com limites definidos e exporta essa versão e o original aceito. Esta não é uma política completa contra malware nem de segurança de conteúdo.
A conclusão da transferência não é a linha de chegada. Com waitForEncoding: true, o navegador aguarda o processamento, mas sua aplicação ainda precisa de um Assembly ID armazenado de forma durável e de notificações verificadas ou de uma consulta ao Assembly Status caso a aba desapareça. Uma falha na exportação não deve marcar o ativo como pronto. Confirme ASSEMBLY_COMPLETED, a versão exigida e ambos os objetos privados no S3; compare o checksum do original exportado com o da entrada antes de registrar o sucesso. Esses objetos privados não são automaticamente URLs públicas de reprodução.
Faça três execuções de controle online e três execuções interrompidas com o mesmo vídeo de 100–200 MiB de sua propriedade. Registre os bytes exatos do arquivo e o SHA-256, a duração e os codecs, as versões do navegador e dos pacotes, o Template, a região, o plano e a configuração de rede. No Chrome DevTools, aplique um perfil de limitação personalizado e registre as configurações dele, mude para Offline quando o upload estiver perto de 25%, por 10 segundos, e restaure o perfil sem recarregar a página. Em falhas de rede reportadas enquanto o navegador está offline e ainda restam tentativas, o plugin tus do Uppy instalado pausa a fila até um evento online. Cada repetição ainda consome uma tentativa; o progresso do upload pode redefinir o contador. A soma de retryDelays não é um limite de tempo offline. Verifique se uma requisição HEAD informa o Upload-Offset salvo e se as requisições PATCH seguintes continuam o mesmo recurso tus. Isso exercita uma interrupção emulada do navegador, não um failover de servidor nem todas as condições de rede.
Meça do início do upload até a primeira Assembly concluída com objetos exportados verificados, não apenas até o último byte enviado. Registre também o tempo da reconexão até a conclusão, os bytes retransmitidos quando for possível observá-los, as falhas, as Assemblies duplicadas e a contagem bruta de execuções. Este é um procedimento de teste reproduzível, não um resultado de benchmark publicado. Novas tentativas limitadas podem se esgotar com falhas repetidas de requisição, o prazo de upload de oito horas da Assembly continua valendo, e este exemplo em memória não restaura o estado depois de recarregar a página ou fechar a aba. Teste separadamente o cancelamento, a autorização expirada, os arquivos acima do limite e as credenciais de exportação revogadas. Consulte a API de upload retomável para a transição para o protocolo e a demonstração de vídeo e S3 (English) para um exemplo de processamento e exportação pública.
{
"allow_steps_override": false,
"auth": {
"key": "YOUR_AUTH_KEY",
"max_size": 268435456,
"max_number_of_files": 1
},
"steps": {
":original": { "robot": "/upload/handle" },
"accepted_video": {
"use": ":original",
"robot": "/file/filter",
"accepts": [["${file.mime}", "regex", "^video/"]],
"error_on_decline": true
},
"rendition": {
"use": "accepted_video",
"robot": "/video/encode",
"ffmpeg_stack": "v7",
"preset": "web/mp4/360p",
"width": 640,
"height": 360,
"resize_strategy": "fit",
"result": true
},
"exported": {
"use": ["accepted_video", "rendition"],
"robot": "/s3/store",
"credentials": "large-upload-output",
"acl": "bucket-default",
"path": "upload-tests/${assembly.id}/${file.id}/${file.url_name}"
}
}
}Detalhes técnicos que vale a pena conhecer
- Um upload do navegador para a aplicação coloca o servidor da aplicação no caminho dos dados, enquanto um design de armazenamento direto ou de processamento direto mantém os bytes do arquivo fora desse manipulador de requisições.
- O protocolo central do tus retoma o upload lendo o
Upload-Offsetdo servidor comHEADe continuando comPATCH; enviar o arquivo inteiro novamente é uma nova tentativa, não uma retomada. - O plugin Transloadit do Uppy usa tus para a transferência de arquivos e pode solicitar parâmetros de Assembly assinados a um back-end da aplicação por meio da função
assemblyOptionsdele. - A Signature Authentication da Transloadit assina os parâmetros codificados em JSON com o Auth Secret em um servidor confiável; o próprio segredo nunca deve ser enviado ao código do navegador.
- Um Template salvo com
allow_steps_overridedefinido como false impede que um cliente não confiável substitua os Steps dele ou selecione outro destino de armazenamento por meio de substituições de Step. - Exporte os arquivos que precisam persistir: os resultados temporários ficam retidos por pelo menos 24 horas, mas as URLs deles podem expirar após algumas horas e se destinam apenas a uma recuperação limitada e de curto prazo.
- Nos uploads tus da Transloadit, a Assembly é criada antes da chegada dos bytes do arquivo e permanece em
ASSEMBLY_UPLOADINGaté que os uploads declarados terminem. - A janela de upload da Transloadit é de oito horas a partir da criação da Assembly, então um cliente retomável ainda precisa de um caminho deliberado de reinício quando a Assembly tiver expirado.
Uma abordagem prática
- 1
Documente o caminho dos bytes, as transições de confiança, o responsável durável e o contrato de conclusão antes de escolher um componente de upload.
- 2
Teste as opções de retransmissão, armazenamento direto e processamento direto com arquivos representativos e falhas de rede.
- 3
Implemente autorização de curta duração no servidor, retomada, validação, exportação e tratamento idempotente dos resultados.
- 4
Faça testes de carga no caminho escolhido e ensaie expiração, callbacks duplicados, credenciais revogadas e falhas parciais.
Quando a Transloadit é útil
Use a Transloadit quando os uploads precisarem de um fluxo de trabalho gerenciado que conecte transferência retomável, validação no lado do servidor, processamento e exportações para um armazenamento que você controla. Os contratos exatos dos parâmetros estão na documentação dos Robots /upload/handle, /file/filter, /image/resize, /video/encode e /s3/store.
Limite da arquitetura
A Transloadit pode receber arquivos, executar fluxos de trabalho de processamento assíncronos e exportar resultados, mas sua aplicação continua responsável pela autenticação de usuários, pela autorização de tenants, pelo registro durável do ativo, pela política de publicação e pela entrega a partir do armazenamento permanente.
Perguntas frequentes
O que significa “upload direto para a nuvem”?
Não se trata de uma única arquitetura. Pode significar do navegador para o armazenamento de objetos, do navegador para um serviço de processamento ou importação de servidor para servidor a partir de outro provedor. Identifique o destino real dos bytes, o mecanismo de autorização, o proprietário durável e o gatilho de processamento antes de comparar implementações.
Os arquivos devem passar pelo meu servidor de aplicação?
Somente quando o benefício de política ou de simplicidade compensar assumir o caminho dos dados. Repassar os arquivos pode funcionar para uploads pequenos e pouco frequentes, mas o armazenamento direto ou o processamento direto evita consumir largura de banda da aplicação, tempo de requisição, disco temporário e capacidade de conexão para cada byte.
Uma nova tentativa é o mesmo que um upload retomável?
Não. Uma nova tentativa normalmente reinicia a transferência, enquanto a retomada continua um recurso existente a partir do offset de bytes confirmado pelo servidor. O cliente precisa manter a identidade do upload e ainda lidar com expiração, arquivos locais alterados e respostas finais ambíguas.
A Transloadit armazena permanentemente os arquivos enviados?
Use um Robot de exportação para os arquivos que precisam persistir. Os resultados temporários de processamento ficam retidos por pelo menos 24 horas, mas suas URLs podem expirar após algumas horas. Fluxos de trabalho de produção devem exportar para um armazenamento controlado ou usar URLs temporárias apenas para uma recuperação limitada e de curto prazo para dentro de uma infraestrutura própria.
Quando devo construir uma API de upload em vez de comprar uma?
Construir pode fazer sentido para um caminho restrito, com arquivos pequenos, um único destino de armazenamento, redes previsíveis e uma equipe pronta para assumir a segurança e as operações. A infraestrutura gerenciada compensa o custo quando a retomada, as fontes remotas, os arquivos grandes, o processamento, os múltiplos destinos ou a recuperação de falhas se tornariam um produto à parte.
O que deve constar em um guia de upload específico de framework?
Um guia de framework deve se concentrar em código de fácil manutenção, comportamento do ciclo de vida, autorização no servidor, recuperação e testes para esse framework. Use as referências vinculadas sobre uploads retomáveis e sobre a API para conhecer os contratos exatos de protocolo e de requisição, e avalie os provedores com base nos requisitos arquiteturais mais amplos descritos acima.
O Uppy exige a Transloadit?
Não. O Uppy é um uploader de código aberto que também funciona de forma independente com um bucket S3, um servidor tus ou outro endpoint de upload compatível. O plugin Transloadit dele é a integração para fluxos de trabalho gerenciados de upload, validação, processamento e exportação. Escolha o Uppy com armazenamento direto quando o trabalho se resumir à transferência; considere o Uppy com a Transloadit quando os arquivos enviados também precisarem de um fluxo de trabalho de processamento gerenciado.
Posso usar uma API gerenciada de upload de arquivos com meu próprio armazenamento?
Sim. Neste exemplo, o Uppy faz o upload para a Transloadit, a Assembly valida a imagem e cria uma prévia, e /s3/store exporta o original aceito e a prévia para o seu bucket S3 usando credenciais de Template armazenadas. O fluxo vai do navegador para a Transloadit e dela para o S3, não é um upload direto do navegador para o S3: os bytes dos arquivos e os resultados temporários passam pela Transloadit. Sua aplicação controla o acesso ao armazenamento durável, a retenção e a publicação.