Aller au contenu principal

Validation des fichiers

Dropup fournit une validation complète des fichiers pour garantir que seuls les fichiers valides sont acceptés.

Options de validation​

Accept (Types de fichiers)​

Spécifiez quels types de fichiers accepter :

// Accepter uniquement les images
useDropup({ accept: 'image/*' });

// Accepter des types spécifiques
useDropup({ accept: 'image/png, image/jpeg' });

// Accepter par extension
useDropup({ accept: '.pdf, .doc, .docx' });

// Plusieurs catégories
useDropup({ accept: ['image/*', 'application/pdf', '.txt'] });

Modèles Accept courants​

ModèleDescription
image/*Toutes les images
image/png, image/jpegPNG et JPEG uniquement
video/*Toutes les vidéos
audio/*Tous les fichiers audio
application/pdfFichiers PDF uniquement
.doc, .docxDocuments Word
*/*Tous les fichiers (par défaut)

Limites de taille de fichier​

useDropup({
maxSize: 10 * 1024 * 1024, // 10MB maximum
minSize: 1024, // 1KB minimum
});

Limite du nombre de fichiers​

useDropup({
maxFiles: 5, // Maximum 5 fichiers
});

Limites de dimensions d'image​

useDropup({
accept: 'image/*',
maxWidth: 4096, // Largeur maximale en pixels
maxHeight: 4096, // Hauteur maximale en pixels
minWidth: 100, // Largeur minimale en pixels
minHeight: 100, // Hauteur minimale en pixels
});

Règles de validation personnalisées​

Créez une logique de validation personnalisée :

useDropup({
customRules: [
// Règle 1 : Vérifier la longueur du nom de fichier
(file) => {
if (file.name.length > 100) {
return 'Filename must be less than 100 characters';
}
return true;
},

// Règle 2 : Vérifier un contenu spécifique
(file) => {
if (file.name.includes('draft')) {
return 'Draft files are not allowed';
}
return true;
},

// Règle 3 : Validation asynchrone
async (file) => {
const hash = await calculateHash(file);
const exists = await checkDuplicate(hash);
if (exists) {
return 'This file has already been uploaded';
}
return true;
},
],
});

Valeurs de retour des règles​

Valeur de retourSignification
trueValidation réussie
falseValidation échouée (erreur générique)
stringValidation échouée avec message personnalisé

Gestion des erreurs de validation​

Utilisez le callback onValidationError :

useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,
onValidationError: (errors) => {
errors.forEach(({ file, errors: fileErrors }) => {
console.log(`${file.name} failed validation:`);
fileErrors.forEach(error => console.log(` - ${error}`));
});

// Afficher un message convivial
toast.error(`${errors.length} file(s) failed validation`);
},
});

Structure d'erreur de validation​

interface ValidationError {
file: File; // Le fichier qui a échoué
errors: string[]; // Tableau de messages d'erreur
}

Règles de validation prédéfinies​

Dropup inclut des règles de validation courantes :

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

useDropup({
customRules: [
commonRules.noExecutables, // Bloquer .exe, .bat, etc.
commonRules.noHiddenFiles, // Bloquer les fichiers commençant par .
commonRules.maxFilenameLength(50),
commonRules.allowedExtensions(['.jpg', '.png', '.pdf']),
],
});

Retour de validation lors du glissement​

Fournissez un retour visuel pendant le glissement :

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

// state.isDragAccept - les fichiers correspondent aux critères d'acceptation
// state.isDragReject - les fichiers ne correspondent pas

return (
<div
{...getDropProps()}
style={{
borderColor: state.isDragAccept
? 'green'
: state.isDragReject
? 'red'
: 'gray',
}}
>
{state.isDragReject && <p>File type not accepted!</p>}
</div>
);
}

Exemple de validation complète​

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

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

// Limites de taille
maxSize: 10 * 1024 * 1024, // 10MB
minSize: 100, // 100 octets (empêcher les fichiers vides)

// Limite de nombre
maxFiles: 10,

// Dimensions d'image (pour les images uniquement)
maxWidth: 8000,
maxHeight: 8000,

// Règles personnalisées
customRules: [
commonRules.noExecutables,
commonRules.maxFilenameLength(100),

// Personnalisé : pas de fichiers avec des espaces
(file) => {
if (file.name.includes(' ')) {
return 'Filenames cannot contain spaces';
}
return true;
},
],

// Gestion des erreurs
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>❌ Some files will be rejected</p>
) : (
<p>📁 Drop files here (JPEG, PNG, PDF only, max 10MB)</p>
)}
</div>
);
}