Cómo agregar la carga de archivos a un formulario HTML
La carga de archivos es esencial para formularios de solicitud de empleo, envío de documentos y soporte tickets con archivos adjuntos y cualquier flujo de trabajo donde los usuarios necesiten enviar archivos junto con los datos de su formulario.
Esta guía cubre todo lo necesario para agregar la carga de archivos a un formulario HTML, desde el marcado básico hasta el manejo seguro.
Formulario de carga de archivos básico
Dos requisitos para la carga de archivos:
- The form must have
enctype="multipart/form-data" - The form must contain an
<input type="file">element
<form action="https://api.formsfort.com/submit" method="POST" enctype="multipart/form-data"> <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<label for="name">Name</label> <input type="text" id="name" name="name" required />
<label for="resume">Resume</label> <input type="file" id="resume" name="resume" />
<button type="submit">Submit application</button></form>Without enctype="multipart/form-data", the browser sends the form as application/x-www-form-urlencoded and the file data is not included. This is the most common mistake.
Restringir tipos de archivos
Use the accept attribute to limit which files the user can select:
<input type="file" name="document" accept=".pdf,.doc,.docx" /><input type="file" name="photo" accept="image/*" /><input type="file" name="spreadsheet" accept=".csv,.xlsx,.xls" />| Aceptar valor | Permite |
|---|---|
.pdf | Solo archivos PDF |
.pdf,.doc,.docx | Documentos PDF y Word |
image/* | Todos los tipos de imágenes |
image/png,image/jpeg | Solo PNG y JPEG |
video/* | Todos los tipos de videos |
audio/* | Todos los tipos de audio |
.csv,.xlsx | Google Sheets |
The accept attribute only filters the file picker dialog. Users can still bypass it by selecting “All files.” Always validate file types on the server side.
Carga de múltiples archivos
Add the multiple attribute to allow selecting more than one file:
<label for="attachments">Attachments (up to 5 files)</label><input type="file" id="attachments" name="attachments" multiple accept=".pdf,.png,.jpg" />Los archivos se envían como una matriz con el mismo nombre de campo. El backend de su formulario debe manejar varios archivos por campo.
Establece límites de tamaño de archivo
Sugerencia del lado del cliente
Add a hidden MAX_FILE_SIZE field as a hint to the browser (not enforced by all browsers):
<input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> <input type="file" name="document" />El valor está en bytes (10485760 = 10 MB).
Validación del lado del cliente con JavaScript
Para una verificación confiable del tamaño del lado del cliente:
document.querySelector('input[type="file"]').addEventListener("change", (e) => { const maxSize = 10 * 1024 * 1024; for (const file of e.target.files) { if (file.size > maxSize) { alert(`${file.name} is too large. Maximum size is 10MB.`); e.target.value = ""; return; } }});Aplicación del lado del servidor
Siempre aplique límites de tamaño de archivo en el servidor o en el backend de formularios. Se pueden omitir las comprobaciones del lado del cliente.
Aplicar estilo a la entrada del archivo
La entrada de archivo predeterminada se ve diferente en todos los navegadores. Para una apariencia consistente, oculte la entrada nativa y use un botón personalizado:
<label class="file-upload-btn"> <input type="file" name="document" hidden /> Choose file</label><span id="fileName">No file selected</span>
<script> document.querySelector('input[type="file"]').addEventListener("change", (e) => { const name = e.target.files[0]?.name ?? "No file selected"; document.getElementById("fileName").textContent = name; });</script>.file-upload-btn { display: inline-flex; align-items: center; padding: 10px 20px; background: #059669; color: white; border-radius: 8px; cursor: pointer; font-weight: 600;}.file-upload-btn:hover { background: #047857;}Arrastre y suelte carga de archivos
Para una experiencia de carga moderna, agregue soporte para arrastrar y soltar:
<div id="dropZone" class="drop-zone"> <p>Drag files here or click to browse</p> <input type="file" name="document" id="fileInput" hidden /></div>
<script> const dropZone = document.getElementById("dropZone"); const fileInput = document.getElementById("fileInput");
dropZone.addEventListener("click", () => fileInput.click());
dropZone.addEventListener("dragover", (e) => { e.preventDefault(); dropZone.classList.add("dragover"); });
dropZone.addEventListener("dragleave", () => { dropZone.classList.remove("dragover"); });
dropZone.addEventListener("drop", (e) => { e.preventDefault(); dropZone.classList.remove("dragover"); fileInput.files = e.dataTransfer.files; });</script>Manejo seguro de carga de archivos
La carga de archivos introduce riesgos de seguridad. Siga estas prácticas:
Validar tipos MIME del lado del servidor
Do not trust the file extension or the Content-Type header sent by the browser. Check the actual file content (magic bytes) on the server.
Escanear en busca de malware
Los archivos cargados pueden contener malware. Utilice un backend de formularios que escanee los archivos antes de almacenarlos.
Limitar el tamaño de los archivos
Establecer límites de tamaño máximo de archivo para evitar ataques de denegación de servicio a través de cargas grandes.
Restringir los tipos permitidos
Acepte solo los tipos de archivos que su formulario realmente necesita. No permita archivos ejecutables (.exe, .sh, .bat).
Almacena archivos de forma segura
Almacene los archivos cargados fuera de la raíz web o en el almacenamiento en la nube con URL firmadas. Nunca entregue archivos cargados directamente desde un directorio público.
Carga de archivos AJAX con progreso
Para una mejor experiencia de usuario, cargue archivos a través de AJAX con un indicador de progreso:
document.querySelector("form").addEventListener("submit", async (e) => { e.preventDefault(); const form = e.target; const formData = new FormData(form);
const xhr = new XMLHttpRequest(); xhr.open("POST", form.action);
xhr.upload.addEventListener("progress", (e) => { if (e.lengthComputable) { const percent = Math.round((e.loaded / e.total) * 100); document.getElementById("progress").textContent = `${percent}%`; } });
xhr.addEventListener("load", () => { if (xhr.status === 200) { document.getElementById("status").textContent = "Upload complete."; } else { document.getElementById("status").textContent = "Upload failed."; } });
xhr.send(formData);});Resumen
To add file upload to an HTML form, set enctype="multipart/form-data" on the form element and add an <input type="file"> with appropriate accept restrictions. Validate file types and sizes on both the client and server side. Use a form backend service that supports file uploads, MIME validation, and malware scanning for secure handling.
Preguntas frecuentes
¿Cómo agrego un campo de carga de archivos a un formulario HTML?
Establezca el atributo enctype del formulario en multipart/form-data y agregue un elemento de entrada con type='file'. El backend de formularios debe admitir la recepción de envíos de varias partes.
¿Por qué no funciona la carga de mi archivo?
La causa más común es que falta el atributo enctype='multipart/form-data' en el elemento del formulario. Sin él, el navegador envía el formulario como datos codificados en URL y el archivo no se incluye.
¿Cómo restrinjo los tipos de archivos en un formulario HTML?
Utilice el atributo de aceptación en la entrada del archivo para restringir el selector de archivos a tipos o extensiones MIME específicos. Por ejemplo, aceptar='.pdf,.doc' o aceptar='imagen/*'. Valide siempre los tipos de archivos también en el lado del servidor.
¿Cuál es el tamaño máximo de archivo para cargar formularios HTML?
El HTML en sí no limita el tamaño del archivo. El límite lo establece el servidor o el servicio de backend de formularios. La mayoría de los servicios permiten entre 10 y 25 MB por archivo en planes estándar. Utilice un campo MAX_FILE_SIZE oculto como sugerencia del lado del cliente, pero siempre aplique límites en el lado del servidor.
¿Puedo cargar varios archivos en un formulario HTML?
Sí. Agregue el atributo múltiple al elemento de entrada del archivo. El navegador permite seleccionar varios archivos y se envían como una matriz con el mismo nombre de campo.
Comience gratis
¿Listo para agregar formularios a su sitio estático?
No se requiere backend. Apunte su formulario HTML a FormsFort y comience a recibir envíos en minutos.