Cómo crear un formulario web para subir un fichero al servidor (en HTML y PHP) con comprobaciones de tamaño y tipo de fichero. El ejemplo limitará el tamaño del fichero a subir y, como ejemplo, únicamente admitirá ficheros de imagen y de tipo jpg, bmp o png.

Ejemplo de formulario web HTML para subir un fichero

Mostramos el código HTML y CSS de ejemplo de un formulario que muestra un botón para elegir un fichero local y subirlo al servidor. Dicho formulario web incluye un atributo para establecer el límite del tamaño del fichero a subir en 2 Megabytes (2.097.152 bytes). También incluye código JavaScript para mostrar el nombre del fichero a subir.

Copiaremos y pegaremos el siguiente código en el fichero index.html de nuestro sitio web:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ejemplo formulario subida fichero con límite de tamaño - ProyectoA</title>
	
    <style>
        .subir-fichero {
            display: none;
        }

        .boton {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }

        .boton:hover {
            background-color: #45a049;
        }
		
		div {
		  margin:20px;
		  margin-left: 20px;
		  margin-right: 20px;
		  padding: 20px;
		  border: 1px solid black;
		}
    </style>	
</head>
<body>
	<div>
		<form action="subir.php" method="post" enctype="multipart/form-data">
			<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
			<label for="fichero" class="boton">Elegir fichero</label>
			<input type="file" id="fichero" name="fichero" class="subir-fichero">
			<p id="fichero_elegido"> No ha elegido un fichero. Pulse en "Elegir fichero"</p>
			<button type="submit" name="subir_fichero" id="subir_fichero" disabled>Subir</button>
		</form>
	</div>
	
	<script>
        document.getElementById('fichero').addEventListener('change', function () 
		{
			// Mostrar el nombre del fichero elegido
            let nombreFichero = this.files[0] ? this.files[0].name : 'No ha elegido un fichero. Pulse en "Elegir fichero"';
            document.getElementById('fichero_elegido').textContent = 'Fichero elegido: ' + nombreFichero;
			// Habilitar botón subir si se ha elegido un fichero
			const botonSubir = document.getElementById('subir_fichero');
			botonSubir.disabled = this.files[0] ? false:true;
        });
    </script>	
</body>
</html>

En el ejemplo anterior, el procesamiento de la subida del fichero se realizará desde el fichero subir.php, indicado en action=subir.php. Mostramos el contenido de ejemplo del fichero subir.php a continuación.

El HTML y CSS anterior mostrará un formulario como el siguiente en el navegador web:

Contenido de ejemplo del fichero subir.php para realizar la subida de un fichero al servidor en PHP

Mostramos el código fuente completo del fichero subir.php, que realizará todas las comprobaciones:

  • Si el tamaño del fichero es inferior a 2MB.
  • Si el fichero es una imagen.
  • Si la extensión del fichero es jpg, jpeg, bmp o png.
  • Si no existe un fichero con el mismo nombre ya subido.

Si cumple todos los requisitos realizará la subida al servidor, a la carpeta «imagenes» (que debe existir).

Copiaremos y pegaremos el siguiente código PHP en el fichero subir.php que debe estar en la misma carpeta que el fichero index.html anterior:

<?php

$carpetaSubir = "imagenes/";

function mostrarMensaje($mensaje)
{
	echo "<script type='text/javascript'>
			alert('$mensaje')
			window.location = 'https://localhost/subir/'
	      </script>";
}
  
// Si se ha pulsado el botón "Subir"
if (isset($_POST["subir_fichero"]))
{
	// Comprobamos que se haya elegido un fichero
	if (!isset($_FILES["fichero"]["name"]))
	{
		mostrarMensaje ("No ha elegido un fichero a subir.");
	} else
	{
		$ficheroSubir = $carpetaSubir . basename($_FILES["fichero"]["name"]);		
		// Si el tamaño del fichero elegido es mayor del permitido en MAX_FILE_SIZE, la siguiente variable estará vacía
		if (!isset($_FILES["fichero"]["tmp_name"]) || $_FILES["fichero"]["tmp_name"] == null)
		{
			mostrarMensaje ("El fichero elegido no cumple los requisitos de tamaño. Elija otro.");
		}
		else
		{
			$ficheroTmp = $_FILES["fichero"]["tmp_name"];
			$extensionFichero = strtolower(pathinfo($ficheroSubir, PATHINFO_EXTENSION));
			// Comprobamos si ya existe el fichero en la carpeta de subida del servidor
			if (file_exists($ficheroSubir))
			{
				mostrarMensaje ("Ya existe un fichero con el mismo nombre subido. Elija otro o cámbiele el nombre.");
			} else
			{
				// Comprobamos que el fichero elegido sea una imagen
				//$correcta = getimagesize($_FILES["fichero"]["tmp_name"]);
				$infoFichero = getimagesize($ficheroTmp);
				if (!$infoFichero)
				{
					mostrarMensaje ("El fichero elegido no es una imagen. No se subirá.");
				} else 
				{
					// Para depurar
					//mostrarMensaje ("El fichero es una imagen de tipo " . $infoFichero["mime"] . ".");

					// Comprobamos el tamaño del fichero a subir
					// No debe exceder los 2MB
					if ($_FILES["fichero"]["size"] > 2097152)	
					{
					  mostrarMensaje ("El fichero elegido excede los 2MB. Elija un fichero más pequeño.");
					} else
					{
						// Permitimos ficheros jpg, jpeg, png y bmp
						if($extensionFichero != "jpg" && $extensionFichero != "png" 
							&& $extensionFichero != "jpeg" && $extensionFichero != "bmp")
						{
						  mostrarMensaje ("Sólo se admiten ficheros de tipo jpg, jpeg, png o bmp.");
						}
						else
						{
							// Puesto que el fichero cumple los requisitos, lo subimos al servidor
							if (move_uploaded_file($_FILES["fichero"]["tmp_name"], $ficheroSubir))
							{
								mostrarMensaje ("El fichero " . htmlspecialchars(basename($_FILES["fichero"]["name"])) . 
									" ha sido subido correctamente a la web.");
							} else
							{
								mostrarMensaje ("Ha habido algún error y el fichero NO se ha subido.");
							}
						}
					}
				}
			}
		}
	}
} else
{
	//Puesto que no se ha pulsado el botón "Subir", redireccionamos a index.html
	header("Location: index.html");
}
?>

Ejemplo de subida de fichero en HTML, CSS, JavaScript y PHP en funcionamiento

Si abrimos el navegador web y accedemos a la URL de nuestro servidor web, nos mostrará el formulario de subida de fichero. Pulsaremos en «Elegir fichero»:

Mostrará una ventana de selección de fichero local a subir. Elegiremos un fichero de imagen y de tamaño inferior a 2MB:

Una vez elegido el fichero pulsaremos en «Subir»:

Si cumple los requisitos se subirá el fichero al servidor web y mostrará el mensaje indicando que el fichero se ha subido correctamente:

El fichero se habrá subido a la carpeta «imagenes» del servidor web Apache o Nginx:

Descarga de los ficheros HTML y PHP del ejemplo de formulario subida de fichero con límite de tamaño

A continuación, mostramos el enlace para la descarga gratuita del código fuente HTML, JavaScript y PHP del ejemplo de formulario de subida de fichero con límite de tamaño y tipo de fichero: