EmDash incluye una biblioteca de medios para gestionar imágenes, documentos y otros archivos. Esta guía cubre la subida, organización y uso de medios en tu contenido.
Acceder a la biblioteca de medios
Abre la biblioteca de medios desde la barra lateral del admin haciendo clic en Media. La biblioteca muestra todos los archivos subidos con previsualizaciones, nombres de archivo y fechas de subida.
Subir archivos
Desde la biblioteca de medios
-
Haz clic en Media en la barra lateral del admin
-
Haz clic en Upload o arrastra archivos al área de subida
-
Selecciona uno o más archivos de tu computadora
-
Espera a que las subidas se completen
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 computadora
-
Añade texto alternativo y haz clic en Insertar
Tipos de archivo soportados
EmDash soporta 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 soporta múltiples backends de almacenamiento. Configura el almacenamiento en tu configuración de Astro:
Almacenamiento local
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 y despliegues en 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",
},
],
} Compatible con S3
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 (vía API S3), MinIO y otros servicios compatibles con S3.
Cómo funcionan las subidas
EmDash usa URLs firmadas para subidas seguras:
-
El cliente solicita una URL de subida a la API
-
El servidor genera una URL firmada con expiración
-
El cliente sube 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 aplicación y permite subidas 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
-
Introduce un nombre de carpeta
-
Haz clic en Crear
-
Arrastra archivos a 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:
- Tipo - Imágenes, Documentos, Video, Audio
- Fecha - Rango de fecha de subida
- Carpeta - Carpeta específica
Usar medios en contenido
En el editor de texto enriquecido
-
Coloca el 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 sube una nueva
-
Introduce texto alternativo
-
Haz clic en Insertar
Como imagen destacada
-
Abre una entrada de contenido en el editor
-
Encuentra el campo Featured Image en la barra lateral
-
Haz clic en Seleccionar imagen
-
Elige de la biblioteca de medios o sube
-
Haz clic en Guardar
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 campos de medios de EmDash, usa el componente Image de 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 es para la imagen principal visible sin desplazamiento. Establece loading="eager" y fetchpriority="high": loading controla si la carga se difiere, y fetchpriority da al navegador una pista de prioridad para la solicitud.
Eliminar medios
-
Selecciona el/los archivo(s) que quieras eliminar
-
Haz clic en Eliminar
-
Confirma la eliminación
API de medios
Accede a los medios programáticamente usando la API de administración.
Subir un archivo
Sube medios como datos de formulario multipart:
POST /_emdash/api/media
Content-Type: multipart/form-data
Authorization: Bearer YOUR_API_TOKEN
file=<binary file data>
Una subida 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 soporta proveedores de medios externos para alojamiento especializado de imágenes y video. Los proveedores de medios aparecen como pestañas en el selector de medios, permitiendo a los editores elegir entre múltiples fuentes.
Proveedores disponibles
Cloudflare Images
Cloudflare Images proporciona alojamiento de imágenes con optimización automática, redimensionado 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({
// ... configuración de base de datos, almacenamiento
mediaProviders: [
cloudflareImages({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_IMAGES_TOKEN,
// Opcional: dominio de entrega personalizado
deliveryDomain: "images.example.com",
}),
],
}),
],
});Características:
- Explorar y subir 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 video 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({
// ... configuración de base de datos, almacenamiento
mediaProviders: [
cloudflareStream({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_STREAM_TOKEN,
// Opcional: configuración del reproductor
controls: true,
autoplay: false,
loop: false,
}),
],
}),
],
});Características:
- Explorar, buscar y subir videos desde el admin
- Streaming adaptativo HLS y DASH
- Generación automática de miniaturas
- Subida directa para archivos grandes
Usar múltiples proveedores
Puedes configurar múltiples proveedores. Cada uno aparece como 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 del proveedor
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 (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; // ID del proveedor, por defecto "local"
id: string; // ID específico del proveedor
src?: string; // URL directa (para medios locales o valores de cadena simple)
previewUrl?: string; // URL de previsualización para mostrar en admin (proveedores externos)
filename?: string; // Nombre de archivo original
mimeType?: string; // Tipo MIME
width?: number; // Ancho de imagen/video
height?: number; // Alto de imagen/video
alt?: string; // Texto alternativo
meta?: Record<string, unknown>; // Metadatos específicos del proveedor
}
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