Pular para o conteúdo principal

Validação de Arquivos

O Dropup oferece validação abrangente de arquivos para garantir que apenas arquivos válidos sejam aceitos.

Opções de Validação

Accept (Tipos de Arquivo)

Especifique quais tipos de arquivo aceitar:

// Aceitar apenas imagens
useDropup({ accept: 'image/*' });

// Aceitar tipos específicos
useDropup({ accept: 'image/png, image/jpeg' });

// Aceitar por extensão
useDropup({ accept: '.pdf, .doc, .docx' });

// Múltiplas categorias
useDropup({ accept: ['image/*', 'application/pdf', '.txt'] });

Padrões Comuns de Accept

PadrãoDescrição
image/*Todas as imagens
image/png, image/jpegApenas PNG e JPEG
video/*Todos os vídeos
audio/*Todos os arquivos de áudio
application/pdfApenas arquivos PDF
.doc, .docxDocumentos Word
*/*Todos os arquivos (padrão)

Limites de Tamanho de Arquivo

useDropup({
maxSize: 10 * 1024 * 1024, // Máximo 10MB
minSize: 1024, // Mínimo 1KB
});

Limite de Quantidade de Arquivos

useDropup({
maxFiles: 5, // Máximo de 5 arquivos
});

Limites de Dimensão de Imagem

useDropup({
accept: 'image/*',
maxWidth: 4096, // Largura máxima em pixels
maxHeight: 4096, // Altura máxima em pixels
minWidth: 100, // Largura mínima em pixels
minHeight: 100, // Altura mínima em pixels
});

Regras de Validação Personalizadas

Crie lógica de validação personalizada:

useDropup({
customRules: [
// Regra 1: Verificar tamanho do nome do arquivo
(file) => {
if (file.name.length > 100) {
return 'O nome do arquivo deve ter menos de 100 caracteres';
}
return true;
},

// Regra 2: Verificar conteúdo específico
(file) => {
if (file.name.includes('draft')) {
return 'Arquivos de rascunho não são permitidos';
}
return true;
},

// Regra 3: Validação assíncrona
async (file) => {
const hash = await calculateHash(file);
const exists = await checkDuplicate(hash);
if (exists) {
return 'Este arquivo já foi enviado';
}
return true;
},
],
});

Valores de Retorno das Regras

Valor de RetornoSignificado
trueValidação passou
falseValidação falhou (erro genérico)
stringValidação falhou com mensagem personalizada

Tratando Erros de Validação

Use o callback onValidationError:

useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,
onValidationError: (errors) => {
errors.forEach(({ file, errors: fileErrors }) => {
console.log(`${file.name} falhou na validação:`);
fileErrors.forEach(error => console.log(` - ${error}`));
});

// Mostrar mensagem amigável ao usuário
toast.error(`${errors.length} arquivo(s) falharam na validação`);
},
});

Estrutura do Erro de Validação

interface ValidationError {
file: File; // O arquivo que falhou
errors: string[]; // Array de mensagens de erro
}

Regras de Validação Pré-construídas

O Dropup inclui regras de validação comuns:

import { commonRules } from '@samithahansaka/dropup';

useDropup({
customRules: [
commonRules.noExecutables, // Bloquear .exe, .bat, etc.
commonRules.noHiddenFiles, // Bloquear arquivos começando com .
commonRules.maxFilenameLength(50),
commonRules.allowedExtensions(['.jpg', '.png', '.pdf']),
],
});

Feedback Visual Durante Arraste

Forneça feedback visual durante o arraste:

function DropZone() {
const { getDropProps, state } = useDropup({
accept: 'image/*',
});

// state.isDragAccept - arquivos correspondem aos critérios de accept
// state.isDragReject - arquivos não correspondem

return (
<div
{...getDropProps()}
style={{
borderColor: state.isDragAccept
? 'green'
: state.isDragReject
? 'red'
: 'gray',
}}
>
{state.isDragReject && <p>Tipo de arquivo não aceito!</p>}
</div>
);
}

Exemplo Completo de Validação

import { useDropup, commonRules } from '@samithahansaka/dropup';

function UploaderSeguro() {
const { files, state, getDropProps, getInputProps } = useDropup({
// Tipo de arquivo
accept: ['image/jpeg', 'image/png', 'application/pdf'],

// Limites de tamanho
maxSize: 10 * 1024 * 1024, // 10MB
minSize: 100, // 100 bytes (prevenir arquivos vazios)

// Limite de quantidade
maxFiles: 10,

// Dimensões de imagem (apenas para imagens)
maxWidth: 8000,
maxHeight: 8000,

// Regras personalizadas
customRules: [
commonRules.noExecutables,
commonRules.maxFilenameLength(100),

// Personalizado: sem arquivos com espaços
(file) => {
if (file.name.includes(' ')) {
return 'Nomes de arquivo não podem conter espaços';
}
return true;
},
],

// Tratamento de erros
onValidationError: (errors) => {
errors.forEach(({ file, errors }) => {
alert(`${file.name}: ${errors.join(', ')}`);
});
},
});

return (
<div
{...getDropProps()}
className={`dropzone ${
state.isDragReject ? 'reject' : state.isDragAccept ? 'accept' : ''
}`}
>
<input {...getInputProps()} />
{state.isDragReject ? (
<p>Alguns arquivos serão rejeitados</p>
) : (
<p>Solte arquivos aqui (apenas JPEG, PNG, PDF, máx 10MB)</p>
)}
</div>
);
}