Häufig gestellte Fragen
Häufige Fragen und Antworten zu Dropup.
Allgemein
Was ist Dropup?
Dropup ist eine leichtgewichtige, headless React-Bibliothek für Datei-Uploads. Sie bietet Drag-and-Drop-Funktionalität, Dateivalidierung, Upload-Fortschrittsverfolgung und Unterstützung für Cloud-Speicher - alles in einem Paket unter 10KB gzipped.
Warum "headless"?
Headless bedeutet, dass Dropup keine UI-Komponenten enthält. Es stellt die Logik und Zustandsverwaltung bereit, während Sie die Benutzeroberfläche nach Ihren Wünschen gestalten. Das gibt Ihnen die volle Kontrolle über das Erscheinungsbild.
Wie groß ist das Bundle?
- Core (
@samithahansaka/dropup): <10KB gzipped - Mit Cloud-Unterstützung: +2KB pro Anbieter
- Mit Bildverarbeitung: +5KB
- Mit tus-Protokoll: +3KB (erfordert tus-js-client Peer-Abhängigkeit)
Unterstützt es TypeScript?
Ja! Dropup ist in TypeScript geschrieben und enthält umfassende Typdefinitionen. Kein @types-Paket erforderlich.
Welche React-Version ist erforderlich?
React 16.8+ (erfordert Hooks-Unterstützung).
Verwendung
Wie lade ich Dateien hoch?
const { files, actions } = useDropup({
upload: { url: '/api/upload' },
});
// Alle Dateien hochladen
actions.upload();
// Bestimmte Dateien hochladen
actions.upload(['file-id-1', 'file-id-2']);
Wie behandle ich Validierungsfehler?
useDropup({
accept: 'image/*',
maxSize: 5 * 1024 * 1024,
onValidationError: (errors) => {
errors.forEach(({ file, errors }) => {
console.log(`${file.name}: ${errors.join(', ')}`);
});
},
});
Kann ich benutzerdefinierte Upload-Logik verwenden?
Ja! Übergeben Sie eine Funktion anstelle eines Konfigurationsobjekts:
useDropup({
upload: async (file, options) => {
const { signal, onProgress } = options;
// Ihre benutzerdefinierte Upload-Logik
const response = await customUpload(file.file, {
signal,
onProgress,
});
return { url: response.url };
},
});
Wie füge ich Dateien programmatisch hinzu?
const { actions } = useDropup();
// Aus der Zwischenablage
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files) {
actions.addFiles(files);
}
});
Kann ich mehrere Ablagezonen haben?
Ja! Jeder useDropup-Aufruf erstellt eine unabhängige Instanz:
const images = useDropup({ accept: 'image/*' });
const documents = useDropup({ accept: '.pdf' });
// Separat verwenden
<div {...images.getDropProps()}>...</div>
<div {...documents.getDropProps()}>...</div>
Uploads
Wie zeige ich den Upload-Fortschritt an?
const { files } = useDropup({ upload: { url: '/api/upload' } });
{files.map(file => (
<div key={file.id}>
{file.name}: {file.progress}%
</div>
))}
Wie breche ich einen Upload ab?
const { actions } = useDropup();
// Bestimmte Datei abbrechen
actions.cancel('file-id');
// Alle Uploads abbrechen
actions.cancel();
Wie wiederhole ich fehlgeschlagene Uploads?
const { actions } = useDropup();
// Bestimmte Dateien wiederholen
actions.retry(['file-id']);
// Alle fehlgeschlagenen wiederholen
actions.retry();
Unterstützt es Chunked Uploads?
Ja! Verwenden Sie createChunkedUploader:
import { createChunkedUploader } from '@samithahansaka/dropup';
useDropup({
upload: createChunkedUploader({
url: '/api/upload/chunk',
chunkSize: 5 * 1024 * 1024, // 5MB
}),
});
Kann ich direkt zu S3 hochladen?
Ja! Verwenden Sie den Cloud-Uploader:
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';
useDropup({
upload: createS3Uploader({
getPresignedUrl: async (file) => {
const res = await fetch('/api/s3/presign', {
method: 'POST',
body: JSON.stringify({ filename: file.name }),
});
return res.json();
},
}),
});
Validierung
Wie beschränke ich Dateitypen?
// Nach MIME-Typ
useDropup({ accept: 'image/*' });
// Nach Erweiterung
useDropup({ accept: '.pdf, .doc' });
// Mehrere
useDropup({ accept: ['image/*', 'application/pdf'] });
Wie setze ich Größenbeschränkungen?
useDropup({
maxSize: 10 * 1024 * 1024, // 10MB max
minSize: 1024, // 1KB min
});
Wie begrenze ich die Anzahl der Dateien?
useDropup({
maxFiles: 5,
});
Kann ich benutzerdefinierte Validierung hinzufügen?
Ja! Verwenden Sie customRules:
useDropup({
customRules: [
(file) => {
if (file.name.includes('draft')) {
return 'Entwurfsdateien sind nicht erlaubt';
}
return true;
},
],
});
Vorschauen
Wie zeige ich Bildvorschauen an?
Vorschauen sind standardmäßig aktiviert:
const { files } = useDropup();
{files.map(file => (
file.preview && <img src={file.preview} alt="" />
))}
Muss ich Vorschau-URLs bereinigen?
Nein! Dropup widerruft Object URLs automatisch, wenn Dateien entfernt werden oder die Komponente ausgehängt wird.
Kann ich Vorschauen deaktivieren?
useDropup({ generatePreviews: false });
Fehlerbehebung
Dateien werden nicht hochgeladen
-
Überprüfen Sie, ob
uploadkonfiguriert ist:useDropup({ upload: { url: '/api/upload' } }); -
Stellen Sie sicher, dass Sie
actions.upload()aufrufen (es sei dennautoUpload: true) -
Überprüfen Sie die Browser-Konsole auf Netzwerkfehler
Vorschau-URLs funktionieren nicht
- Stellen Sie sicher, dass die Datei ein Bild ist
- Überprüfen Sie, dass
generatePreviewsnichtfalseist - Verifizieren Sie, dass das Dateiobjekt eine gültige
preview-Eigenschaft hat
Drag and Drop funktioniert nicht
- Stellen Sie sicher, dass Sie
getDropProps()auf einem Container-Element spreaden - Fügen Sie das versteckte Input hinzu:
<input {...getInputProps()} /> - Überprüfen Sie, dass
disablednichttrueist
TypeScript-Fehler
- Aktualisieren Sie auf die neueste Dropup-Version
- Stellen Sie sicher, dass
tsconfig.jsondie richtigemoduleResolutionhat - Überprüfen Sie, dass
@samithahansaka/dropupindependenciesist, nicht indevDependencies
Speicherlecks
- Stellen Sie sicher, dass Komponenten, die
useDropupverwenden, ordnungsgemäß ausgehängt werden - Rufen Sie bei Bedarf
actions.reset()vor dem Aushängen auf - Speichern Sie Dateien nicht im externen Zustand ohne Bereinigung
Kompatibilität
Funktioniert es mit Next.js?
Ja! Verwenden Sie die 'use client'-Direktive:
'use client';
import { useDropup } from '@samithahansaka/dropup';
Funktioniert es mit React Native?
Ja! Verwenden Sie den Native-Adapter:
import { NativeAdapter } from '@samithahansaka/dropup/native';
useDropup({ adapter: NativeAdapter });
Unterstützt es SSR?
Ja! Dropup ist SSR-sicher. Es verwendet Browser-APIs nur, wenn sie verfügbar sind.
Browser-Unterstützung?
Alle modernen Browser:
- Chrome 60+
- Firefox 55+
- Safari 12+
- Edge 79+
Beitragen
Wie kann ich beitragen?
- Forken Sie das Repository
- Erstellen Sie einen Feature-Branch
- Reichen Sie einen Pull Request ein
Siehe CONTRIBUTING.md für Details.
Wie melde ich Fehler?
Öffnen Sie ein Issue auf github.com/samithahansaka/dropup/issues.
Gibt es eine Roadmap?
Schauen Sie sich die GitHub Issues und Discussions für geplante Features an.