EmDash enthält eine Medienbibliothek zur Verwaltung von Bildern, Dokumenten und anderen Dateien. Diese Anleitung behandelt das Hochladen, Organisieren und Verwenden von Medien in Ihren Inhalten.
Zugriff auf die Medienbibliothek
Öffnen Sie die Medienbibliothek über die Admin-Seitenleiste, indem Sie auf Media klicken. Die Bibliothek zeigt alle hochgeladenen Dateien mit Vorschauen, Dateinamen und Upload-Daten an.
Dateien hochladen
Aus der Medienbibliothek
-
Klicken Sie auf Media in der Admin-Seitenleiste
-
Klicken Sie auf Upload oder ziehen Sie Dateien in den Upload-Bereich
-
Wählen Sie eine oder mehrere Dateien von Ihrem Computer
-
Warten Sie, bis die Uploads abgeschlossen sind
Aus dem Content-Editor
-
Klicken Sie im Rich-Text-Editor auf die Bild-Schaltfläche
-
Klicken Sie auf Upload in der Medienauswahl
-
Wählen Sie eine Datei von Ihrem Computer
-
Fügen Sie Alt-Text hinzu und klicken Sie auf Einfügen
Unterstützte Dateitypen
EmDash unterstützt gängige Web-Dateitypen:
| Kategorie | Erweiterungen |
|---|---|
| Bilder | .jpg, .jpeg, .png, .gif, .webp, .avif, .svg |
| Dokumente | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx |
| Video | .mp4, .webm, .mov |
| Audio | .mp3, .wav, .ogg |
Speicher-Backends
EmDash unterstützt mehrere Speicher-Backends. Konfigurieren Sie den Speicher in Ihrer Astro-Konfiguration:
Lokaler Speicher
import { defineConfig } from "astro/config";
import emdash, { local } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: local({
directory: "./uploads",
baseUrl: "/_emdash/api/media/file",
}),
}),
],
});Dateien werden im Verzeichnis ./uploads gespeichert. Geeignet für Entwicklung und Einzelserver-Deployments.
Cloudflare R2
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { r2 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
storage: r2({
binding: "MEDIA_BUCKET",
publicUrl: "https://media.example.com",
}),
}),
],
});Erfordert einen R2-Bucket, der in wrangler.jsonc konfiguriert ist:
{
"r2_buckets": [
{
"binding": "MEDIA_BUCKET",
"bucket_name": "my-media-bucket",
},
],
} S3-kompatibel
import { defineConfig } from "astro/config";
import emdash, { s3 } from "emdash/astro";
export default defineConfig({
integrations: [
emdash({
storage: s3({
endpoint: "https://s3.amazonaws.com",
bucket: "my-media-bucket",
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: "us-east-1",
publicUrl: "https://media.example.com",
}),
}),
],
});Funktioniert mit Cloudflare R2 (über S3-API), MinIO und anderen S3-kompatiblen Diensten.
Wie Uploads funktionieren
EmDash verwendet signierte URLs für sichere Uploads:
-
Der Client fordert eine Upload-URL von der API an
-
Der Server generiert eine signierte URL mit Ablaufdatum
-
Der Client lädt direkt zum Speicher über die signierte URL hoch
-
Der Server speichert die Datei-Metadaten in der Datenbank
Dieser Ansatz hält große Dateien von Ihrem Anwendungsserver fern und ermöglicht direkte Uploads zum Cloud-Speicher.
Medien organisieren
Ordner
Erstellen Sie Ordner, um Ihre Medien zu organisieren:
-
Klicken Sie auf New Folder in der Medienbibliothek
-
Geben Sie einen Ordnernamen ein
-
Klicken Sie auf Erstellen
-
Ziehen Sie Dateien in Ordner, um sie zu organisieren
Suche
Verwenden Sie das Suchfeld, um Dateien nach Namen zu finden. Die Suche findet auch teilweise Dateinamen.
Filter
Filtern Sie Medien nach:
- Typ - Bilder, Dokumente, Video, Audio
- Datum - Upload-Datumsbereich
- Ordner - Bestimmter Ordner
Medien in Inhalten verwenden
Im Rich-Text-Editor
-
Platzieren Sie den Cursor dort, wo Sie das Bild haben möchten
-
Klicken Sie auf die Bild-Schaltfläche in der Toolbar
-
Wählen Sie ein Bild aus der Medienbibliothek oder laden Sie ein neues hoch
-
Geben Sie Alt-Text ein
-
Klicken Sie auf Einfügen
Als Featured Image
-
Öffnen Sie einen Inhaltseintrag im Editor
-
Finden Sie das Feld Featured Image in der Seitenleiste
-
Klicken Sie auf Bild auswählen
-
Wählen Sie aus der Medienbibliothek oder laden Sie hoch
-
Klicken Sie auf Speichern
In benutzerdefinierten Feldern
Für Felder, die als Bild- oder Dateitypen konfiguriert sind, klicken Sie auf das Feld, um die Medienauswahl zu öffnen.
Medien in Templates anzeigen
Greifen Sie auf Medien-URLs aus Ihren Inhaltsdaten zu:
---
import { getEmDashEntry } from "emdash";
const { entry: post } = await getEmDashEntry("posts", Astro.params.slug);
---
{post?.data.featured_image && (
<img
src={post.data.featured_image}
alt={post.data.featured_image_alt ?? ""}
/>
)}
Responsive Bilder
Für EmDash-Medienfelder verwenden Sie die Image-Komponente aus emdash/ui:
---
import { Image } from "emdash/ui";
import { getEmDashEntry } from "emdash";
const { entry: post } = await getEmDashEntry("posts", Astro.params.slug);
---
{post?.data.featured_image && (
<Image
image={post.data.featured_image}
width={800}
height={450}
priority
/>
)}
priority ist für das primäre Above-the-Fold-Bild. Es setzt loading="eager" und fetchpriority="high": loading steuert, ob das Laden verzögert wird, und fetchpriority gibt dem Browser einen Prioritätshinweis für die Anfrage.
Medien löschen
-
Wählen Sie die Datei(en), die Sie löschen möchten
-
Klicken Sie auf Löschen
-
Bestätigen Sie die Löschung
Medien-API
Greifen Sie programmgesteuert über die Admin-API auf Medien zu.
Eine Datei hochladen
Laden Sie Medien als Multipart-Formulardaten hoch:
POST /_emdash/api/media
Content-Type: multipart/form-data
Authorization: Bearer YOUR_API_TOKEN
file=<binary file data>
Ein erfolgreicher Upload gibt das gespeicherte Medienelement zurück:
{
"success": true,
"data": {
"item": {
"id": "01ABC123",
"filename": "hero-image.jpg",
"mime_type": "image/jpeg",
"storage_key": "media/abc123/hero-image.jpg",
"width": 1200,
"height": 800
}
}
}
Medien auflisten
Die folgende Anfrage listet Medien unter einem Präfix auf:
GET /_emdash/api/media?prefix=images/&limit=20
Authorization: Bearer YOUR_API_TOKEN
Medien löschen
Die folgende Anfrage löscht eine gespeicherte Datei:
DELETE /_emdash/api/media/images/hero.jpg
Authorization: Bearer YOUR_API_TOKEN
Medien-Provider
Zusätzlich zum lokalen Speicher unterstützt EmDash externe Medien-Provider für spezialisiertes Bild- und Video-Hosting. Medien-Provider erscheinen als Tabs in der Medienauswahl und ermöglichen es Redakteuren, aus mehreren Quellen zu wählen.
Verfügbare Provider
Cloudflare Images
Cloudflare Images bietet Bild-Hosting mit automatischer Optimierung, Größenanpassung und Formatkonvertierung.
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareImages } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
// ... Datenbank-, Speicherkonfiguration
mediaProviders: [
cloudflareImages({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_IMAGES_TOKEN,
// Optional: benutzerdefinierte Auslieferungsdomain
deliveryDomain: "images.example.com",
}),
],
}),
],
});Funktionen:
- Bilder direkt aus dem Admin durchsuchen und hochladen
- Automatische Bildoptimierung und Formatkonvertierung
- URL-basierte Transformationen (Größenanpassung, Zuschnitt, Format)
- Flexible Varianten für responsive Bilder
Cloudflare Stream
Cloudflare Stream bietet Video-Hosting mit HLS/DASH-adaptivem Streaming.
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareStream } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
// ... Datenbank-, Speicherkonfiguration
mediaProviders: [
cloudflareStream({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_STREAM_TOKEN,
// Optional: Player-Einstellungen
controls: true,
autoplay: false,
loop: false,
}),
],
}),
],
});Funktionen:
- Videos aus dem Admin durchsuchen, suchen und hochladen
- HLS- und DASH-adaptives Streaming
- Automatische Thumbnail-Generierung
- Direkt-Upload für große Dateien
Mehrere Provider verwenden
Sie können mehrere Provider konfigurieren. Jeder erscheint als Tab in der Medienauswahl:
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareImages, cloudflareStream } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
storage: r2({ binding: "MEDIA" }),
mediaProviders: [
cloudflareImages({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_IMAGES_TOKEN,
}),
cloudflareStream({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_STREAM_TOKEN,
}),
],
}),
],
});
Die lokale Medienbibliothek (Tab “Library”) ist immer verfügbar, zusammen mit allen konfigurierten Providern.
Provider-Medien rendern
Verwenden Sie die Image-Komponente zum Rendern von Medien:
---
import { Image } from "emdash/ui";
import { getEmDashEntry } from "emdash";
const { entry: post } = await getEmDashEntry("posts", Astro.params.slug);
---
{post?.data.featured_image && (
<Image
image={post.data.featured_image}
width={800}
height={450}
/>
)}
Die Komponente erkennt automatisch:
- Den Provider aus dem gespeicherten Wert
- Rendert ein optimiertes
<img>-Element - Wendet provider-spezifische Optimierungen an (z.B. Cloudflare Images Transformationen)
MediaValue-Typ
Medienfelder speichern ein MediaValue-Objekt mit Provider-Informationen:
interface MediaValue {
provider?: string; // Provider-ID, Standard ist "local"
id: string; // Provider-spezifische ID
src?: string; // Direkte URL (für lokale Medien oder einfache String-Werte)
previewUrl?: string; // Vorschau-URL für Admin-Anzeige (externe Provider)
filename?: string; // Originaler Dateiname
mimeType?: string; // MIME-Typ
width?: number; // Bild-/Videobreite
height?: number; // Bild-/Videohöhe
alt?: string; // Alt-Text
meta?: Record<string, unknown>; // Provider-spezifische Metadaten
}
Dies ermöglicht EmDash, Medien korrekt zu rendern, unabhängig davon, wo sie gehostet werden.
Nächste Schritte
- Mit Inhalten arbeiten - Medien in Ihren Inhalten verwenden
- Blog erstellen - Bilder zu Blog-Posts hinzufügen
- Inhalte abfragen - Medien in Templates anzeigen