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: ".$archivo."";
		} 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.

Comentarios Total 383 comentarios

wolfyllow
Publicado: 10/12/2011 11:09 am

Gracias por el tutorial!! :) Me ha venido genial!

@Jorge: Tienes que cambiar el valor de upload_max_filesize en el fichero php.ini. En según qué plataformas está establecido a 2MB por defecto ;)

Un saludo y gracias de nuevo!

CesarMS
Publicado: 14/12/2011 9:24 pm

Gracias, muy buen tutorial.

carlos
Publicado: 15/12/2011 11:29 am

gracias por el codigo esta muy bueno

Ignacio
Publicado: 29/12/2011 4:19 pm

Hola.

Estupendo ejemplo, pero tengo la siguiente pregunta:

Partiendo del codigo original, que habría que añadir para que ademas de subir el fichero, el nombre del fichero quedara registrado en una campo de una base de datos.

Muchas gracias.

pirlo
Publicado: 02/01/2012 12:24 pm

exelente muy buena aportacion gracias

keyphercom
Publicado: 04/01/2012 5:08 pm

Pero como Puedo subir archivos rar, zip, ??????? muchas gracias por el articulo

James
Publicado: 30/01/2012 7:24 pm

Hola, esta genial este post..
tengo una pregunta, como puedo subir una imagen, visualizarla y ponerle un sello a la imagen cargado? no importa si es con o sin base de datos, alguien sabe como hacerlo…?? se lo agradeceria mucho…

Exitos Paisa Jim Peñaloza Calixto

Anónimo
Publicado: 11/03/2012 6:04 am

Muchas gracias, ¡MUY BIEN explicado!

Gabo86
Publicado: 13/03/2012 10:26 pm

He hecho de todo, dar permisos a la carpeta «files» (estoy trabajando de manera local), he tratado de subir cualquier tipo de archivo y tamaño, pero nada =( .. el único error que me arroja es «Error al Subir Archivo» .. =( hay algo que estoy pasando por alto? =(

NehuenSD
Publicado: 18/03/2012 2:00 pm

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
Publicado: 18/03/2012 2:02 pm

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
Publicado: 29/03/2012 12:26 pm

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

rominalopez
Publicado: 03/04/2012 4:50 pm

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

creaweb
Publicado: 10/04/2012 9:44 am

Excelente el artículo tutorial, muy bien explicado y muy util. Lo probaré.

maria
Publicado: 30/05/2012 3:45 pm

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
Publicado: 04/06/2012 8:10 pm

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

Muchas gracias por tu aporte.

andres upegui
Publicado: 11/06/2012 2:17 am

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
Publicado: 30/06/2012 1:45 pm

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 :)

carlos
Publicado: 25/07/2012 10:02 am

muchas gracias amigo excelente tutorial.

cleoms
Publicado: 10/09/2012 2:26 pm

excelente aportacion, gracias a todos

xoceunder
Publicado: 10/09/2012 8:59 pm

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

charlysmit
Publicado: 02/10/2012 3:34 pm

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
Publicado: 25/10/2012 1:53 am

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 :(

jose
Publicado: 06/11/2012 4:44 am

Mil Gracias

Rafael
Publicado: 16/07/2013 10:57 am

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
Publicado: 31/07/2013 10:29 am

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

Zozyal
Publicado: 08/08/2013 11:38 pm

buen post gracias.

Upload de Archivos con PHP | Soloblog
Publicado: 12/02/2014 9:28 am

[…] Upload de Archivos con PHP […]

Mario
Publicado: 13/03/2014 6:43 pm

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

chris
Publicado: 12/06/2014 6:57 pm

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

Ricardo Buendia
Publicado: 30/07/2014 9:31 pm

Excelente codigo amigo me sirvio mucho.
Funciona de maravilla.
Muchas gracias.

ALMC INTERNET
Publicado: 13/08/2014 6:04 am

Hola buenas se que esta escrito el código en el post pero el enlace a box.com esta caido.
Saludos

Raul Ortiz
Publicado: 09/07/2015 12:24 pm

Cordial saludo, Hice tu ejemplo me funciono muy bien. Pero quise complementarlo mas y no me funciona bien, quisiera que me colaboren; Muchas gracias.

No he podido hacer que el archivo que se escoje lo suba al servidor, Que estoy haciendo mal. Todo el fuente esta en el archivo act_articulos.php, la parte de la adicion del articulo funciona perfectamente …. Muchas gracias !!!

act_articulos.php

0) {

$mensaje=»CODIGO ARTICULO YA REGISTRADO …..»;

} else {

$insertSQL = sprintf(«INSERT INTO tblarticulos (codigo_articulo, descripcion_articulo, codigo_marca, codigo_grupo, tipo_articulo, estado_articulo, valor_costo, valor_venta1, valor_venta2, cantidad_actual, imagen_articulo, caracteristica_articulo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)»,
GetSQLValueString($_GET[‘codigo_articulo’], «text»),
GetSQLValueString($_GET[‘descripcion_articulo’], «text»),
GetSQLValueString($_GET[‘codigo_marca’], «text»),
GetSQLValueString($_GET[‘codigo_grupo’], «text»),
GetSQLValueString($_GET[‘tipo_articulo’], «text»),
GetSQLValueString($_GET[‘estado_articulo’], «text»),
GetSQLValueString($_GET[‘valor_costo’], «text»),
GetSQLValueString($_GET[‘valor_venta1’], «text»),
GetSQLValueString($_GET[‘valor_venta2’], «text»),
GetSQLValueString($_GET[‘cantidad_actual’], «text»),
GetSQLValueString($_GET[‘imagen_articulo’], «text»),
GetSQLValueString($_GET[‘caracteristica_articulo’], «text»));

mysql_select_db($databasename, $cnxmovrep);
$Result1 = mysql_query($insertSQL, $cnxmovrep) or die(mysql_error());

//para subir un archivo
$carpetaimagenes = ‘../imagenes/’;
$correcto = true;
$imagen_articulo = $_FILES[‘imagen_articulo’][‘name’];

if (isset($imagen_articulo)) {

if ($imagen_articulo != «») {

$tipo = $_FILES[‘imagen_articulo’][‘type’];
$tamano = $_FILES[‘imagen_articulo’][‘size’];
$temp = $_FILES[‘imagen_articulo’][‘tmp_name’];

//Se comprueba si el archivo a cargar es correcto
if (!((strpos($tipo, «gif») || strpos($tipo, «jpeg») || strpos($tipo, «jpg») || strpos($tipo, «png»)) && ($tamano < 2000000))) {

$mensaje=" Error. La extensi�n o el tama�o de los archivos no es correcta.
– Se permiten archivos .gif, .jpg, .png. y de 200 kb como m�ximo.
…..»;

$correcto = false;

} else {

//Se comprueba si se guarda correctamente
if (move_uploaded_file($temp, $carpetaimagenes.’/’.$imagen_articulo)) {
chmod($carpetaimagenes.’/’.$imagen_articulo, 0777);
} else {
$mensaje=» Ocurri� alg�n error al subir el fichero. No pudo guardarse.…..»;
$correcto = false;
}

}
}
}
//

}

}

} else {

$mensaje=»DIGITE UN NUEVO CODIGO DE ARTICULO !! «;

}
?>

Moviles y repuestos | Crear articulos …..

Inicio
Moviles Nuevos
Moviles Usados
Accesorios
Contactenos

MARCAS

ARTICULOS

LISTA DE ARTICULOS

INTERESADOS

CREAR ARTICULO NUEVO

Codigo ………………

Descripcion ………..

Marca ………………..

<option value="»>

Tipo de articulo
…..

Movil / celular
Accesorio
Repuesto

Estado del articulo .

Nuevo
Usado

Valor costo …………

Valor venta (1) ……

Valor venta (2) ……

Cantidad …………….

Imagen del articulo …..

Descripcion detallada …..

<!– © Copyright websitename . All Rights Reserved –>
<!– Home | Contact | RSS –>
<!– (Blue) Website Templates –>

Diseñada por http://www.adsistemas.net.co

 

Comentar

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;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)