Zum Hauptinhalt springen

Capacitor Datei-Handling-Leitfaden: Lesen, Schreiben, Wählen, Teilen

Capacitor Datei-Handling-Leitfaden: Lesen und Schreiben von Dateien, auswählen von Verzeichnissen, wählen, anzeigen, öffnen, teilen, herunterladen und hochladen von Dateien auf iOS und Android.

Beitragscredits

Martin Donadieu

Schreiber

Valeria

Rezensent

Jordan

Redakteur

Capacitor Dateien verwalten: Lesen, Schreiben, Wählen, Teilen

Capacitor Dateiverwaltung geht auf einige Grundbausteine hinaus: @capacitor/filesystem Dateien in App-Verzeichnissen zu lesen und zu schreiben Capacitor.convertFileSrc to display them, a picker to import user files, and native plugins to download, upload, open and share. This guide shows each one with Capacitor 8 code, explains which directory to use on iOS and Android, and covers the memory and permission traps that cause most file bugs.

Die Dateihandhabungswerkzeugkiste

Task Aufgabe
Lese, schreibe, liste, kopiere, lösche in der App-Speicherung @capacitor/filesystem
Ein lokales Datei anzeigen in <img>, <video>, <iframe> Capacitor.convertFileSrc (core)
Let the user pick files or a folder @capgo/capacitor-file-picker
Herunterladen mit Fortschrittsanzeige @capacitor/file-transfer oder @capgo/capacitor-downloader herunterladen, während Sie andere Dinge tun können
Hochladen mit Fortschritt @capacitor/file-transfer oder @capgo/capacitor-uploader für Hintergrunduploads
Ein Datei teilen oder zum Download speichern @capgo/capacitor-file-sharer oder @capacitor/share
Eine Datei teilen oder in Downloads speichern @capacitor-community/file-opener
Komprimieren Sie Bilder @capgo/capacitor-file-compressor
Zippen und entzippen @capgo/capacitor-zip

Installieren Sie das Kern-Plugin zuerst:

bun add @capacitor/filesystem
bunx cap sync

Wählen Sie das richtige Verzeichnis

Jeder Filesystem-Aufruf erfordert ein directory. Die falsche Wahl ist die häufigste Ursache für verlorene Dateien und abgelehnte Apps.

Directory iOS-Ortung Android-Location Zurückgesichert Verwenden Sie
Data Documents App-Datei-Verzeichnis (/data/data/<pkg>/files) iOS iCloud, Android Auto-Backup Benutzerdaten, die die App besitzt
Documents Documents (same as Data) Öffentlich Documents Ordner Ja Vermeiden auf Android 11+, siehe unten
Library Library App-Dateien-Verzeichnis iOS: Ja App-Unterstützungsdateien, Datenbanken
LibraryNoCloud Library/NoCloud App-Dateien-Verzeichnis Nein Groß, herunterladbare Inhalte
Cache Library/Caches Anwendungs-Cache-Verzeichnis Nein Temporary files, can be wiped by the OS
External Documents Anwendungs-externes Dateiverzeichnis Nein Große Anwendungsdateien auf Android, gelöscht bei der Deinstallation
ExternalStorage Documents Root des gemeinsamen Speicherorts n/a Nur für Legacy, nicht auf Android 11+ zugänglich

Regeln der Faust:

  • Große herunterladbare Medien (Offline-Videos, Kartenbilder) geht in LibraryNoCloud. Apple lehnt Apps ab, die große herunterladbare Inhalte in iCloud-gesicherten Ordner speichern, wie in den iOS-Daten-Speicherleitlinien beschrieben.
  • Temporäre Dateien (Exporte, die Sie einmal teilen, Thumbnails) gehen in Cache. Speichern Sie niemals die einzige Kopie von Benutzerdaten dort.
  • Dateien, die der Benutzer später außerhalb Ihrer App finden soll gehören nicht in einen App-Ordner überhaupt. Speichern Sie sie über das Teilen, MediaStore Downloads oder den Systemdateiauswahl. Siehe unsere Anleitung zu Android-gekapseltem Speicher in Capacitor.

Eine Datei schreiben

import { Filesystem, Directory, Encoding } from '@capacitor/filesystem';

// Text file
await Filesystem.writeFile({
  path: 'notes/today.txt',
  data: 'Hello from Capacitor',
  directory: Directory.Data,
  encoding: Encoding.UTF8,
  recursive: true, // create notes/ if missing
});

// JSON
await Filesystem.writeFile({
  path: 'settings.json',
  data: JSON.stringify({ theme: 'dark' }),
  directory: Directory.Data,
  encoding: Encoding.UTF8,
});

// Binary file: pass base64 and no encoding
await Filesystem.writeFile({
  path: 'images/logo.png',
  data: base64Png,
  directory: Directory.Data,
  recursive: true,
});

Die encoding Option bestimmt, wie data interpretiert wird. Mit Encoding.UTF8, wird die Zeichenfolge als Text geschrieben. Ohne es, werden native Plattformen die Datei dekodieren. data als Base64 und die Rohdaten schreiben. Vergessen Sie dies und Sie erleben das klassische "Mein PDF ist korrupt"-Fehler.

Um zu einem bestehenden Datei, wie einem Log, hinzuzufügen appendFile Eine Datei lesen

Ein Datei lesen

const { data } = await Filesystem.readFile({
  path: 'settings.json',
  directory: Directory.Data,
  encoding: Encoding.UTF8,
});
const settings = JSON.parse(data as string);

// Binary: returns base64 on native, a Blob on web
const image = await Filesystem.readFile({
  path: 'images/logo.png',
  directory: Directory.Data,
});

, die abgelehnt wird, wenn die Datei fehlt: statGroße Dateien in Blöcken lesen

async function exists(path: string) {
  try {
    await Filesystem.stat({ path, directory: Directory.Data });
    return true;
  } catch {
    return false;
  }
}

Lesen Sie große Dateien in Blöcke

readFile wird die gesamte Datei als eine Basis64-Zeichenkette zurückgegeben. Für ein 200 MB-Video bedeutet dies Hunderte von MB an Zeichenketten im JS-Gedächtnis. readFileInChunks streams es anstatt:

await Filesystem.readFileInChunks(
  { path: 'videos/clip.mp4', directory: Directory.Data, chunkSize: 1024 * 1024 },
  (chunk, err) => {
    if (err) return console.error(err);
    if (chunk === null) return console.log('done');
    processChunk(chunk.data); // base64 chunk
  },
);

Better still, avoid moving the bytes through JS at all. Most “read a big file” tasks are really “upload it” or “display it”, and both have native paths below.

Liste, kopieren, verschieben und löschen

const { files } = await Filesystem.readdir({ path: 'notes', directory: Directory.Data });
for (const f of files) console.log(f.name, f.type, f.size, f.mtime);

await Filesystem.mkdir({ path: 'archive', directory: Directory.Data, recursive: true });

await Filesystem.copy({
  from: 'notes/today.txt',
  to: 'archive/today.txt',
  directory: Directory.Data,
});

await Filesystem.rename({
  from: 'archive/today.txt',
  to: 'archive/2026-10-01.txt',
  directory: Directory.Data,
});

await Filesystem.deleteFile({ path: 'notes/today.txt', directory: Directory.Data });
await Filesystem.rmdir({ path: 'notes', directory: Directory.Data, recursive: true });

copy und rename annehmen toDirectory zum Wechseln zwischen Verzeichnissen, zum Beispiel von Cache zum Data nach Abschluss eines Downloads. Sie akzeptieren auch absolute file:// Pfade, wenn Sie directory, wie Sie Dateien importieren, die von anderen Plugins zurückgegeben werden.

Ein Datei im WebView anzeigen

Laden Sie keine Bilder oder Videos als Base64-Daten-URLs, wenn Sie es vermeiden können. Wandeln Sie den nativen Pfad in eine von Capacitor's lokalen Server bereitgestellte URL um:

import { Capacitor } from '@capacitor/core';

const { uri } = await Filesystem.getUri({ path: 'images/logo.png', directory: Directory.Data });
img.src = Capacitor.convertFileSrc(uri);

Auf iOS sieht das Ergebnis wie capacitor://localhost/_capacitor_file_/...aus, auf Android https://localhost/_capacitor_file_/...Es funktioniert für <img>, <video>, <audio>und fetch(), was bedeutet, dass du auch ein Datei als ein ArrayBuffer ohne Base64:

const buffer = await fetch(Capacitor.convertFileSrc(uri)).then((r) => r.arrayBuffer());

Speichere Pfade, nicht umgewandelte URLs. Die umgewandelte Form ist nur für die aktuelle App-Sitzung gültig.

Wähle Dateien vom Gerät aus

Der Systempicker gibt dem Benutzer die Kontrolle und benötigt keine Speicherberechtigung auf Android 13+ oder iOS:

bun add @capgo/capacitor-file-picker
bunx cap sync
import { CapgoFilePicker } from '@capgo/capacitor-file-picker';

const { files } = await CapgoFilePicker.pickFiles({
  types: ['application/pdf', 'image/*'],
  limit: 5,
  readData: false, // keep false for anything bigger than a few MB
});

for (const file of files) {
  console.log(file.name, file.mimeType, file.size, file.path);
}

Es gibt auch pickImages, pickVideos, pickMedia und pickDirectorycontext convertHeicToJpeg auf iOS. Auf iOS, types nur MIME-Typen, keine Dateierweiterungen.

Gewählte Dateien können sich in einer temporären Location befinden oder hinter einem content:// URI, das nur für eine Weile lesbar ist. Wenn Sie das File später benötigen, kopieren Sie es sofort in Ihren eigenen Verzeichnis. Filesystem.copy.

Dateien herunterladen

Mit Fortschritt: @capacitor/dateiübertragung

Filesystem.downloadFile ist in Filesystem 8 veraltet. Die Ersatzmethode sendet die Antwort direkt auf die Festplatte:

bun add @capacitor/file-transfer
bunx cap sync
import { FileTransfer } from '@capacitor/file-transfer';
import { Directory, Filesystem } from '@capacitor/filesystem';

const { uri } = await Filesystem.getUri({ path: 'downloads/report.pdf', directory: Directory.Data });

const listener = await FileTransfer.addListener('progress', (p) => {
  if (p.lengthComputable) setProgress(p.bytes / p.contentLength);
});

await FileTransfer.downloadFile({
  url: 'https://example.com/report.pdf',
  path: uri,
  progress: true,
  headers: { Authorization: `Bearer ${token}` },
});

await listener.remove();

In den Hintergrund: @capgo/capacitor-herunterladegerät

Für große Dateien, die weiter heruntergeladen werden sollen, wenn der Benutzer die App verlässt, und die pausiert und fortgesetzt werden können, verwenden Sie den Capgo-Herunterladegerät, der auf DownloadManager auf Android und im Hintergrund URLSession auf iOS:

import { CapacitorDownloader } from '@capgo/capacitor-downloader';

await CapacitorDownloader.addListener('downloadProgress', ({ id, progress }) => {
  console.log(id, progress);
});
await CapacitorDownloader.addListener('downloadCompleted', ({ id }) => {
  console.log('done', id);
});

await CapacitorDownloader.download({
  id: 'course-video-12',
  url: 'https://cdn.example.com/course/12.mp4',
  destination: 'videos/12.mp4',
  network: 'wifi-only',
  notification: 'progress', // Android
});

Eine relative destination bezieht sich auf das externe Dateisystem der App auf Android und das Documents Verzeichnis auf iOS, die gleichen Orte wie Directory.External.

Dateien hochladen

Lesen Sie eine Datei nicht in Base64 nur, um sie zu senden. Beide Upload-Optionen lesen direkt von der Festplatte:

import { FileTransfer } from '@capacitor/file-transfer';

const result = await FileTransfer.uploadFile({
  url: 'https://api.example.com/upload',
  path: uri,          // full file:// path
  fileKey: 'file',
  mimeType: 'application/pdf',
  headers: { Authorization: `Bearer ${token}` },
  progress: true,
});
console.log(result.responseCode, result.bytesSent);

For Uploads, die überleben müssen, wenn die App in den Hintergrund geschoben wird (Videos, Batch-Uploads von Fotos), verwenden Sie @capgo/capacitor-uploader, die im Hintergrund läuft URLSession auf iOS und einen Upload-Dienst mit einer Fortschrittsbenachrichtigung auf Android:

import { Uploader } from '@capgo/capacitor-uploader';

const { id } = await Uploader.startUpload({
  filePath: uri,
  serverUrl: 'https://api.example.com/upload',
  method: 'PUT', // binary body, ideal for presigned S3 or R2 URLs
  mimeType: 'video/mp4',
});

Presignierte PUT URLs für Objekt-Speicher sind das zuverlässigste Muster für große Dateien: Ihr API signiert die URL, und das Gerät lädt direkt in den Speicher hoch.

Eine Datei teilen oder exportieren

Lassen Sie den Benutzer ein Datei an eine andere App senden oder speichern, wo sie es finden können:

import { FileSharer } from '@capgo/capacitor-file-sharer';

await FileSharer.share({
  filename: 'report.pdf',
  path: uri,
  contentType: 'application/pdf',
});

// Android: write to Downloads via MediaStore. iOS: opens the share sheet ("Save to Files")
await FileSharer.save({
  filename: 'report.pdf',
  path: uri,
  contentType: 'application/pdf',
});

Der Capgo-Dateiteiler kopiert die Datei in seinen eigenen Cache-Ordner und dient sie über eine dedizierte FileProvider, sodass Sie keine Änderungen vornehmen müssen file_paths.xmlMit der offiziellen @capacitor/shareAndroid kann nur aus dem Cache-Ordner teilen, es sei denn, Sie fügen andere Ordner zu android/app/src/main/res/xml/file_paths.xml.

Eine Datei in einer anderen App öffnen

bun add @capacitor-community/file-opener
bunx cap sync
import { FileOpener } from '@capacitor-community/file-opener';

await FileOpener.open({ filePath: uri, contentType: 'application/pdf' });

On iOS öffnet dies eine Quick Look-Vorschau. Auf Android öffnet es die Standard-App für das MIME-Typ oder zeigt einen Auswahl-Assistenten an. Wenn keine App den Typ handhaben kann, wird die Anfrage abgelehnt, also fangen Sie es und bieten Sie das Teilen an.

Gemeinsame Datei-Rezepte

Erstelle ein PDF: Rendere HTML mit @capgo/capacitor-pdf-generator oder baue es in JS mit pdf-lib, dann schreibe die base64-Ausgabe mit writeFile. Unsere scan to PDF-Tutorial zeigt den vollständigen Workflow.

Entferne GPS aus einer Fotobevor dem Hochladen: @capgo/capacitor-file-compressor entfernt EXIF-Metadaten auf jedem Plattform während der Größe.

Anpassen oder konvertieren Sie ein Bild: Die gleiche Komprimierungssoftware verarbeitet Breite, Höhe, Qualität und Ausgabeformat, einschließlich HEIC zu JPEG.

Viele Dateien in einem Bundle: Ein Ordner mit @capgo/capacitor-zip und laden Sie ein Archiv anstatt hundert Anfragen.

Webunterstützung

@capacitor/filesystem Arbeitet auf der Webanwendung mit IndexedDB, so dass Ihr code im Browser läuft, wenn Sie entwickeln. Beachten Sie die folgenden Unterschiede: Binärleseoperationen liefern ein BlobDateien leben nur im Browserprofil und die Speichergrenzen sind viel niedriger. Für Webbuilds bevorzugen Sie URL.createObjectURL(blob) für die Anzeige.

Schrittweise Lösung

“Die Datei existiert nicht”Sie haben entweder Verzeichnisse durcheinander gemischt oder einen absoluten Pfad zusammen mit einem directoryverwendet. Wählen Sie entweder einen oder den anderen.

Beschädigte Binärdateien: Sie haben Base64 mit Encoding.UTF8Entfernen Sie die Kodierung.

Das App-Programm stürzt mit großen Dateien ab: Base64 über den Bridge. Verwenden Sie Blöcke, Dateiübertragung oder fetch(convertFileSrc(uri)).

Die Bildanzeige funktioniert nicht auf Android: Sie haben eine file:// Konvertieren Sie es mit Capacitor.convertFileSrc.

Failed to find configured root Beim Teilen auf Android: Die Datei befindet sich außerhalb der Pfade in file_paths.xmlVerwenden Sie den Capgo-Datei-Teiler oder kopieren Sie es Cache first.

Dateien verschwinden auf iOS: sie befanden sich in Cache, die iOS unter Speicherdruck löscht.

App Store-Ablehnung für iCloud-Speicher: große herunterladbare Inhalte in Data oder Documents: große herunterladbare Inhalte in LibraryNoCloud.

oder

Die meisten Dateilogs, wie z.B. die Speicherorte, die Wiederholungsregeln und die Namensgebung, finden Sie in JavaScript und können mit dem Capgo Live-Updates nach der Veröffentlichung. Für die Android-Seite der gemeinsamen Speicherung und der Berechtigungen, fahren Sie mit unserem Leitfaden für die verfügbare Speicherung, und sehen Sie sich an. Datei Picker-Dokumentation Für jede Picker-Option.

Live-Updates für Capacitor-Apps

Wenn ein Web-Schicht-Bug live ist, schicken Sie die Reparatur über Capgo anstatt Tage für die Genehmigung im App-Store abzuwarten. Die Benutzer erhalten die Aktualisierung im Hintergrund, während native Änderungen im normalen Review-Verfahren bleiben.

Unterstützung von Menschen von Martin

Get Started Now

Neueste von unserem Blog

Capgo gibt Ihnen die besten Einblicke, die Sie benötigen, um eine wirklich professionelle mobile App zu erstellen.