ReboFilesDocs
Empezar3
Qué es ReboFiles
Primeros pasos
Demos para ejecutar
Ponlo en tu app6
Componente de React
Headless: tu propia interfaz
Sin framework
Estilos y temas
Teclado y accesibilidad
Idiomas
Archivos9
Subidas
Vistas previas y el visor
Búsqueda
Cambios en vivo y carpetas grandes
Comentarios
Destacados y campos
Versiones, papelera y espacio
Descargar como .zip
Documentos de Word
El servidor14
La ruta
Frameworks e inicio de sesión
Quién puede hacer qué
Almacenamiento: S3, GCS, Azure y disco
Revisar las subidas
Metadatos: SQLite y Postgres
Esquema de la base de datos
Compartir y enlaces
Actividad y notificaciones
Ganchos, registros y límites
Retención, bloqueos y exportación
Escritorio y otros orígenes
Sincronizar una carpeta
Ir a producción
En equipo1
Asistentes de IA (MCP)
Referencia5
Paquetes
Componentes y hooks
API del cliente
Rutas HTTP
Estado y hoja de ruta
↑↓ para moverte↵ para abrirEsc para cerrar38 páginas

El servidor Compartir y enlaces

Compartir y enlaces

Compartir, en los detalles de una entrada, se la da a alguien por el id que le da tu identify, o a todos los que tienen sesión; lo que hay en una carpeta va con ella.
Personas

Roles

Lector, comentarista o editor, en una entrada y lo que tiene dentro. Aparece en su Compartido conmigo, no en sus Mis archivos, que son solo suyos; al lado, cuántos son nuevos desde la última vez que miró. Para un solo drive de todo un equipo, dale al servidor top: 'everyone'.

Enlaces

Cualquiera que tenga uno puede mirar y descargar, sin iniciar sesión, durante un día, una semana o un mes, o hasta que se quite.

  • Con contraseña: se pide antes de mostrar nada, se envía como x-link-password en cada petición, se guarda solo como la hace scrypt, y tras cada intento fallido se espera un momento.
  • De una descarga: se gasta al descargar un archivo o un .zip de él, no al mirar; sigue funcionando un cuarto de hora después, para los archivos de esa descarga.
// The page a link goes to: app/shared/page.tsx
'use client';
import { SharedLink } from '@rebofiles/react';
import { useSearchParams } from 'next/navigation';

export default function Shared() {
  return <SharedLink base="/api/files" token={useSearchParams().get('link') ?? ''} />;
}

// And in the drive, where its links point:
<FileDrive base="/api/files" linkAddress={(token) => `${origin}/shared?link=${token}`} />
Hasta

Por un tiempo

Compartido con alguien por un día, una semana, un mes o tres: pasado ese tiempo no le da nada, como si se hubiera quitado, y ya no está en su Compartido conmigo.

await client.share(folder.id, 'auditor', 'viewer', 30);   // for thirty days, then nothing
await client.share(folder.id, 'auditor', 'editor');       // another role: the same end
await client.share(folder.id, 'auditor', 'editor', null); // for good

El diálogo y los detalles dicen hasta cuándo; uno terminado lo dice, para compartirlo de nuevo o quitarlo.

Subidas

Solicitudes de archivos

Solicitar archivos, en el menú de una carpeta (y junto a su nombre al estar en ella): un enlace que recibe archivos, “Solo enviar archivos”, sin mostrar nada de lo que hay, o “Ver y añadir archivos”. Hecho, se copia, para abrirlo o enviarlo; quien lo abre sin sesión dice quién es, si quiere, y envía.

// A request for files: whoever opens it sends them, and sees nothing of what is there.
const { token } = await client.createLink(folder.id, 7, {
  uploads: 'only', // or 'also': they see the folder, and may add to it
  request: {
    title: 'Northwind',
    message: 'Send what is missing, please.',
    askName: true,
    email: 'carla@northwind.com',                    // for your app to remind her, and send a receipt
    items: [{ id: 'contract', label: 'Signed contract' }, { id: 'id', label: 'ID' }],
    closeWhenDone: true,                             // closed once both came
    accept: ['application/pdf', 'image/*'],
    maxSize: 25 * 1024 * 1024,
    perSender: true,                                 // Northwind papers / Carla Ruiz / …
    rename: '{item} - {name}',                       // "Signed contract - Carla Ruiz.pdf"
    fields: { client: 'northwind' },                 // found by your CRM with withField
  },
});

createDriveHandler({
  ...options,
  onReceived: ({ entry, from, item, request, got }) => mail(request?.email, `Received: ${item}`),
  onReview: ({ entry, status, reason, from }) => status === 'rejected' && tellToSendAgain(from, reason),
});
// A cron of yours: GET /admin/requests gives every request open, whom it was sent to and what is missing.
  • Quien envía ve cada documento pedido en su propio lugar, con “Elegir archivo” y “Tomar foto”: las fotos de un documento van como un solo PDF. Puede deshacer lo que envió durante diez minutos, y se lleva un comprobante.
  • Lo que llega es del dueño de la carpeta, cuenta en su espacio y dice quién lo envió y qué documento es. Al dueño se le avisa en la campana, lo encuentra todo en Recibidos, y lo acepta o lo devuelve con un motivo.
  • La carpeta muestra sus solicitudes abiertas sobre sus archivos: qué llegó de cada una, qué falta, hasta cuándo.
  • Sube como cualquier archivo, por partes directo al almacenamiento, retomado tras un corte y revisado como cualquiera; el enlace no puede hacer nada más. Su vencimiento y su contraseña valen como en cualquier enlace.
  • La página del enlace lleva el nombre de tu empresa (Ajustes → company) y el color de marca del drive, para que quien envía sepa a quién.
Solicitudes

Plantillas, recordatorios, revisión y vencimientos

Lo que hace una solicitud además de recibir archivos. Cada cosa está activa salvo que el drive o el servidor digan false, y los recordatorios solo con una forma de enviarlos.

import { createDriveHandler, mailReminders, resend } from '@rebofiles/server';

createDriveHandler({
  ...options,
  // Whom a request was sent to, reminded every `remind` days of what is missing, and with "Remind now".
  reminders: mailReminders({
    mail: resend({ apiKey: process.env.RESEND_KEY!, from: 'Acme <files@acme.com>' }), // or (mail) => yourSmtp(mail)
    url: (token) => `https://files.acme.com/?link=${token}`,
  }),
  // Told 15 days before a file's field `expires`, in the bell and here; `false` for none.
  expiring: { days: 15, onExpiring: ({ entry, expires }) => log(entry.name, expires) },
  // What is written in what came, against its document's words and patterns: the core's, yours, or false.
  // check: async ({ entry, item, text }) => ({ missing: [], fields: await readWithYourService(text) }),
});

await client.createLink(folder.id, 30, {
  uploads: 'only',
  request: {
    email: 'carla@northwind.com',
    remind: 3,
    items: [
      { id: 'id', label: 'ID', words: ['INE', 'passport'], expires: true },
      { id: 'tax', label: 'Tax certificate', find: { rfc: '\\b([A-Z&Ñ]{3,4}\\d{6}[A-Z0-9]{3})\\b' } },
    ],
  },
});

// Templates, for everyone of the drive: saved from the dialog, or given as the defaults.
createDriveHandler({ ...options, settings: { requestTemplates: [{ id: 'supplier', name: 'Supplier sign-up', request }] } });
  • Plantillas: “Empezar de una plantilla” arriba del diálogo de una solicitud, y “Guardar como plantilla” para quien puede configurar el drive (lo que pide y cómo, no a quién). Ajustes → Apariencia las lista, para quitar una. requestTemplates: false de la pantalla para ninguna.
  • Un código QR de la dirección, en la página de una solicitud hecha, para mostrarlo a un teléfono o descargarlo como PNG; qr: false para ninguno.
  • Recordatorios: a quien se le envió la solicitud, cada 2, 3 o 7 días mientras falte algo y esté abierta, y al momento con “Recordar ahora”. Sin los reminders del servidor, el diálogo no los ofrece.
  • Revisión: las palabras que debe decir un documento y los campos que buscar en él, contra lo escrito en lo que llegó (su texto, o el OCR de una imagen). Lo que no dice ninguna se marca “No dice …” en Recibidos; una foto borrosa se pide otra vez antes de enviarse (checkBlur: false de la página del enlace para no).
  • Vencimientos: un documento puede pedir hasta cuándo vale. A su dueño se le avisa en la campana quince días antes; Recibidos y los detalles muestran los días que quedan, y “Pedir de nuevo” hace una solicitud de ese solo documento.
Errores

This link does not work any more.

Se quitó, caducó, se usó, lo que leía fue a la papelera, o su dirección cambió por el camino: cuál de ellas, un enlace no se lo dice a quien lo tiene.

This link asks for its password. · That is not the password.

La página del enlace la pide primero, y la envía en cada petición.

Avisos

Avisar a la gente

Actividad y notificaciones: onShare se llama con cada compartición, para enviar un correo o un aviso de tu aplicación.