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.
Gracias por el aporte, habia intentado hacerlo antes pero no habia conseguido resultados positivos
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.
Como subo un archivo sea .doc o .xls
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»)
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?
tengo errores el codigo es identico al q se muestra y me sale un herror, abria forma de q me pudiecen ayudar?? gracias
Que error te sale?
Oye, me funciona todo , pero cuando subo el archivo , nose donde lo manda
a /archivos tal vez?
mejor dicho como puedo ocultar esta carpeta a modo de que solo la pueda manipular el administrador ???????
sta conectado hayyyyyyy q emocion ahorita se lo paso
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
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
Gracias por el aporte muy buen tutorial pero no me funciona con google chrome
me sale error en la linea 29 me pueden decir como corregirlo
Gracias
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!
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!!
lo haz probado aparte y te funciona? que codigo? no te entendi muy bien.
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
Muy buen aporte, felicidades que mi Dios te colme de bendiciones, vida y salud…sigue adelante…..
explicas de forma clara…Feliz Noche. ok
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
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
Que es un «label»?
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.
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.
Con el mismo código, solo tendrias que cambiar la parte que limita el tamaño ($_FILES[«archivo»][«size»] < 20000)
Se que esta bloqueado por seguridad, pero hay alguna forma de subir mas de un archivo, o seleccionar varios????
Gracias
Poner mas de un input type file o usar un uploader flash.
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
Efectivamente, darle permisos 7777 es esencial para que funcione.
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
mail()
exelente post amigo
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
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)) {
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
Si quiero que suban pdf y comprimidos .zip y .rar como debo colocar el codigo?
($_FILES[«file»][«type»] == «application/pdf»)
($_FILES[«file»][«type»] == «application/zip»)
($_FILES[«file»][«type»] == «application/rar»)
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
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.
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;
}
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?
Pues si no los ejecuta es porque no esta instalado, no puedo ayudarte mucho en eso no soy muy experimentado en temas de servidores.
echo «»;
Donde esta el error ahi ? me dice que tengo un error en esa linea
No sale la linea.. tengo un error en la linea 29 del codigo final.. si me podrias decir te lo agradeceria 😀
Que error te sale?
echo "
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 🙁
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 ?
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.
Disculpa, no me muestra la imagen que subi. Me podrias ayudar?
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?
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
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
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!
todo me sale bien hasta subir el archivo no se que otras carpetas devo crear y como ordenarlas gracias por ayudarme.
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.
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?
Muy pero muy bueno, mi pregunta, como seria para subir archivos .exe ?
Para el tipo de archivo .exe es asi:
$_FILES[«file»][«type»] == «file/exe»
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
Revisa los logs de PHP.
hola como hago para que suba todo tipo de archivo y de tamaño ilimitado
Borra las condicionales.
disculpa amigo es que soy ultra novato podrias subirme el index editado sin las condiciones para poder subir cualquier cosa
yo necesito mandar el archivo a una carpeta local y alamcenar la direccion en una bd como lo hago gracias
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/
Hola necesito saber como levantar varios documentos a la vez seleccionar fotos y documentos word pdf etc. Espero una respuesta
Creo que este formulario no soporte uploads multiples.
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.
Creo que podrias identificar cada imagen con un codigo, y que el usuario tenga un campo con la lista de imagenes por codigo ..
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? :/
quien me ayuda a realizar un formulario de html y php de subida de archivos
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.
hola he estado viendo el codigo pero no he podido solucionar el error de la linea 29