0Pricing
React Academy · Lección

Subir archivos a una API de backend

Utilice FormData y fetch para enviar archivos mediante POST y realizar un seguimiento del progreso de carga.

Subir archivos a una API de backend es una lección gratuita de React Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Bienvenida

En esta lección utilizará la API FormData y fetch para enviar archivos a un backend mediante POST, realizará un seguimiento del progreso de carga con XMLHttpRequest y mostrará el estado de la carga en React.

API FormData

FormData es una API del navegador que crea cuerpos de solicitud multipart/form-data, el formato que esperan los servidores para las cargas de archivos. Añada el archivo y cualquier campo de metadatos a un objeto FormData.
const formData = new FormData();
formData.append('file', selectedFile);
formData.append('description', 'Profile photo');

Carga con fetch

Pase el objeto FormData como cuerpo de fetch. NO establezca Content-Type manualmente: el navegador define automáticamente el límite multipart correcto.
const response = await fetch('/api/upload', {
  method: 'POST',
  body: formData,
  // Do not set Content-Type header here!
});

Gestión del estado de carga

Realice un seguimiento del estado de carga con tres variables de estado: `uploading` (booleano), `progress` (de 0 a 100) y `error` (cadena o null). Muestre indicadores de carga, barras de progreso y mensajes de error según estos valores.
const [uploading, setUploading] = useState(false);
const [progress, setProgress] = useState(0);
const [error, setError] = useState(null);

Progreso de carga con XMLHttpRequest

La API fetch no admite eventos de progreso de carga. Use el evento `upload.onprogress` de XMLHttpRequest para obtener actualizaciones porcentuales.
const xhr = new XMLHttpRequest();
xhr.upload.onprogress = (e) => {
  if (e.lengthComputable) {
    setProgress(Math.round((e.loaded / e.total) * 100));
  }
};
xhr.open('POST', '/api/upload');
xhr.send(formData);

Envoltura de XHR en una Promise

Envuelva la llamada a XMLHttpRequest en una Promise para poder esperarla con await y gestionar los errores mediante async/await.
function uploadFile(file) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.onload = () => resolve(xhr.response);
    xhr.onerror = () => reject(new Error('Upload failed'));
    xhr.upload.onprogress = (e) => setProgress(Math.round(e.loaded / e.total * 100));
    xhr.open('POST', '/api/upload');
    xhr.send(new FormData().set && (() => { const f = new FormData(); f.append('file', file); xhr.send(f); })());
  });
}

Gestión de la respuesta del servidor

Analice la respuesta JSON del servidor después de una carga correcta. Actualice el estado de la interfaz con la URL o el ID devuelto.
const res = await fetch('/api/upload', { method: 'POST', body: fd });
if (!res.ok) throw new Error('Upload failed');
const { url } = await res.json();
setUploadedUrl(url);

Gestión de errores

Capture siempre los errores de red y del servidor. Muestre un mensaje de error comprensible para el usuario y permita volver a intentarlo. Restablezca el estado de progreso y de carga dentro del bloque catch.
try {
  setUploading(true);
  await uploadToServer(file);
} catch (err) {
  setError(err.message);
} finally {
  setUploading(false);
}

Cancelación de una carga

Use un AbortController con fetch para cancelar una carga en curso. Almacene el controlador en una ref para poder llamar a abort() desde un botón de cancelación.
const abortRef = useRef();

const start = async () => {
  abortRef.current = new AbortController();
  await fetch('/api/upload', { body: fd, signal: abortRef.current.signal });
};
const cancel = () => abortRef.current?.abort();

Cargas de varios archivos

Cargue varios archivos en paralelo mediante Promise.all o de forma secuencial con un bucle for-of. Realice un seguimiento del progreso individual de cada archivo mediante un objeto indexado por nombre de archivo.

Comprobación rápida

¿Por qué NO debe establecer manualmente el encabezado Content-Type cuando utiliza fetch con FormData?

Resumen

Use FormData para crear las cargas que enviará. Use fetch sin Content-Type para que el límite se establezca automáticamente. Use upload.onprogress de XMLHttpRequest para realizar un seguimiento del progreso. Gestione los errores adecuadamente y admita la cancelación con AbortController.

Curso completado

¡Enhorabuena! Ha terminado **Componentes no controlados y cargas de archivos**. Ahora puede gestionar entradas no controladas, selección de archivos, arrastrar y soltar, y cargas multipart con seguimiento del progreso.

Preguntas frecuentes

¿La lección «Subir archivos a una API de backend» es gratis?

Sí — el texto completo de «Subir archivos a una API de backend» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Subir archivos a una API de backend»?

Utilice FormData y fetch para enviar archivos mediante POST y realizar un seguimiento del progreso de carga. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Subir archivos a una API de backend»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Inputs no controlados con useRef
  2. Input de archivo y lectura de datos
  3. Interfaz de carga de archivos mediante arrastrar y soltar
  4. Subir archivos a una API de backend
← Volver a React Academy