Drive-Upload
Misskeys Drive ist das Dateispeichersystem. Alle an Notizen angehefteten Dateien muessen zuerst in Ihr Drive hochgeladen werden. Das client.drive-Facade stellt die Unter-APIs files, folders und stats bereit.
Siehe auch Drive-Helfer für Vorgänge, die mehrere Anfragen kombinieren, etwa das Auflisten aller Dateien, Sammelverschiebungen, Batch-Uploads und das rekursive Löschen von Ordnern.
Eine Datei hochladen
import 'dart:io';
final bytes = await File('photo.jpg').readAsBytes();
final driveFile = await client.drive.files.create(
bytes: bytes,
filename: 'photo.jpg',
comment: 'Alt text for accessibility',
);
print(driveFile.id); // Diese ID zum Anhaengen an eine Notiz verwenden
print(driveFile.url); // Oeffentliche URL
Mit Ordner und Sensitivitaet hochladen
final driveFile = await client.drive.files.create(
bytes: bytes,
filename: 'nsfw.jpg',
folderId: myFolderId,
isSensitive: true,
force: true, // Hochladen, auch wenn eine Datei mit demselben Inhalt existiert
);
Misskey dedupliziert Uploads anhand des Inhalts (MD5-Hash), nicht anhand des Namens. Ohne force gibt ein Upload von Inhalten, die bereits in Ihrem Drive vorhanden sind, die vorhandene Datei zurück; die angegebenen Parameter folderId, name und comment werden ignoriert. Um die Übertragung der Bytes ganz zu vermeiden, siehe createDeduplicated() in Drive-Helfer.
Upload-Fortschritt
final driveFile = await client.drive.files.create(
bytes: largeBytes,
filename: 'large-video.mp4',
onSendProgress: (sent, total) {
final percent = (sent / total * 100).toStringAsFixed(1);
print('Uploading: $percent%');
},
);
Von URL hochladen
await client.drive.files.uploadFromUrl(
url: 'https://example.com/image.jpg',
folderId: myFolderId,
isSensitive: false,
);
Dies ist ein Fire-and-Forget-Endpunkt; die Datei erscheint asynchron im Drive. force hat dieselbe Bedeutung wie bei create(). Um auf die resultierende Datei zu warten, verwenden Sie uploadFromUrlAndWait().
Drive-Dateien an Notizen anhaengen
final driveFile = await client.drive.files.create(
bytes: imageBytes,
filename: 'photo.jpg',
);
final note = await client.notes.create(
text: 'Check this out!',
fileIds: [driveFile.id],
);
Mehrere Dateien koennen durch Angabe mehrerer IDs in fileIds angehaengt werden.
Dateien auflisten
// Dateien im Stammordner auflisten
final files = await client.drive.files.list(limit: 20);
// Dateien in einem bestimmten Ordner auflisten
final files = await client.drive.files.list(
limit: 20,
folderId: myFolderId,
);
// Nach MIME-Typ filtern
final images = await client.drive.files.list(type: 'image/*');
// Absteigend nach Groesse sortieren
final large = await client.drive.files.list(sort: '+size');
sort akzeptiert: +createdAt, -createdAt, +name, -name, +size, -size (+ bedeutet absteigend).
Nur +createdAt (oder kein sort) ist mit der Paginierung über untilId konsistent. Andere Sortierungen ändern die Reihenfolge, während der Cursor weiterhin nach ID filtert, sodass Seiten Einträge überspringen oder wiederholen. Um alle Dateien aufzulisten, verwenden Sie listAll() und sortieren Sie lokal; siehe Drive-Helfer.
Stream (alle Dateien, kein Ordnerfilter)
final all = await client.drive.stream(limit: 20, type: 'video/*');
Nach Name suchen
final found = await client.drive.files.find(
name: 'photo.jpg',
folderId: myFolderId,
);
Auf Duplikate pruefen
final exists = await client.drive.files.checkExistence(md5: fileMd5);
Dateidetails abrufen
// Nach Datei-ID
final file = await client.drive.files.showByFileId(fileId);
// Nach URL
final file = await client.drive.files.showByUrl('https://example.com/file.jpg');
Dateiattribute aktualisieren
final updated = await client.drive.files.update(
fileId: driveFile.id,
name: 'new-name.jpg',
comment: Optional('Updated alt text'), // Optional.null_() clears it
isSensitive: false,
);
In einen anderen Ordner verschieben:
await client.drive.files.update(
fileId: driveFile.id,
folderId: newFolderId,
);
In den Stammordner verschieben:
await client.drive.files.update(
fileId: driveFile.id,
moveToRoot: true,
);
Dateien loeschen
await client.drive.files.delete(fileId: driveFile.id);
Ordnerverwaltung
// Stammordner auflisten
final folders = await client.drive.folders.list();
// Einen Ordner erstellen
final folder = await client.drive.folders.create(
name: 'Vacation Photos',
);
// Einen verschachtelten Ordner erstellen
final nested = await client.drive.folders.create(
name: 'Day 1',
parentId: folder.id,
);
// Einen Ordner umbenennen
await client.drive.folders.update(
folderId: folder.id,
name: 'Summer 2025',
);
// In den Stammordner verschieben
await client.drive.folders.update(
folderId: folder.id,
moveToRoot: true,
);
// Einen Ordner loeschen (muss leer sein)
await client.drive.folders.delete(folderId: folder.id);
Drive-Statistiken
final capacity = await client.drive.stats.getCapacity();
print('Used: ${capacity.usage} bytes');
print('Capacity: ${capacity.capacity} bytes');