O EmDash inclui uma biblioteca de mídia para gerenciar imagens, documentos e outros arquivos. Este guia cobre o upload, organização e uso de mídia no seu conteúdo.
Acessando a biblioteca de mídia
Abra a biblioteca de mídia pela barra lateral do admin clicando em Media. A biblioteca exibe todos os arquivos enviados com previews, nomes de arquivo e datas de upload.
Fazendo upload de arquivos
Da biblioteca de mídia
-
Clique em Media na barra lateral do admin
-
Clique em Upload ou arraste arquivos para a área de upload
-
Selecione um ou mais arquivos do seu computador
-
Aguarde os uploads serem concluídos
Do editor de conteúdo
-
No editor de texto rico, clique no botão de imagem
-
Clique em Upload no seletor de mídia
-
Selecione um arquivo do seu computador
-
Adicione texto alternativo e clique em Inserir
Tipos de arquivo suportados
O EmDash suporta tipos de arquivo web comuns:
| Categoria | Extensões |
|---|---|
| Imagens | .jpg, .jpeg, .png, .gif, .webp, .avif, .svg |
| Documentos | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx |
| Vídeo | .mp4, .webm, .mov |
| Áudio | .mp3, .wav, .ogg |
Backends de armazenamento
O EmDash suporta múltiplos backends de armazenamento. Configure o armazenamento na sua configuração Astro:
Armazenamento 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",
}),
}),
],
});Os arquivos são armazenados no diretório ./uploads. Adequado para desenvolvimento e deploys em servidor único.
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",
}),
}),
],
});Requer um bucket R2 configurado no wrangler.jsonc:
{
"r2_buckets": [
{
"binding": "MEDIA_BUCKET",
"bucket_name": "my-media-bucket",
},
],
} Compatível com 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 com Cloudflare R2 (via API S3), MinIO e outros serviços compatíveis com S3.
Como os uploads funcionam
O EmDash usa URLs assinadas para uploads seguros:
-
O cliente solicita uma URL de upload da API
-
O servidor gera uma URL assinada com expiração
-
O cliente faz upload diretamente para o armazenamento usando a URL assinada
-
O servidor registra os metadados do arquivo no banco de dados
Essa abordagem mantém arquivos grandes fora do seu servidor de aplicação e permite uploads diretos para o armazenamento em nuvem.
Organizando mídia
Pastas
Crie pastas para organizar sua mídia:
-
Clique em New Folder na biblioteca de mídia
-
Digite um nome para a pasta
-
Clique em Criar
-
Arraste arquivos para pastas para organizá-los
Busca
Use a caixa de busca para encontrar arquivos por nome. A busca corresponde a nomes de arquivo parciais.
Filtros
Filtre mídia por:
- Tipo - Imagens, Documentos, Vídeo, Áudio
- Data - Intervalo de data de upload
- Pasta - Pasta específica
Usando mídia no conteúdo
No editor de texto rico
-
Posicione seu cursor onde deseja a imagem
-
Clique no botão de imagem na barra de ferramentas
-
Selecione uma imagem da biblioteca de mídia ou faça upload de uma nova
-
Digite o texto alternativo
-
Clique em Inserir
Como imagem destacada
-
Abra uma entrada de conteúdo no editor
-
Encontre o campo Featured Image na barra lateral
-
Clique em Selecionar imagem
-
Escolha da biblioteca de mídia ou faça upload
-
Clique em Salvar
Em campos personalizados
Para campos configurados como tipos de imagem ou arquivo, clique no campo para abrir o seletor de mídia.
Exibindo mídia em templates
Acesse URLs de mídia a partir dos seus dados de conteúdo:
---
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 ?? ""}
/>
)}
Imagens responsivas
Para campos de mídia do EmDash, use o 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 é para a imagem principal acima da dobra. Define loading="eager" e fetchpriority="high": loading controla se o carregamento é adiado, e fetchpriority dá ao navegador uma dica de prioridade para a requisição.
Excluindo mídia
-
Selecione o(s) arquivo(s) que deseja excluir
-
Clique em Excluir
-
Confirme a exclusão
API de mídia
Acesse mídia programaticamente usando a API de administração.
Fazer upload de um arquivo
Faça upload de mídia como dados de formulário multipart:
POST /_emdash/api/media
Content-Type: multipart/form-data
Authorization: Bearer YOUR_API_TOKEN
file=<binary file data>
Um upload bem-sucedido retorna o item de mídia armazenado:
{
"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 mídia
A seguinte requisição lista mídia sob um prefixo:
GET /_emdash/api/media?prefix=images/&limit=20
Authorization: Bearer YOUR_API_TOKEN
Excluir mídia
A seguinte requisição exclui um arquivo armazenado:
DELETE /_emdash/api/media/images/hero.jpg
Authorization: Bearer YOUR_API_TOKEN
Provedores de mídia
Além do armazenamento local, o EmDash suporta provedores de mídia externos para hospedagem especializada de imagens e vídeos. Os provedores de mídia aparecem como abas no seletor de mídia, permitindo que editores escolham de múltiplas fontes.
Provedores disponíveis
Cloudflare Images
Cloudflare Images fornece hospedagem de imagens com otimização automática, redimensionamento e conversão de formato.
import { defineConfig } from "astro/config";
import emdash from "emdash/astro";
import { cloudflareImages } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
// ... configuração de banco de dados, armazenamento
mediaProviders: [
cloudflareImages({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_IMAGES_TOKEN,
// Opcional: domínio de entrega personalizado
deliveryDomain: "images.example.com",
}),
],
}),
],
});Recursos:
- Navegar e fazer upload de imagens diretamente do admin
- Otimização automática de imagens e conversão de formato
- Transformações baseadas em URL (redimensionar, recortar, formato)
- Variantes flexíveis para imagens responsivas
Cloudflare Stream
Cloudflare Stream fornece hospedagem de vídeo com 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({
// ... configuração de banco de dados, armazenamento
mediaProviders: [
cloudflareStream({
accountId: import.meta.env.CF_ACCOUNT_ID,
apiToken: import.meta.env.CF_STREAM_TOKEN,
// Opcional: configurações do player
controls: true,
autoplay: false,
loop: false,
}),
],
}),
],
});Recursos:
- Navegar, buscar e fazer upload de vídeos do admin
- Streaming adaptativo HLS e DASH
- Geração automática de thumbnails
- Upload direto para arquivos grandes
Usando múltiplos provedores
Você pode configurar múltiplos provedores. Cada um aparece como uma aba no seletor de mídia:
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,
}),
],
}),
],
});
A biblioteca de mídia local (aba “Library”) está sempre disponível junto com quaisquer provedores configurados.
Renderizando mídia do provedor
Use o componente Image para renderizar mídia:
---
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}
/>
)}
O componente automaticamente:
- Detecta o provedor a partir do valor armazenado
- Renderiza um elemento
<img>otimizado - Aplica otimizações específicas do provedor (ex. transformações do Cloudflare Images)
Tipo MediaValue
Campos de mídia armazenam um objeto MediaValue contendo informações do provedor:
interface MediaValue {
provider?: string; // ID do provedor, padrão "local"
id: string; // ID específico do provedor
src?: string; // URL direta (para mídia local ou valores de string simples)
previewUrl?: string; // URL de preview para exibição no admin (provedores externos)
filename?: string; // Nome do arquivo original
mimeType?: string; // Tipo MIME
width?: number; // Largura da imagem/vídeo
height?: number; // Altura da imagem/vídeo
alt?: string; // Texto alternativo
meta?: Record<string, unknown>; // Metadados específicos do provedor
}
Isso permite ao EmDash renderizar mídia corretamente independentemente de onde está hospedada.
Próximos passos
- Trabalhando com conteúdo - Usar mídia no seu conteúdo
- Criar um blog - Adicionar imagens a posts do blog
- Consultando conteúdo - Exibir mídia em templates