EmDash incluye una biblioteca de medios para gestionar imágenes, documentos y otros archivos. Esta guía cubre la carga, organización y uso de medios en tu contenido.
Acceder a la Biblioteca de Medios
Abre la biblioteca de medios desde la barra lateral de administración haciendo clic en Media. La biblioteca muestra todos los archivos cargados con vistas previas, nombres de archivo y fechas de carga.
Subir Archivos
Desde la Biblioteca de Medios
-
Haz clic en Media en la barra lateral de administración
-
Haz clic en Upload o arrastra archivos al área de carga
-
Selecciona uno o más archivos de tu ordenador
-
Espera a que se completen las cargas
Desde el Editor de Contenido
-
En el editor de texto enriquecido, haz clic en el botón de imagen
-
Haz clic en Upload en el selector de medios
-
Selecciona un archivo de tu ordenador
-
Añade texto alternativo y haz clic en Insert
Tipos de Archivo Compatibles
EmDash admite tipos de archivo web comunes:
| Categoría | Extensiones |
|---|---|
| Imágenes | .jpg, .jpeg, .png, .gif, .webp, .avif, .svg |
| Documentos | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx |
| Video | .mp4, .webm, .mov |
| Audio | .mp3, .wav, .ogg |
Backends de Almacenamiento
EmDash admite múltiples backends de almacenamiento. Configura el almacenamiento en tu configuración de Astro:
Local Storage
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",
}),
}),
],
});Los archivos se almacenan en el directorio ./uploads. Adecuado para desarrollo e implementaciones de un solo servidor.
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",
}),
}),
],
});Requiere un bucket R2 configurado en wrangler.jsonc:
{
"r2_buckets": [
{
"binding": "MEDIA_BUCKET",
"bucket_name": "my-media-bucket",
},
],
} S3-Compatible
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",
}),
}),
],
});Funciona con Cloudflare R2 (a través de la API S3), MinIO y otros servicios compatibles con S3.
Cómo Funcionan las Cargas
EmDash utiliza URLs firmadas para cargas seguras:
-
El cliente solicita una URL de carga desde la API
-
El servidor genera una URL firmada con vencimiento
-
El cliente carga directamente al almacenamiento usando la URL firmada
-
El servidor registra los metadatos del archivo en la base de datos
Este enfoque mantiene los archivos grandes fuera de tu servidor de aplicaciones y permite cargas directas al almacenamiento en la nube.
Organizar Medios
Carpetas
Crea carpetas para organizar tus medios:
-
Haz clic en New Folder en la biblioteca de medios
-
Ingresa un nombre de carpeta
-
Haz clic en Create
-
Arrastra archivos a las carpetas para organizarlos
Búsqueda
Usa el cuadro de búsqueda para encontrar archivos por nombre. La búsqueda coincide con nombres de archivo parciales.
Filtros
Filtra medios por:
- Type - Imágenes, Documentos, Video, Audio
- Date - Rango de fecha de carga
- Folder - Carpeta específica
Usar Medios en Contenido
En el Editor de Texto Enriquecido
-
Coloca tu cursor donde quieras la imagen
-
Haz clic en el botón de imagen en la barra de herramientas
-
Selecciona una imagen de la biblioteca de medios o carga una nueva
-
Ingresa texto alternativo
-
Haz clic en Insert
Como Imagen Destacada
-
Abre una entrada de contenido en el editor
-
Encuentra el campo Featured Image en la barra lateral
-
Haz clic en Select Image
-
Elige de la biblioteca de medios o carga
-
Haz clic en Save
En Campos Personalizados
Para campos configurados como tipos de imagen o archivo, haz clic en el campo para abrir el selector de medios.
Mostrar Medios en Plantillas
Accede a las URLs de medios desde tus datos de contenido:
---
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 ?? ""}
/>
)}
Imágenes Responsivas
Para imágenes responsivas, usa el componente Image de Astro con URLs externas:
---
import { Image } from "astro:assets";
import { getEmDashEntry } from "emdash";
const { entry: post } = await getEmDashEntry("posts", Astro.params.slug);
---
{post?.data.featured_image && (
<Image
src={post.data.featured_image}
alt={post.data.featured_image_alt ?? ""}
width={800}
height={450}
/>
)}
Eliminar Medios
-
Selecciona el/los archivo(s) que deseas eliminar
-
Haz clic en Delete
-
Confirma la eliminación
API de Medios
Accede a medios programáticamente usando la API de administración.
Subir un Archivo
Sube medios como datos de formulario multiparte:
POST /_emdash/api/media
Content-Type: multipart/form-data
Authorization: Bearer YOUR_API_TOKEN
file=<binary file data>
Una carga exitosa devuelve el elemento de medios almacenado:
{
"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
}
}
}
Listar Medios
La siguiente solicitud lista medios bajo un prefijo:
GET /_emdash/api/media?prefix=images/&limit=20
Authorization: Bearer YOUR_API_TOKEN
Eliminar Medios
La siguiente solicitud elimina un archivo almacenado:
DELETE /_emdash/api/media/images/hero.jpg
Authorization: Bearer YOUR_API_TOKEN
Proveedores de Medios
Además del almacenamiento local, EmDash admite proveedores de medios externos para alojamiento especializado de imágenes y videos. Los proveedores de medios aparecen como pestañas en el selector de medios, permitiendo a los editores elegir de múltiples fuentes.
Proveedores Disponibles
Cloudflare Images
Cloudflare Images proporciona alojamiento de imágenes con optimización automática, redimensionamiento y conversión de formato.
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareImages } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
// ... database, storage config
mediaProviders: [
cloudflareImages({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_IMAGES_TOKEN,
// Optional: custom delivery domain
deliveryDomain: "images.example.com",
}),
],
}),
],
});Características:
- Explorar y cargar imágenes directamente desde el admin
- Optimización automática de imágenes y conversión de formato
- Transformaciones basadas en URL (redimensionar, recortar, formato)
- Variantes flexibles para imágenes responsivas
Cloudflare Stream
Cloudflare Stream proporciona alojamiento de videos con streaming adaptativo HLS/DASH.
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareStream } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
// ... database, storage config
mediaProviders: [
cloudflareStream({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_STREAM_TOKEN,
// Optional: player settings
controls: true,
autoplay: false,
loop: false,
}),
],
}),
],
});Características:
- Explorar, buscar y cargar videos desde el admin
- Streaming adaptativo HLS y DASH
- Generación automática de miniaturas
- Carga directa para archivos grandes
Usar Múltiples Proveedores
Puedes configurar múltiples proveedores. Cada uno aparece como una pestaña en el selector de medios:
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,
}),
],
}),
],
});
La biblioteca de medios local (pestaña “Library”) siempre está disponible junto con cualquier proveedor configurado.
Renderizar Medios de Proveedores
Usa el componente Image para renderizar medios:
---
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}
/>
)}
El componente automáticamente:
- Detecta el proveedor del valor almacenado
- Renderiza un elemento
<img>optimizado - Aplica optimizaciones específicas del proveedor (p. ej., transformaciones de Cloudflare Images)
Tipo MediaValue
Los campos de medios almacenan un objeto MediaValue que contiene información del proveedor:
interface MediaValue {
provider?: string; // Provider ID, defaults to "local"
id: string; // Provider-specific ID
src?: string; // Direct URL (for local media or plain-string values)
previewUrl?: string; // Preview URL for admin display (external providers)
filename?: string; // Original filename
mimeType?: string; // MIME type
width?: number; // Image/video width
height?: number; // Image/video height
alt?: string; // Alt text
meta?: Record<string, unknown>; // Provider-specific metadata
}
Esto permite a EmDash renderizar medios correctamente independientemente de dónde estén alojados.
Próximos Pasos
- Trabajar con Contenido - Usar medios en tu contenido
- Crear un Blog - Añadir imágenes a publicaciones de blog
- Consultar Contenido - Mostrar medios en plantillas