:::: MENU ::::

Upload de Archivos con PHP

Muchas veces necesitamos hacer uploads de archivos en nuestros proyectos para muchos es algo sencillo pero para los que recién empiezan les explicare como se realiza el proceso. Este upload lo haremos utilizando php.

Este artículo explica solo el proceso de subir archivos con PHP.
Para consideraciones de seguridad pueden leer Seguridad en Upload de Archivos.

upload-php.gif

El primer paso es crear un formulario en el cual se seleccione el archivo a subir, para ello utilizaremos el tag input del tipo file, además hay que tener en cuenta que hay que seleccionar el tipo de encoding para el formulario el cual es: multipart/form-data.

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input name="archivo" type="file" size="35" />
  <input name="enviar" type="submit" value="Upload File" />
  <input name="action" type="hidden" value="upload" />     
</form>

Luego en la página upload.php que es que se encarga de recibir los datos del formulario (Lo definimos en la propiedad action del formulario). El archivo seleccionado es subido temporalmente a una carpeta, entonces tenemos que copiar el archivo a la carpeta final, en caso contrario este archivo se eliminará automáticamente.

Para acceder a las propiedades del archivo php nos brinda el array $_FILES con las siguientes propiedades, en donde archivo es el nombre del campo con el cual se envió el archivo desde el formulario:

  • $_FILES['archivo']['size']: tamaño en bytes del archivo recibido
  • $_FILES['archivo']['type']: tipo mime del archivo, por ejemplo image/gif
  • $_FILES['archivo']['name']: nombre original del archivo
  • $_FILES['archivo']['tmp_name']: nombre del archivo temporal que se utiliza para almacenar en el servidor el archivo recibido

Algo que hago siempre es anteponer 6 caracteres aleatorios antes del nombre del archivo, esto para evitar duplicidad de nombres de los archivos.

$status = "";
if ($_POST["action"] == "upload") {
	// obtenemos los datos del archivo 
	$tamano = $_FILES["archivo"]['size'];
	$tipo = $_FILES["archivo"]['type'];
	$archivo = $_FILES["archivo"]['name'];
	$prefijo = substr(md5(uniqid(rand())),0,6);
	
	if ($archivo != "") {
		// guardamos el archivo a la carpeta files
		$destino =  "files/".$prefijo."_".$archivo;
		if (copy($_FILES['archivo']['tmp_name'],$destino)) {
			$status = "Archivo subido: <b>".$archivo."</b>";
		} else {
			$status = "Error al subir el archivo";
		}
	} else {
		$status = "Error al subir archivo";
	}
}

Todos los archivos se copiarán a la carpeta /files por que así lo definimos a la hora de copiar el archivo. Hay que tener en cuenta que la carpeta a donde se copiarán los archivos deben tener permisos de escritura en caso contrario se devolverá un error.

Ahora si tienes un hosting deberás cambiar los permisos, esto se hace comúnmente con un cliente de FTP que utilizas para subir tus archivos al hosting. Por ejemplo yo utilizo el FlashFXP como cliente de FTP y hay una opción llamada Atributes (CHMOD) para cambiar los permisos como se muestra en la siguiente imagen.

chmod-hosting.gif

En nuestro ejemplo no hemos utilizado las propiedades size y type, pero ustedes la pueden usar para restringir a un máximo de tamaño de archivo o restringir a cierto tipo de archivos por ejemplo solo permitir subir imágenes. Para finalizar, hemos agregado estilos a nuestra página creada y además hemos listado los archivos subidos a la carpeta files. Pueden descargar los archivos fuente para que practiquen y hagan sus pruebas.


380 Comentarios

  • NehuenSD |

    Bueno gente la verdad que el script esta muy bueno y andaba buscando algo asi, pero esta incompleto, no contiene un boton eliminar para poder hacer una gestion completa de archivos, por tal motivo aca les dejo el codigo optimizado del archivo upload.php que contiene la funcion eliminar para cada archivo subido, es codigo funciona a la perfeccion saludos!!

    <?php
    $status = "";
    if ($_POST["action"] == "upload") {
    $tamano = $_FILES["archivo"]['size'];
    $tipo = $_FILES["archivo"]['type'];
    $archivo = $_FILES["archivo"]['name'];
    if ($archivo != "") {
    $destino = "files/".$archivo;
    if (copy($_FILES['archivo']['tmp_name'],$destino)) {
    $status = "Archivo subido: “.$archivo.”“;
    } else {
    $status = “Error al subir el archivo”;
    }
    } else {
    $status = “Error al subir archivo”;
    }
    }
    if ($_POST["action"] == “eliminar”) {
    $nombre_archivo = $_POST["link"];
    $borrar = unlink($nombre_archivo);
    }
    ?>

    Sistema de carga de archivos

    Por favor seleccione el archivo a subir:

    Listado de Archivos Subidos

    <?php
    if ($gestor = opendir('files')) {
    echo "”;
    while (false !== ($arch = readdir($gestor))) {
    if ($arch != “.” && $arch != “..”) {
    echo ““.$arch.”

    \n “;
    }
    }
    closedir($gestor);
    echo “”;
    }
    ?>

  • NehuenSD |

    Si algo del escript no anda es por las comillas, remplacen todas las comillas por las dobles que estan sobre el boton 2, (esto es worpress no se los puedo pasar a la perfeccion) saludos nuevamente espero que lo encuentren util!!

  • Junior |

    Hola amigos, saludos a todos, como hago para q no me muestre la lista de archivos que he subido?

  • rominalopez |

    hola te copio tu codigo pero ami no me funciona :(

    alguien me puede ayuda me dice que no puede ejecutar la funcion de copy y lo tengo tal cual como tu lo tienes ademas ya cree la carpeta con el nombre de files

  • maria |

    como ahgo paar subir videos con una restricicon de tamaño use el codigo y no sube videos si otrso archivos por favor si tuvieras el codigo o si em podrian colaborar una vez subido el video como podria luego mostrarlo !!

  • Manuel |

    Hola y si quiero suvir archivos .rar ? ?.
    Enviame una respuesta a mi correa.

    Muchas gracias por tu aporte.

  • andres upegui |

    hola amigos el tutorial esta excelente muchas gracias una preguntica sabes cual es el metodo para realizar las descargas de los archivos que subo a mi directorio
    gracias

  • Xacobe |

    Bueno queria aportar que convendria en las ultimas lineas agregar:

    echo $status;
    echo “Tu enlace: http://la-url-de-tu-web/“.$desti no;

    Si no el usuario recibe una pantalla en blanco, y no va a saber la url de su archivo debido al prefijo. Saludos :)

  • xoceunder |

    Saludos muy buen script amigo estaria mejor si le agregaras una bara de proceso de cargas

  • charlysmit |

    hola es genial el aporte que realizaron ahora la ayuda que nesesito es como almacenar el nombre de la imagen que subi para despues mostrarla. la tabla que tengo sellama (galerias) los campos son idimage,image,seccion gracias saludos

  • ines |

    hola tengo una gran duda , como le puedo hacer para adjuntar un archivo excel y los datos que este contiene , sean insertados en una tabla de mi base de datos . ayuda por favor :(

  • Rafael |

    mm una pregunta si el nombre del archivo tiene espacios como soluciono eso por que capturo el link del así :

    http://www.site.com/carpeta/“.$prefijo.”_”.archivo.” pero si el nombre tiene espacios corta el link y no funciona

    agradecería tu consejo

  • Omar Villafuerte Echevarría |

    Hola amigos muy bueno que esta el codigo, me resulta muy bueno y nesesario para mi web , lo quiero utilizar para que los usuarios se establescan avatar en el mismo, por lo que nesesito se me pueden publicar como enlazarlo con mi base de datos y establecer q se guarde el enlace de la imagen subida para luego yo poderla mostrar en el sitio a la hora de ver el avatar del usuario . sin mas un saludos in me pueden hacer llegar el codigo ami email le estare agradecido eternamente . ante todo un saludos Omar

    email: elwhite@gmail.com

  • Mario |

    Muchas gracias el código funciona ala perfección,me sirvió bastante.

  • chris |

    Hola amigos el pos me gusta lo que quiero saber es como hago para que el ususario que entró a mi página web descargue el pdf o el archivo que subi

Publica tu comentario

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.