En este tutorial vamos a aprender a hacer un upload o subida de archivos usando PHP, nuestro upload tendra la capacidad de filtrar los tipos de archivo y no permitir subidas de mas del tamaño que le definamos, en el ejemplo haremos un script PHP para subir imagenes y luego mostrarlas al usuario.
Estructura
Manejaremos una estructura como la de la imagen, es necesario crear una carpeta donde almacenaremos los archivos, le pondremos un nombre determinado(/subidas) que luego definiremos en el script (index.php):
HTML
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="archivo">Sube un archivo:</label>
<input type="file" name="archivo" id="archivo" />
<input type="submit" name="boton" value="Subir" />
</form>
<div class="resultado"> <!-- Aqui ira el codigo PHP --> </div>
</body>
</html>
Es de vital importancia definir el atributo enctype=»multipart/form-data» en la etiqueta form; de no ser así el upload no funcionara, en div.resultado saldrán los mensajes de error o de éxito.
PHP
El código PHP lo incluiremos justo debajo del formulario dentro del div.resultado, empezamos identificando el momento en que el formulario es enviado y el resto guiadse por los comentarios:
<?php
// Registramos cuando el formulario haya sido enviado
if(isset($_POST['boton'])){
// Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
if ((($_FILES["archivo"]["type"] == "image/gif") || ($_FILES["archivo"]["type"] == "image/jpeg") || ($_FILES["archivo"]["type"] == "image/pjpeg")) && ($_FILES["archivo"]["size"] < 20000)) {
//Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
if ($_FILES["archivo"]["error"] > 0) {
echo $_FILES["archivo"]["error"] . "";
} else {
// Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
if (file_exists("archivos/" . $_FILES["archivo"]["name"])) {
echo $_FILES["archivo"]["name"] . " ya existe. ";
} else {
// Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
move_uploaded_file($_FILES["archivo"]["tmp_name"], "archivos/" . $_FILES["archivo"]["name"]);
echo "Archivo Subido ";
echo "<img src='archivos/".$_FILES["archivo"]["name"]."'>";
}
}
} else {
// Si el usuario intenta subir algo que no es una imagen o una imagen que pesa mas de 20 KB mostramos este mensaje
echo "Archivo no permitido";
}
}
?>
Código Final
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="archivo">Sube un archivo:</label>
<input type="file" name="archivo" id="archivo" />
<input type="submit" name="boton" value="Subir" />
</form>
<div class="resultado">
<?php
// Registramos cuando el formulario haya sido enviado
if(isset($_POST['boton'])){
// Hacemos una condicion en la que solo permitiremos que se suban imagenes y que sean menores a 20 KB
if ((($_FILES["archivo"]["type"] == "image/gif") || ($_FILES["archivo"]["type"] == "image/jpeg") || ($_FILES["archivo"]["type"] == "image/pjpeg")) && ($_FILES["archivo"]["size"] < 20000)) {
//Si es que hubo un error en la subida, mostrarlo, de la variable $_FILES podemos extraer el valor de [error], que almacena un valor booleano (1 o 0).
if ($_FILES["archivo"]["error"] > 0) {
echo $_FILES["archivo"]["error"] . "";
} else {
// Si no hubo ningun error, hacemos otra condicion para asegurarnos que el archivo no sea repetido
if (file_exists("archivos/" . $_FILES["archivo"]["name"])) {
echo $_FILES["archivo"]["name"] . " ya existe. ";
} else {
// Si no es un archivo repetido y no hubo ningun error, procedemos a subir a la carpeta /archivos, seguido de eso mostramos la imagen subida
move_uploaded_file($_FILES["archivo"]["tmp_name"], "archivos/" . $_FILES["archivo"]["name"]);
echo "Archivo Subido ";
echo "<img src='archivos/".$_FILES["archivo"]["name"]."'>";
}
}
} else {
// Si el usuario intenta subir algo que no es una imagen o una imagen que pesa mas de 20 KB mostramos este mensaje
echo "Archivo no permitido";
}
}
?>
</div>
</body>
</html>
Y con eso damos por finalizado este tutorial de como hacer un upload de archivos en PHP, puedes bajarte el código fuente en esta dirección.
David dice
Gracias por el aporte, habia intentado hacerlo antes pero no habia conseguido resultados positivos
Rayo dice
hola, a mi sale un error en la linea 29 Parse error: syntax error, unexpected T_STRING, expecting ‘,’ or ‘;’ in C:\wamp\www\8semestre\froylan\ejemplosyoutuve\index.php on line 29
en este fragmento de codigo me sale error » echo «»;»
espero que me echen la mano.
Dimas dice
Como subo un archivo sea .doc o .xls
Josue Ochoa dice
Tendrías que cambiar donde dice image/jpeg y poner text/xls y text/doc
if ((($_FILES[«archivo»][«type»] == «text/xls») ||
($_FILES[«archivo»][«type»] == «text/doc»)
gustavo dice
hola amigo! muy buen post. Tengo una duda, como le hago para que enves de imagenes se puedan subir videos? y aparte aumentar el size para los videos?
sotelo dice
tengo errores el codigo es identico al q se muestra y me sale un herror, abria forma de q me pudiecen ayudar?? gracias
Josue Ochoa dice
Que error te sale?
OcTa dice
Oye, me funciona todo , pero cuando subo el archivo , nose donde lo manda
Josue Ochoa dice
a /archivos tal vez?
sotelo dice
mejor dicho como puedo ocultar esta carpeta a modo de que solo la pueda manipular el administrador ???????
sotelo dice
sta conectado hayyyyyyy q emocion ahorita se lo paso
sotelo dice
el erro es en la linea 29- la carpeta que yo he creado se llama doc/ y el nombre de archivos/, que es el nombre de la carpeta lo remplazo por doc/ es es el de mi carpeta.
pero me marca error
Parse error: parse error, expecting `’,» or `’;» in C:\wamp\www\portal\doc\archivo.php on line 35
sotelo dice
ya encontrado el error, es minimo, son las comillas en archivo.
29 echo «»; («ERROR»)
29 echo «»; («CORRECTO»)
pero esta excelente me parece muy bueno demaciado bueno
soy T.S.U. en Informatica y me late le diseño web
¡¡¡¡¡ Gracias !!!!! Josue Ochoa
Robert dice
Gracias por el aporte muy buen tutorial pero no me funciona con google chrome
Claudia dice
me sale error en la linea 29 me pueden decir como corregirlo
Gracias
skybotter dice
permiteme que te corriga y asi ayudar a los que descarguen este script, veo que hay un fallo dentro del codigo PHP
esta linea:
echo «»;
se debe reemplazar por:
echo «»;
gracias por la ayuda, saludos!
Pau dice
Hola me pueden ayudar xfa?? mi problema es el siguiente yo tngo un formulario algo grande es de registro!! y me pidieron q le agregue un apo para subir archivos!! yo tngo el codigo y lo probe por aparte y si funciona, pero el problema esq no se donde meter ese codigo dentro de mi formulario porque lo pongo y no me funciona!!! gracias de antemano!!
Josue Ochoa dice
lo haz probado aparte y te funciona? que codigo? no te entendi muy bien.
lobo dice
hola probe su codigo pero no funciono vere porque soy algonuevo en esto pero me interesa aprender
solo por preguntar afectarian los puertos por ejemplo
Dio-CAMM dice
Muy buen aporte, felicidades que mi Dios te colme de bendiciones, vida y salud…sigue adelante…..
explicas de forma clara…Feliz Noche. ok
oscar dice
muy bueno, yo solo le agregaría la función de guardar la ruta a una base de datos :p así se prende el foco para usarlo en otras aplicaciones mas complejas
Elvira Fernández dice
Por favor me puedes ayudar? Me piden crear un label para subir mi CV a una página laboral. Qué tengo que hacer? No tengo idea
Josue dice
Que es un «label»?
jhon lievano dice
buen dia, quisiera saber si tiene el codigo en php, para subir varias fotos, las cuales estan en una carpeta principal, la cual trae subcarpetas donde cada cual tiene un numero diferente de fotos, desearia poder obtener le codigo para que mediante php, me revise cuantas subcarpetas trae la carpeta prinicpal, y de cada subcarpeta cree una carpeta nueva en mi servidor y a esta les suba las fotos de cada subcarpeta respectivamente. Gracias.
liliana dice
hola q tal quisiera como haria para que los clientes suban archivos pesados a mi web ya que la web que tengo es de una imprenta quisiera por favor que me explicaras de antemano muchas gracias.
Josue Ochoa dice
Con el mismo código, solo tendrias que cambiar la parte que limita el tamaño ($_FILES[«archivo»][«size»] < 20000)
Bocaillo dice
Se que esta bloqueado por seguridad, pero hay alguna forma de subir mas de un archivo, o seleccionar varios????
Gracias
Josue Ochoa dice
Poner mas de un input type file o usar un uploader flash.
Albert dice
Hola Josue,
Quiero que se guarde la imagen en http://mainpage.es/images/ no logro conseguirlo. Me pone Archivo subido pero no se sube corretamente.
Código:
move_uploaded_file($_FILES[«archivo»][«tmp_name»],
«/images/» . $_FILES[«archivo»][«name»]);
echo «Archivo Subido «;
He pensado que tal vez no tiene permisos para ubicar a la carpeta temporal. Se puede subir al diretorio sin pasar por carpeta temporal?
Gracias
Josue Ochoa dice
Efectivamente, darle permisos 7777 es esencial para que funcione.
Jorge dice
Hola, excelente tutorial, disculpa como puedo hacer para que aparte de subir la foto, que me envie un correo de que se ha subido un archivo?
Gracias
Josue dice
mail()
uriel dice
exelente post amigo
iraitz dice
muy buen post!
lo unico q creo q el echo es asi
echo »;
por cierto no me sube las imagenes me pone siempre no permitido :S
Jes dice
aumentale el size, asi podras subir archivos de medio mega.
Linea 14
($_FILES[«archivo»][«size»] < 555000)) {
si te sale no permitido posiblemente es por el tipo de archivo , yo en mi caso agrege
($_FILES["archivo"]["type"] == "image/png") ||
etre la linea 11 y 12 para poder subir png. saludos
if ((($_FILES["archivo"]["type"] == "image/gif") ||
($_FILES["archivo"]["type"] == "image/jpeg") ||
($_FILES["archivo"]["type"] == "image/png") ||
($_FILES["archivo"]["type"] == "image/pjpeg")) &&
($_FILES["archivo"]["size"] < 555000)) {
Jes dice
Muy bueno , yo estaba creanndo uno pero tenia problemas con php, aun no soy aprendiz saludos y gracias lo modificare y agregare unas cuantas cosillas mas 😀 Funciona la perfección
tobias dice
Si quiero que suban pdf y comprimidos .zip y .rar como debo colocar el codigo?
Josue Ochoa dice
($_FILES[«file»][«type»] == «application/pdf»)
($_FILES[«file»][«type»] == «application/zip»)
($_FILES[«file»][«type»] == «application/rar»)
Jose dice
Hola, en mi caso se pueden subir archivos de hasta 10Mb y es evidente que tarda un rato en subir el archivo. ¿cómo puedo poner una alerta, una barra de progreso o un loading mientras se está subiendo el archivo?
Gracias
Dryken dice
Funciona perfectamente para subir amigo 😉
Por cierto Josue, me preguntaba como podría listar los directorios de dicho ftp para que tenga la misma apariencia que la foto que has colocado debajo de Estructura.
Josue dice
Encontre esto:
//path to directory to scan
$directory = "../images/team/harry/";
//get all image files with a .jpg extension.
$images = glob($directory . "*.jpg");
//print each file name
foreach($images as $image)
{
echo $image;
}
Jorge dice
estoy tratando de instalar un servidor web en fedora 17 y el problema es que no puedo subir archivos porque no ejecuta archivos php correctamente a pesar de estar instaladola ultima version de php… Que puede ser?
Josue Ochoa dice
Pues si no los ejecuta es porque no esta instalado, no puedo ayudarte mucho en eso no soy muy experimentado en temas de servidores.
Luca dice
echo «»;
Donde esta el error ahi ? me dice que tengo un error en esa linea
Luca dice
No sale la linea.. tengo un error en la linea 29 del codigo final.. si me podrias decir te lo agradeceria 😀
Josue dice
Que error te sale?
echo "";
Juan dice
No me funciona, bueno algo funciona, solo me sube archivos gif … le pongo un jpg o png y nada, eso que lo he modificado
if ((($_FILES[«archivo»][«type»] == «image/gif») ||
($_FILES[«archivo»][«type»] == «image/GIF») ||
($_FILES[«archivo»][«type»] == «image/jpeg») ||
($_FILES[«archivo»][«type»] == «image/JPEG») ||
($_FILES[«archivo»][«type»] == «image/jpg») ||
($_FILES[«archivo»][«type»] == «image/JPG») ||
($_FILES[«archivo»][«type»] == «image/png») ||
($_FILES[«archivo»][«type»] == «image/PNG»)) &&
($_FILES[«archivo»][«size»] < 50000)) {
……..
}
a que puede ser 🙁
Juan dice
Lo solucione tuve que cambiar códigos 🙁
$archivo = $_FILES[«archivo»][«name»];
if ((ereg(«.jpg», $archivo) ||
ereg(«.JPG», $archivo) ||
ereg(«.png», $archivo) ||
ereg(«.PNG», $archivo) ||
ereg(«.gif», $archivo) ||
ereg(«.GIF», $archivo)) &&
($_FILES[«archivo»][«size»] < 50000)) {
…..
}
no entiendo el porque no me funcionaba lo anterior ?
Ruben L dice
Buen trabajo, lo unico es que no consiguo guardar en nombre de la imagen en una bd, para luego poder mostrarla en donde yo quiera.
Chris dice
Disculpa, no me muestra la imagen que subi. Me podrias ayudar?
albert dice
Hola todo funciona bien, pero le añadí esta linea para leer html ($_FILES[«archivo»][«type»] == «text/html») y me gustaría que fuese directamente el texto, a página texto.php ,¿Como lo puedo hacer?
Juan Carlos dice
Hola amigo tengo una pregunta que creo que nadie te la ha hecho, incluso he buscado en varios foros y no he encontrado si quiera que a alguien le suceda el mismo problema,,
lo que pasa es que la cargad e archivos imagenes y archivos de office sale todo muy bien, pero cuando intento subir videos simplemente no me deja subirlo, ya le he modificado el tamaño permitido del archivo pero tampoco me deja, me aparece como que simplemente no lo carga,,
este es un ejemplo del codigo :
Sube un archivo:
<?php
echo '*********NOMBRE DEL ARCHIVO: ‘.$_FILES [‘archivo’][ ‘name’];
echo ‘TIPO DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘type’];
echo ‘TAMAÑO DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘size’];
echo ‘NOMBRE TEMPORAL DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘tmp_name’];
echo ‘ERROR AL CARGAR ARCHIVO: ‘.$_FILES[‘archivo’][‘error’].»;
echo ‘*********’;
?>
es un codigo simple pero ni en el me permite subir videos, si me permite subir un video en formato flv de 919KB pero no cuando intento subir un video de 2.18MB es cuando no funciona ni copia el archivo a la ruta que le establezco , crees que se deba al tamaño maximo permitido o sera algo más?, tal vez el problema sea el formato del video que se sube o que podra ser?
te agradecere mucho tus comentarios
Juan Carlos dice
Sube un archivo:
<?php
echo '*********NOMBRE DEL ARCHIVO: ‘.$_FILES [‘archivo’][ ‘name’];
echo ‘TIPO DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘type’];
echo ‘TAMAÑO DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘size’];
echo ‘NOMBRE TEMPORAL DEL ARCHIVO: ‘.$_FILES[‘archivo’][‘tmp_name’];
echo ‘ERROR AL CARGAR ARCHIVO: ‘.$_FILES[‘archivo’][‘error’].»;
echo ‘*********’;
?>
es complemento del codigo anterior que me falto por adjuntar,, gracias
Skail dice
Hola gracias por el TUtorial esta genial y facilisimo me podrías decir como puedo renombrar el archivo por un nombre que tengo almacenado en una variable en php gracias!
EZequias dice
todo me sale bien hasta subir el archivo no se que otras carpetas devo crear y como ordenarlas gracias por ayudarme.
ERCM dice
Gracias por compartir tu conocimiento, ahora tengo una inquietud; como programar con php el subir archivo, pero no necesariamente en la carpeta ya definida en este caso «archivos», si no agregarlos en una que nosotros la podamos asignar en tiempo de ejecucíón. Algo así, se captura un registro y el id arroja el siguiente valor 889098, que este sea el nombre de la carpeta donde se almacenara los archivos.
EOO dice
Y si mi so lo que yo quisiera es subir una carpeta que a la vez contenga muchas imagenes y así subir/cargar todas ellas a la vez? habrá algun manual o liga para que me ayudaras con ello?
Fernando dice
Muy pero muy bueno, mi pregunta, como seria para subir archivos .exe ?
Josue Ochoa dice
Para el tipo de archivo .exe es asi:
$_FILES[«file»][«type»] == «file/exe»
Carlos Soto dice
hice un script en php y similar y no puedo adjuntar el archivo al servidor, no aparece ningun aviso o error aparente, e investigado y ni en la w3schools encuentro info de que pueda ser
josueochoa dice
Revisa los logs de PHP.
Joaquin Cortes dice
hola como hago para que suba todo tipo de archivo y de tamaño ilimitado
josueochoa dice
Borra las condicionales.
Joaquin Cortes dice
disculpa amigo es que soy ultra novato podrias subirme el index editado sin las condiciones para poder subir cualquier cosa
Alejandro Tapia dice
yo necesito mandar el archivo a una carpeta local y alamcenar la direccion en una bd como lo hago gracias
josueochoa dice
Tendrias que incluir un mysql_query dentro del codigo que maneja el envio del form, tal vez te sirva https://tursos.com/como-hacer-un-formulario-de-contacto-iv-almacenar-en-base-de-datos-mysql-con-php/
Rodrigo Zarate dice
Hola necesito saber como levantar varios documentos a la vez seleccionar fotos y documentos word pdf etc. Espero una respuesta
josueochoa dice
Creo que este formulario no soporte uploads multiples.
Andres dice
Buenas noches Josue Ochoa.
Me gustaría aprender como subir un archivo con un usuario determinado.
me explico mejor:
yo tengo creado un inicio de sesión.
en mi base de datos tengo nombre de usuario y contraseña; el no tiene que registrarse en nada, yo los agrego personalmente en mi base de datos.
con esos dos datos el usuario puede iniciar sesión, pone su nombre de usuario y su contraseña y le da ingresar.
cuando el ingresa aparece la opción para poder subir el archivo. escoge el archivo que desea subir y lo sube.
hay voy bien. guarda el archivo en la carpeta archivos.
pero yo lo que quiero hacer es que dentro de la carpeta archivos, me cree otra carpeta con el nombre del usuario que esta subiendo el archivo.
Ejemplo:
El usuario cristianCamilo inicio sesión. subió un archivo.
al subir el archivo en la Carpeta archivos se creo automáticamente una carpeta con con el nombre de usuario cristianCamilo y dentro de esa carpeta se guardo el archivo que el usuario subió.
no tengo idea de como hacerlo.
me gustaría que me dieras una explicación.
se lo agradecería mucho.
Oscar dice
Creo que podrias identificar cada imagen con un codigo, y que el usuario tenga un campo con la lista de imagenes por codigo ..
zoro_gunner dice
Oscar, tengo la misma duda del amigo de arriba, y se me ocurre la misma solucion que tu diste, el problema es… como hago para que me guarde a la vez el archivo en su correspondiente y su identificador en la tabla del usuario? :/
ideas4dollars dice
quien me ayuda a realizar un formulario de html y php de subida de archivos
Jesús Uzcátegui dice
Hola, soy Jesús Uzcátegui…estoy aprendiendo hay algo que no sé si sea estupido preguntar pero ¿La conexión a la base de datos como se haría, digamos?
Yo quiero que en mi uploader esté un input type=»textarea o text» que muestre el enlace donde se guarda la imagen o la url. Como se hace esn realdad no lo entiedno aun, ayuda porfa.
Andres Restrepo dice
hola he estado viendo el codigo pero no he podido solucionar el error de la linea 29