Aller au contenu principal

Gestion des fichiers

Dropup offre une expérience transparente pour la gestion des fichiers depuis le moment où ils sont sélectionnés jusqu'à leur téléchargement.

Méthodes de sélection de fichiers

Glisser-déposer

Utilisez getDropProps() pour activer le glisser-déposer sur n'importe quel élément :

function DropZone() {
const { getDropProps, getInputProps, state } = useDropup();

return (
<div
{...getDropProps()}
style={{
border: state.isDragging ? '2px dashed blue' : '2px dashed gray',
backgroundColor: state.isDragging ? '#f0f8ff' : 'transparent',
}}
>
<input {...getInputProps()} />
<p>Drop files here</p>
</div>
);
}

Cliquer pour sélectionner

La zone de dépôt est également cliquable par défaut :

<div {...getDropProps()}>
<input {...getInputProps()} />
<p>Click or drag files here</p>
</div>

Sélection programmatique

Ouvrez la boîte de dialogue de fichier par programmation :

const { openFileDialog } = useDropup();

<button onClick={openFileDialog}>
Select Files
</button>

Ajout programmatique de fichiers

Ajoutez des fichiers directement (utile pour les événements de collage ou les intégrations) :

const { actions } = useDropup();

// Depuis le presse-papiers
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files?.length) {
actions.addFiles(files);
}
});

Structure de l'objet fichier

Chaque fichier dans le tableau files a cette structure :

interface DropupFile {
// Identification
id: string; // Identifiant unique (généré automatiquement)
file: File; // Objet File original du navigateur

// Métadonnées
name: string; // Nom du fichier
size: number; // Taille en octets
type: string; // Type MIME (par ex., "image/png")

// Aperçu (pour les images)
preview?: string; // URL d'objet pour l'aperçu

// État du téléchargement
status: FileStatus; // 'idle' | 'uploading' | 'complete' | 'error' | 'paused'
progress: number; // 0-100

// Résultats
uploadedUrl?: string; // URL après un téléchargement réussi
response?: unknown; // Réponse du serveur
error?: DropupError; // Détails de l'erreur en cas d'échec

// Données personnalisées
meta?: Record<string, unknown>;
}

Cycle de vie du statut des fichiers

idle → uploading → complete
↘ error → (retry) → uploading
↘ paused → (resume) → uploading

Valeurs de statut

StatutDescription
idleFichier ajouté mais pas encore en cours de téléchargement
uploadingTéléchargement en cours
completeTéléchargement réussi
errorÉchec du téléchargement
pausedTéléchargement en pause (pour les téléchargements reprenables)

Travailler avec les fichiers

Accéder aux fichiers

const { files } = useDropup();

// Tous les fichiers
console.log(files);

// Filtrer par statut
const uploading = files.filter(f => f.status === 'uploading');
const completed = files.filter(f => f.status === 'complete');
const failed = files.filter(f => f.status === 'error');

Supprimer des fichiers

const { files, actions } = useDropup();

// Supprimer un seul fichier
actions.remove(files[0].id);

// Supprimer tous les fichiers
actions.reset();

Mettre à jour les métadonnées du fichier

const { actions } = useDropup();

// Ajouter des métadonnées personnalisées
actions.updateFileMeta(fileId, {
customField: 'value',
category: 'documents',
});

Aperçus de fichiers

Pour les fichiers image, Dropup peut générer des URL d'aperçu :

const { files } = useDropup({
generatePreviews: true, // par défaut : true
});

// Utiliser l'aperçu dans votre interface utilisateur
{files.map(file => (
file.preview && (
<img
src={file.preview}
alt={file.name}
style={{ maxWidth: 100, maxHeight: 100 }}
/>
)
))}
Gestion de la mémoire

Les URL d'aperçu sont des URL d'objet qui consomment de la mémoire. Dropup les révoque automatiquement lorsque les fichiers sont supprimés ou que le composant est démonté.

Formatage de la taille des fichiers

Aide pour afficher les tailles de fichiers :

function formatFileSize(bytes: number): string {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

// Utilisation
{files.map(file => (
<span>{formatFileSize(file.size)}</span>
))}

Gestion des fichiers volumineux

Pour les fichiers volumineux, envisagez les téléchargements fragmentés :

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

const { files } = useDropup({
upload: createChunkedUploader({
url: '/api/upload',
chunkSize: 5 * 1024 * 1024, // Fragments de 5MB
}),
});

Voir Téléchargements fragmentés pour plus de détails.