Zum Inhalt springen

Speicheroptionen

EmDash speichert hochgeladene Medien wie Bilder, Dokumente und Videos in einem konfigurierbaren Storage-Backend. Wählen Sie die Variante passend zu Ihrer Plattform und Ihren Anforderungen.

StorageBestens geeignet fürFunktionen
R2 BindingCloudflare WorkersSchnelle Integration mit wenig Konfiguration
S3Jede PlattformSignierte Uploads, CDN-Support
LocalEntwicklungEinfacher Dateisystem-Speicher

Verwenden Sie R2-Bindings bei der Bereitstellung auf Cloudflare Workers für die schnellste Integration.

astro.config.mjs
import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
storage: r2({ binding: "MEDIA" }),
}),
],
});
OptionTypBeschreibung
bindingstringR2-Bindingsname aus wrangler.jsonc
publicUrlstringOptionale öffentliche URL für den Bucket

Fügen Sie das R2-Binding zu Ihrer Wrangler-Konfiguration hinzu:

{
"r2_buckets": [
{
"binding": "MEDIA",
"bucket_name": "emdash-media"
}
]
}

Für öffentliche Medien-URLs aktivieren Sie den öffentlichen Zugriff auf Ihrem R2-Bucket:

  1. Gehen Sie zu Cloudflare Dashboard > R2 > Ihren Bucket
  2. Aktivieren Sie den öffentlichen Zugriff unter Einstellungen
  3. Fügen Sie die öffentliche URL zu Ihrer Konfiguration hinzu:
storage: r2({
binding: "MEDIA",
publicUrl: "https://pub-xxxx.r2.dev",
});

Der S3-Adapter funktioniert mit Cloudflare R2 (über die S3-API), MinIO und anderen S3-kompatiblen Diensten.

astro.config.mjs
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: s3({
endpoint: process.env.S3_ENDPOINT,
bucket: process.env.S3_BUCKET,
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: "auto", // Optional, Standard ist "auto"
publicUrl: process.env.S3_PUBLIC_URL, // Optionale öffentliche URL oder CDN-URL
}),
}),
],
});
OptionTypBeschreibung
endpointstringS3-Endpunkt-URL
bucketstringBucket-Name
accessKeyIdstringZugangsschlüssel
secretAccessKeystringGeheimer Schlüssel
regionstringRegion (Standard: "auto")
publicUrlstringOptionale CDN- oder öffentliche URL

Verwenden Sie S3-Zugangsdaten mit R2 für Funktionen wie signierte Upload-URLs:

storage: s3({
endpoint: "https://<account-id>.r2.cloudflarestorage.com",
bucket: "emdash-media",
accessKeyId: process.env.R2_ACCESS_KEY_ID,
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
publicUrl: "https://pub-xxxx.r2.dev",
});

Generieren Sie R2-API-Zugangsdaten im Cloudflare-Dashboard unter R2 > Manage R2 API Tokens.

storage: s3({
endpoint: "https://minio.example.com",
bucket: "emdash-media",
accessKeyId: process.env.MINIO_ACCESS_KEY,
secretAccessKey: process.env.MINIO_SECRET_KEY,
publicUrl: "https://minio.example.com/emdash-media",
});

Verwenden Sie lokalen Speicher für die Entwicklung. Dateien werden in einem Verzeichnis auf der Festplatte gespeichert.

astro.config.mjs
import emdash, { local } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});
OptionTypBeschreibung
directorystringVerzeichnispfad für die Dateispeicherung
baseUrlstringBasis-URL zum Ausliefern von Dateien

Die baseUrl sollte mit dem Medien-Datei-Endpunkt von EmDash (/_emdash/api/media/file) übereinstimmen, es sei denn, Sie konfigurieren einen benutzerdefinierten statischen Dateiserver.

Wechseln Sie Storage-Backends basierend auf der Umgebung:

astro.config.mjs
import emdash, { s3, local } from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
const storage = import.meta.env.PROD
? r2({ binding: "MEDIA" })
: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
});
export default defineConfig({
integrations: [emdash({ storage })],
});

Der S3-Adapter unterstützt signierte Upload-URLs, die es Clients ermöglichen, direkt in den Speicher hochzuladen, ohne über Ihren Server zu gehen. Dies verbessert die Leistung bei großen Dateien.

Signierte Uploads sind automatisch aktiviert, wenn der S3-Adapter verwendet wird. Die Admin-Oberfläche nutzt sie, wenn verfügbar.

Adapter, die signierte Uploads unterstützen:

  • S3 (einschließlich R2 über S3-API)

Adapter, die keine signierten Uploads unterstützen:

  • R2 Binding (verwenden Sie stattdessen den S3-Adapter mit R2-Zugangsdaten)
  • Local

Alle Storage-Adapter implementieren dieselbe Schnittstelle:

interface Storage {
upload(options: {
key: string;
body: Buffer | Uint8Array | ReadableStream;
contentType: string;
}): Promise<UploadResult>;
download(key: string): Promise<DownloadResult>;
delete(key: string): Promise<void>;
exists(key: string): Promise<boolean>;
list(options?: ListOptions): Promise<ListResult>;
getSignedUploadUrl(options: SignedUploadOptions): Promise<SignedUploadUrl>;
getPublicUrl(key: string): string;
}

Diese einheitliche Schnittstelle ermöglicht es, das Storage-Backend zu wechseln, ohne den Anwendungscode anpassen zu müssen.