Subir archivos al servidor con PHP

Una de las funciones que mayor funcionalidad y dinamismo da a nuestras páginas web, es la posibilidad de subir archivos al servidor. Aunque es necesario condicionar los tipos de archivos que se permitirán subir.

Para utilizar esta función es necesario crear un formulario el cual va a recepcionar el fichero.filesupload

Cuando trabajamos con un servidor local, el fichero lo podemos colocar de forma temporal en el directorio que le hemos determinado en el fichero php.ini; como por ejemplo el directorio puede ser: c:/ficheros/upload/.

Pero cuando trabajamos con un servidor web, el tratamiento puede ser diferente, ya que podemos almacenar estos ficheros en el mismo servidor o podemos hacer que nos lleguen mediante un mensaje a nuestra dirección de e-mail.

Bueno, después de esta breve explicación, pongamos manos a la obra.

Lo primero que vamos a hacer, es un formulario html, que es el que recibirá el archivo que deseamos subir y/o enviar.

<html>
 <head>
      <title>Subir fichero al servidor</title>
 </head>
 <style type="text/css">
      body {font-family:"Verdana";}
 </style>
 <body>
   <h2>Formulario para el envio de archivos</h2>
   <form action="enviar_file.php" method="post" enctype="multipart/form-data">
     <input type="hidden" name="limite" value="500000" >
     <p><strong>Archivo a transferir</strong><br />
     <input type="file" name="archivo"></p>
     <p><input type="submit" name="submit" value="Aceptar"></p>
   </form>
 <small>
   Instrucciones: Pulse el botón 'Seleccionar archivo', seleccione el archivo deseado y presiones el botón 'Aceptar'
 </small>
 </body>
</html>

Guardaremos este archivo como: subirarchivo.html

Lo que se hizo en el código anterior es un formulario HTML simple, con la único detalle de que debemos agregar el enctype=»multipart/form-data», el cual es obligatorio para el envió de archivos; el action del formulario sera a una pagina php a la cual llamaremos:  enviar_file.php.

También crearemos una etiqueta oculta (tipo: «hidden») en el cual indicamos el limite de tamaño que podrán tener los archivos que se desean subir.

Esta página debe quedar mas o menos así:

fileEnviar_uno

Ustedes pueden hacer su propio diseño, utilizado estilos de css.

A continuación crearemos un archivo php, al cual llamaremos ‘enviar_file.php’; este archivo se encargará de validar la información y hacer el proceso de envío.

El código es el siguiente:

<?php
if(isset($_POST["submit"]))
{
 $nombre_archivo = $_FILES["archivo"]["name"];
 $tipo_archivo = $_FILES["archivo"]["type"];
 $tamano_archivo = $_FILES["archivo"]["size"];

 $limite = $_POST["limite"];
 if($tamano_archivo<=$_POST['limite'])
 {
 if(move_uploaded_file($_FILES["archivo"]["tmp_name"], $nombre_archivo))
 {
 echo "El archivo " . $nombre_archivo . " se ha transferido correctamente. <br />";
 echo "Su tamaño es de: " . $tamano_archivo . " bytes.";
 echo "El tipo de archivo es: " . $tipo_archivo;
 }
 else
 {
 echo "No se ha podido transferir el archivo, verifique el tamaño del archivo e intente nuevamente.";
 }
 }
 echo "<a href='.$nombre_archivo.'>";
}
?>

Expliquemos un poco lo que hicimos…

if(isset($_POST["submit"]))

En esta linea nos aseguramos que se haya presionado en botón de enviar, verificando la variable POST «submit».

En las siguientes líneas, utilizamos la variable superglobal $_FILES (compatible con php version 4.1.0) con la cual obtenemos el nombre, tipo y tamaño del archivo. Esta información la almacenamos en variables.

$nombre_archivo = $_FILES["archivo"]["name"];
 $tipo_archivo = $_FILES["archivo"]["type"];
 $tamano_archivo = $_FILES["archivo"]["size"];

También almacenamos en variable el limite del archivo, indicado en la pagina html con la etiqueta oculta (hidden).

$limite = $_POST["limite"];

Ahora verificamos que el tamaño del archivo no supere el limite establecido

if($tamano_archivo<=$_POST['limite'])

En caso de que el tamaño del archivo sea menor al limite, procedemos a enviar el archivo, utilizando la función ‘move_uploaded_file’ la cual verifica que el archivo a subir sea válido. Esta función necesita de dos parametros: el primero el nombre del archivo y segundo la ruta donde se desea almacenar el archivo.

 if(move_uploaded_file($_FILES["archivo"]["tmp_name"], $nombre_archivo))

En este ejemplo indicamos el nombre del archivo valiendonos del nombre temporal del archivo y en el caso de la ruta solo se indico el nombre, con lo cual el archivo se almacenará en el mismo lugar en donde tenemos nuestra pagina php.

Esta función ‘move_uploaded_file’  la incluimos dentro de la condicional ‘if‘ para que en caso de ser exitosa (retorna ‘true’) entonces mostraremos los datos del archivo:

echo "El archivo " . $nombre_archivo . " se ha transferido correctamente. <br />";
 echo "Su tamaño es de: " . $tamano_archivo . " bytes.";
 echo "El tipo de archivo es: " . $tipo_archivo;echo "No se ha podido transferir el archivo, verifique el tamaño del archivo e intente nuevamente.";

Por ultimo creamos un link hacia el archivo subido.

echo "<a href='.$nombre_archivo.'>";

Cabe mencionar que, este es un ejemplo sencillo, es posible mejorarlo agregándole por ejemplo: una condicional para que solo permitir subir un tipo de archivo específico o para evitar subir archivos ejecutables (.exe .bat) que puedan dañar nuestro sitio.

Si te gustas la programación en php, te invitamos a que veas este curso AQUI.

Tanto si no tienes conocimientos de programación, como si ya tienes algunos este curso es para TI, CURSO DE PHP

11 comentarios


  1. Amigo buen día.
    Con una molestía tu código esta al 100%.

    Como haría para que los archivos que suba los guarde en una carpeta en especifico, se me ocurre que lo guarde en la carpeta IMAGEN

    Agradecería tu respuesta.

    Y Saludos!

    Responder

    1. Hola Danny
      Lo único que tienes que hacer es lo siguiente; cambiar la variable $nombre_archivo, por la ruta donde deseas que se guarden las imágenes.
      Pruébalo y me dices, Saludos!

      Responder

  2. si el archivo que se importa es un excel, como lo puedo guardar en mi base de datos mysql cuando lo importo ?

    Responder

    1. Hola Danny!!
      Si entiendo bien lo que deseas no es solo subir el archivo, si no ademas de ello, exportar toda la información a tu base de datos Excel.
      Para poder ayudarte mejor, podrías darme un poco mas de información, como por ejemplo: una muestra de los datos que tienes en el archivo de Excel, así como la estructura actual de tu base de datos.

      Responder

  3. lo mas simple
    id material costo
    para que complicarse si entre mas simple mejor
    gracias por responder y saludos

    Responder

  4. Aprendiendo por mi cuenta PHP me compro El libro de Jacovo Pavon puertas 3 Edicion Creacion de un Portal Web con PHP y MySql, tiene este ejercicio, con tantos errores, y sin funcionar, arrepentido de haber comprado ese libro, y aqui veo que lo han modificado y reparado. Gracias le dare solucion ahora mismo.

    Responder

    1. Sinceramente no tengo el gusto de conocer ese libro, pero es bueno saber que te ha servido nuestra información. Saludos

      Responder

  5. esta muy bueno el ejemplo me sirvió de ayuda sigue así….

    Responder

  6. muy buen tutorial! solo una duda estoy realizando una aplicacion web y necesito que mi formulario me permita solo subir archivos de word .doc .docx y archivos .pdf en una carpeta especifica de cada usuario como la hago?

    Responder

    1. Hola Gael!

      De acuerdo a el ejemplo, usaremos la Matriz donde viene el archivo $_FILES[‘archivo’], esta tiene una propiedad llamada «type» con la que puedes validar el tipo de archivo que se esta intentando subir. Puedes validarlo asi:

      if($_FILES["archivo"]["tmp_name"]=="application/docx" || $_FILES["archivo"]["tmp_name"]=="application/doc"){
      //Si es la extensión que deseas, aqu procesa la subida del archivo
      }

      Espero haberme explicado y que te haya servido, saludos

      Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

tres × cinco =