Upload de archivos con PHP

  • Por
Realizamos unas páginas PHP que reciben un archivo del discoduro del visitante y lo suben al servidor remoto.
En PHP tenemos muchas funcionalidades desarrolladas desde el principio y sin necesidad de instalar ningún añadido en nuestro servidor. Es el caso de subir archivos a un servidor web por HTTP y a través de una página con un formulario, donde se permite seleccionar el archivo que queremos cargar de nuestro disco duro.

El ejemplo se encuentra bien documentado en un montón de páginas para desarrolladores, sin ir más lejos en la página de la propia tecnología: http://www.php.net/manual/es/features.file-upload.php. Nosotros en este caso vamos a intentar ir un poco más allá, realizando un par de comprobaciones al subir el fichero y combinando en el mismo formulario campos de tipo file y tipo text.

El formulario para subir seleccionar los archivos

Es un formulario cualquiera, pero tiene una serie de particularidades y campos file, que no solemos utilizar habitualmente.

<form action="subearchivo.php" method="post" enctype="multipart/form-data">
    <b>Campo de tipo texto:</b>
    <br>
    <input type="text" name="cadenatexto" size="20" maxlength="100">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000">
    <br>
    <br>
    <b>Enviar un nuevo archivo: </b>
    <br>
    <input name="userfile" type="file">
    <br>
    <input type="submit" value="Enviar">
</form>


Para empezar vemos que se ha colocado un nuevo atributo en el formulario: enctype="multipart/form-data", necesario para subir en un mismo formulario datos y archivos.

También tenemos el campo hidden MAX_FILE_SIZE, que sirve para indicar el tamaño en bytes de los archivos a subir. Este campo algunos navegadores no tienen porqué entenderlo o hacerle caso. Además, es fácil saltarse esa protección, por lo que deberemos en las propias páginas PHP comprobar que el archivo tenga el tamaño que deseamos.

Por último, tenemos el campo tipo file, donde se seleccionará el archivo a subir. También hemos colocado un campo de tipo text, para subir datos por POST de tipo texto acompañados a los datos binarios del archivo.

Página que sube los archivos

Esta página debe hacer las comprobaciones necesarias para saber si las características del archivo a subir son las que deseamos y realizar la copia del archivo en un directorio del servidor.

Para hacer las comprobaciones, PHP nos crea una serie de variables que podemos acceder con la información del archivo enviado.

$HTTP_POST_FILES['userfile']['name']
El nombre original del fichero en la máquina cliente.

$HTTP_POST_FILES['userfile']['type']
El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podría ser "image/gif".

$HTTP_POST_FILES['userfile']['size']
El tamaño en bytes del fichero recibido.

$HTTP_POST_FILES['userfile']['tmp_name']
El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

Nota: En este momento (a partir de PHP 5) el array $HTTP_POST_FILES ha sido sustituido por el array $_FILES. En realidad es exactamente lo mismo, con la diferencia que $_FILES es más corto de escribir. Dependiendo de la configuración de tu PHP el nombre de variable antigua $HTTP_POST_FILES puede existir o no, pero en cualquier caso te recomendamos utilizar $_FILES para que tus scripts funcionen en cualquier servidor, independientemente de la configuración. Por ejemplo, usa $_FILES['userfile']['tmp_name'] en lugar de $HTTP_POST_FILES['userfile']['tmp_name'].

<?
//tomo el valor de un elemento de tipo texto del formulario
$cadenatexto = $_POST["cadenatexto"];
echo "Escribió en el campo de texto: " . $cadenatexto . "<br><br>";

//datos del arhivo
$nombre_archivo = $HTTP_POST_FILES['userfile']['name'];
$tipo_archivo = $HTTP_POST_FILES['userfile']['type'];
$tamano_archivo = $HTTP_POST_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) && ($tamano_archivo < 100000))) {
    echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){
       echo "El archivo ha sido cargado correctamente.";
    }else{
       echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }
}
?>


Para empezar, recogemos el campo de texto enviado por POST, de la forma habitual. Aunque esto no tenga nada que ver con subir archivos, es muy normal que en el mismo formulario deseemos mezclar varios tipos de información.

Luego se recogen los datos necesarios del archivo, como su nombre, extensión y tamaño para, en el siguiente if, comprobar que la extensión sea .gif o .jpg y que el tamaño menor que 100000 bytes.

Si el archivo tenía las características deseadas, se puede subir al servidor. Para ello se utiliza la función move_uploaded_file(), que recibe el nombre del archivo temporal que se desea subir y el nombre del archivo que se desea dar.

Cuando se sube el archivo, el servidor lo copia en una localización temporal para que seamos nosotros los que elijamos la posición definitiva donde queremos que se almacene. Si no lo copiamos a ningún sitio, después de la ejecución de la página, se borra de su localización temporal.

La función move_uploaded_file() se utiliza para mover el archivo a la posición definitiva. Recibe por un lado el nombre temporal del fichero y por otro el nombre que deseamos colocarle definitivamente y, si se desea, la ruta para llegar al directorio donde queremos guardarlo. En el caso del ejemplo sólo se indica el nombre del archivo, por ello el fichero se subirá al mismo directorio donde están las páginas PHP que hacen el upload. Esta función devuelve un boleano que indica si hubo o no éxito al subir el archivo.

Nota: Es importante señalar que el upload de archivos es un proceso crítico que puede dar lugar a errores y agujeros de seguridad. Por ejemplo, si los directorios destino están protejidos contra escritura, nos dará un error. Podemos ver los errores comunes relatados en la página de PHP.

Recomendamos una vez más ampliar esta información en la página de PHP: http://www.php.net/manual/es/features.file-upload.php

Se pueden descargar los códigos del ejemplo en este enlace.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Ducados

16/1/2004
¿Algun usuario se ha topado con este estupendo error al probar este ejemplo?

Valor del Campo de Texto: archivo

Warning: Unable to create '016.jpg': Permiso denegado in /var/www/html/subir.php on line 55

Warning: Unable to move '/var/www/html/tmp/php8Y90P3' to '016.jpg' in /var/www/html/subir.php on line 55
Ocurrió algún error al subir el fichero. No pudo guardarse.

Lo dicho, si alguien sabe como solucionar esto, que postee aqui o me mande un email.

Gracias por Anticipado

Nehos

25/1/2004
El problema esta en los permisos del directorio donde se van a mover los archivos, en modo consola haz un chmod 777 nombreDirectorio, o implementa un pequeño script con php que te lo haga si no tienes accesso en modo consola

speack

30/1/2004
los errores que muestras parece ser que es porque en el directorio donde pusiste los scripts no le diste el permiso chmod, colocate arriba del directorio y con el menu contextual te aparecera un a opcion de chmod ponle 777...
bye

Ducados

24/2/2004
No es por problema de permisos, haciendole un "ls" al directorio en cuestión sale esto:
[root@ServidorWEB directorio]# ls -al /directorio/en/cuestion
total 80
drwxrwxrwx 2 usuario usuario 4096 feb 24 20:33 .
Dios mio, no siento las piernas... ¿será problema de la RedHat 9.0, del php.ini, de bush?
Saludos y Gracias

FASAT

04/3/2004
efectivamente, son los permisos en los directorios los que influyen en el envio de los archivos, no obstante, aconsejo crear una carpeta y en esa colocar el form y el php, ya que en ella, también quedan los archivos enviados.
FASAT
SANTIAGO, CHILE

david

07/5/2004
El campo MAX_FILE_SIZE = 100000, en que se mide exactamente, en bits o bytes? Lo que quiere decir en este ejemplo es que no se pueden subir ficheros de más de 100 Kb o 100 KB.

Es verdad que sólo se pueden subir ficheros de hasta 2 MB.
Si la unidad de medida es en bits, entonces para poder subir como mucho ficheros de un 1MB el valor de MAX_FILE_SIZE será 1024 KB que es 1024 * 1000 * B = 1024 * 1000 * 8 bits, no?
Espero que alguien lo entienda Saludos, david

José A. Rivas G.

01/10/2004
He utilizado este ejemplo para construir un upload de logotipos para un directorio que tengo en mi web, el comentario va por lo siguiente: Ya se establecen es el ejemplo como limitar el tipo de archivo y tamaño del mismo, pero necesito bloquear las dimensiones del mismo, realice distintas pruebas con getimagesize() y efectivamente me muestra las dimensiones de la imagen pero solo despues de que la misma se subió, hay alguna variable de tipo $HTTP_POST_FILES que deuelva el alto y ancho de un archivo de imagen. Gracias...

Elias

10/3/2005
funciona perfecto el upload, salvo con los archivos de extension "rar", le añadi el codiogo qeu realiza la comprobacion pero no me funciona, no asi con los zip u otras extensiones con las que no tengo problemas

Victor

01/4/2005
Genial el artículo. Me gustaría saber si es posible incluir en el archivo alguna sentencia para enviar por email desde el servidor el documento subido para tener una copia al momento de los archivos subidos desde el formulario. Gracias

cesar sepulveda

14/4/2005
Encuentro espectacular su ayuda. Estube tratando de aplicar este codigo al formulario de envio y no me adjunta el archivo y no lo envia al correo. Quisiera saber como se hace, serian tan amables de enviarme alguna ayuda.
Concretamente quisiera saber como adjuntar un archivo a un formulario y enviar los datos de este con el archivo al correo de destino.
gracias.

cesar sepulveda

26/4/2005
Exelente demostración de upload en php. Los felicito de verdad. Les cuento que me resulto perfectamente. El unico inconveniente es que no se a donde envia el archivo. Hay alguna de enviarlo a un correo electronico?. Ojala me contesten gracias por todo y los felicito!!!!

oriol soriano

26/7/2005
El script del ejemplo, sube el archivo al directorio pre-definido por defecto en php.ini para uploads, lo que hace la función move_uploaded_file() es moverlo de este directorio temporal al que tu decidas de la siguiente manera move_uploaded_file(directorio_temporal,directorio_nuevo) en el ejemplo solo pone nombre del archivo, con lo que se queda en el mismo directorio temporal definido en php.ini

Dario Cortes Martinez

17/11/2005
amigos
encontre la manera de guardar los archivos en carpetas designadas aqui les envio el codigo

<?
$path="\wwwarchivos/";

$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];

if (!((strpos($tipo_archivo, "doc") || strpos($tipo_archivo, "zip") || strpos($tipo_archivo,"jpg")) && ($tamano_archivo < 2000000000))) {
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos *.doc, *.zip o *.jpg<br><li>se permiten archivos de ?? máximo.</td></tr></table><br>";
echo "<a href='index.php'>Click aquí</a> para corregir los campos.";
}else{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $path.$_FILES['userfile']['name'])){
echo "El archivo ha sido cargado correctamente.";
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}
?>

si se dan cuenta ocupe una variable path para darle la direccion
en mi caso trabajo con una carpeta archivos dentro de la raiz
localhostwwwarchivos

espero que les sirva
10.4

Rodrigo Mazzo

28/1/2006
Para los que tengan problemas con las extensiones rar o pptsimilares, para efectos de este script hay cosas que cambian. Por ejmplo, un archivo doc es msword, y uno ppt debe escribirse como vnd.ms-powerpoint. Para averiguar la extensión de una extensión particular, yo usé un "echo $HTTP_POST_FILES['userfile']['type']; "
Espero le sirva a alguien.. saludos,
Rodrigo

Fabian

15/8/2006
Me encanto el articulo pero tengo una duda muy pequeña estoy apenas aprendiendo php, y me gustaria saber o que me explicaran un poco mas donde se descarga el archivo que se subio ?

Edgardo

07/9/2006
el archivo se guarda en el directorio en donde se encuentra la pagina.php

JEJE

24/12/2006
imponente, explica muchas cosas que no sabia, muchas gracias, hace como 3 dias que buscaba algo que me explicara asi de claro, gracias

César Santos

03/1/2007
Muchas Gracias por esta demostración ordenada, correcta y muy bien definida, con tu aporte será suficiente para actulizar mi página web muchas gracias...

PorFavor no dejes de escribir Articulos para los iniciantes en PHP. Otra vez Gracias...

Germán

30/6/2007
Hola aquí les envio un script modificado que si funciona:tu página se llamrá:subir_archivo.php
<body>
Hola, estoy probando el codigo
<?php
echo $_POST['cadenatexto']." Nombres<br>";
if ($_POST['cadenatexto']!='')
{
$path="./archivos_php/";
$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
if (!((strpos($nombre_archivo, "doc") || strpos($nombre_archivo, "gif") || strpos($nombre_archivo,"jpg"))))
{
echo "La extensión o el tamaño de los archivos no es correcta";
}
else
{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $path.$_FILES['userfile']['name']))
{
echo "El archivo ha sido cargado correctamente.";
}
else
{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}
}
?>
<form action="subir_archivo.php" method="post" enctype="multipart/form-data">
<b>Campo de tipo texto:</b>
<br>
<input type="text" name="cadenatexto" size="20" maxlength="100">
<input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<br>
<br>
<b>Enviar un nuevo archivo: </b>
<br>
<input name="userfile" type="file">
<br>
<input type="submit" value="Enviar">
</form>
</body>

iim.vxk

07/9/2007
a los que tengan éstas 2 Advertencias - rutas son un ejemplo real - ::

-
move_uploaded_file(/uploads/images/sample.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in /scripts/php/system/upload-file.php on line X
-

y

-
move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/somefilename' to '/uploads/images/sample.png' in /scripts/php/system/upload-file.php on line X
-

probablemente la ruta '/uploads/images/sample.png' esté incompleta, en mi caso la ruta completa es "/home/x-user/public_html/uploads/images/sample.png"

para saber el directorio actual de trabajo pueden usar getcwd(), de seguro se chingan al error.

XD

:)

Leonardo Lux

03/11/2007
Pueden encontrar una manera más actualizada de subir archivos en:

http://cl2.php.net/manual/es/features.file-upload.php

(por ejemplo, los arreglos $HTTP_POST_FILES están desactualizados en PHP5. Siempre vean la documentación en php.net).

dsayritupac

04/11/2008
<form action="subir_archivo.php" method="post" enctype="multipart/form-data">
<b>Campo de tipo texto:</b>
<br>
<input type="text" name="cadenatexto" size="20" maxlength="100">
<input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<br>
<br>
<b>Enviar un nuevo archivo: </b>
<br>
<input name="userfile" type="file">
<br>
<input type="submit" value="Enviar">
</form>
</body>

<?php
// getcwd() ---> Captura la direccion correcta
$dir=getcwd();
echo $_POST['cadenatexto']." Nombres<br>";
if ($_POST['cadenatexto']!='')
{
// Utilizamos la variable $path para capturar la direccion completa incluyendo las carpetas [ /img_productos/webcams/] donde desea guardar sus imagenes
$path=$dir."/img_productos/webcams/";
$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
if (!((strpos($nombre_archivo, "doc") || strpos($nombre_archivo, "gif") || strpos($nombre_archivo,"jpg"))))
{
echo "La extensión o el tamaño de los archivos no es correcta";
}
else
{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $path.$_FILES['userfile']['name']))
{
echo "El archivo ha sido cargado correctamente.";
}
else
{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}
}
?>

claudia

09/5/2009
path
probe los codigos que han posteado, y encontre que no es necesario usar <br />
$dir=getcwd(); si me funciono con solo poner $path=&quot;./images/&quot;;<br />
gracias a los que postearon el codigo realmente es muy util.

Ricardo

13/5/2009
No pasa nada con los permisos
La verdad es que es el primer hosting con que topo en esto. Hice lo de siempre, crear una carpeta, darle los permisos, el formulario para que suban archivos pdf y todo bien. El problema me surge cuando se quieren leer los pdf, pues me sale el error 403, Forbbiden, es decir, no me está dejando leer el pdf, a pesar de que la carpeta contiene los permisos necesarios la ruta donde se guardan sería algo así archivos/archivo.pdf ese subió y todo bien pero al momento de leerlo, si no doy permiso por archivo, no lo lee. ¿A qué se debera esto?. El hosting no es mío, es de pago, servidor compartido.<br />
<br />
Saludos, espero me puedan ayudar.

matias

15/5/2009
hidden
yo lo probe sin incluir el input el input type=hidden y me funciono.
esto lo probe con el xampp en mi casa.

alguien sabe si realmente es imprescindible??

gracias, me re ayudaron.

es

19/5/2009
ya esta solucionado
ES PROBLEMA DE PERMISOS... CHMOD. PONGAN 777 EN LA CASILLA QUE APARECE. y PONGAN PERMITIR ESCRITURA (EN ALGUNOS CASOS)

Malc

21/5/2009
El problema!!
Es que si lo subes con un script de este tipo, el owner del archivo será APACHE. Que implica esto? Que si no eres tu quien administra el server, despues no vas a poder manipular ese archivo q subiste, me refiero a copiarlo, moverlo o eliminarlo desde el ftp, si no que tendrá q ser con otro script, para el quien lo esté operando sea el mismo owner, osea, el aparche.

No me explique? Ok... intenta descargar ese archivo q subiste o eliminarlo via ftp.

javier

24/7/2009
y el texto?
esta muy bien la explicasion y me funciono muy bien pero tengo una duda, el texto donde se almasena?, con el archivo no may problema, lo puedo en contrar muy facil, pero el texto no se donde se almasena ni como velo

Ares

28/7/2009
Problemillas
Hola! Lo primero, gracias por el artículo, es muy claro ^^

Tengo dos preguntas{
Lo ha probado pero al ordenador servidor le aparece el código fuente del php :S Por qué?;
En qué se diferencia poner "<?php" de poner "<?" a secas en el script?? Cambia algo importante?;
}

Gracias ^^

Daniel

25/9/2009
Bueno, buenisimo
Felicito al creador de este archivo
para algunos seguro es una tonteria, pero yo andaba pariendo desde hace tiempo, se que esta viejito el archivo pero funciona y eso es lo importante. de puta madre viejo te quedo esta vaina.

mario

13/10/2009
y si quiero guardarlo en otro host?
hola, antesq nada muy bueno el tutorial, pero me surge una duda, si el archivo wuireo copiarlo en otro servidor, que deveria hacer para moverlo? espero ser claro. gracias

abraham

28/11/2009
y para 2 archivos?
Y como hacer para recojer dos archivos en el mismo formulario, por ejemplo un pdf y una imagen???

espero sus respuestas graciassss

miaweb

26/12/2009
Información concreta
Hola, no me parece divertido esto de exponer una idea y despues no se cumpla la espectativa. Lo que veo es que es mas complejo la guia que la solución. Alquien puede decirme donde hay un "simple" y "básico" sistema de gestion de contenidos, sin que tenga que padece de explicaciones que no llegan a nada...

marcosg9

31/1/2010
muchisima gracias a todos !!!!!!!!!!!!
al fin pude encontrar un articulo q explique tan bien. gracias gracias gracias gracias de verdad xq ya estuve varios dias en la busqueda de como subir archivo a un servidor este me funciono perfecto. Solo q todavia no entendi como darle el directorio en el q deseo guardar la imagen, pero bueno no importa con tal q el codigo anda, el resto tratare de entender.....gracias de verdad

jmalito

03/2/2010
gracias
Gracias men me funciono perfecto, ahora mi pregunta es como hago para almacenarlo en una base de datos postgres, y que estructura debe llevar la tabla ¿osea que campos debo crear y de que tipo?, tambien como hago para traer el documento desde una consulta? en mi caso necesito manipular fotos de diferentes proveedores. Gracias nuevamente espero pronta respuesta.

phpjunior

08/2/2010
uploads
Muchas gracias, funciona sin problemas

Dito

24/2/2010
Problema al subir archivos
He desarrollado una pag. a traves de la cual se sube archivos al servidor en una intranet, el detalle está que si el archivo se envia en una máquina que se encuentra en el mismo segmento no hay problema, pero si es de otro segmento, no sube nada.
¿alguien sabe a que se debe?

Puntonetsvb

02/3/2010
Subir ficheros por ftp
¿Alguien ha intentado hacer un ftp con php?
Me refiero a FTP verdadero, no subir el archivo al servidor y pasarle a un dir por ftp, el problema que tengo es que tengo que subir pequeños videos de unos 30 - 50 mb pero claro subiendolos desde un form te vuelves loco esperando y la mayoria de las veces o te da error o cambias el timeout del server a infinito

rltxt

17/3/2010
Problemas conel form enctype="multipart/form-data"
Hola, tengo una consulta para hacer a proposito del formulario que sube archivos y datos. Antes de guardar todos los datos intento realizar controles de consistencia de datos mediante un función js. El problema es que si ejecuto el submit del form desde el js, una ves que los controles fueron realizados, me da el siguiente error "Object doesn't support this property or method". pero si el submit lo ejecuto desde un boton submit directamente en el form funciona correctamente, pero me quedo sin los controles del lado cliente.
Alguien tendria una idea de cual es el problema ?? Desde ya les agradezco la colaboración.
Saludos Raúl

silsi

03/5/2010
Texto
Hola. Quisiera saber en dónde se almacena el texto de cadenatexto.
Gracias

jgovea

13/5/2010
$path="archivos_php/";
Hola a todos espero me puedan ayudar e estado intentando poner la ruta a donde se van a ir los archivos y no me hace nada, al momento de subir un archivo me sale esto:
Ocurrió algún error al subir el fichero. No pudo guardarse.
este es mi php

<?php
echo $_POST['cadenatexto']." Nombres<br>";
if ($_POST['cadenatexto']!='')
{
$path="archivos_php/";
$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
if (!((strpos($nombre_archivo, "doc") || strpos($nombre_archivo, "gif") || strpos($nombre_archivo,"jpg"))))
{
echo "La extensión o el tamaño de los archivos no es correcta";
}
else
{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $path.$_FILES['userfile']['name']))
{
echo "El archivo ha sido cargado correctamente.";
}
else
{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}
}
?>

Ayuda por favor ya que me quede atorado

despistao

10/7/2010
Gracias
Gracias por el artículo y los comentarios de la gente. Me han ayudado mucho.
Dejo mi modificación por si sirve de ayuda.
Pueden guardarlo como: subir_img.php (o como les parezca)

<?
if(!($_POST)){
echo"<form action="".$PHP_SELF."" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="200000">
<b>Enviar un nuevo archivo: </b>
<br>
<input name="userfile" type="file">
<br>
<input type="submit" value="Enviar">
</form> ";
}else{

$path = "../../includes/images";
$path = $path."/".$_FILES['userfile']['name'];
//datos del arhivo
$nombre_archivo = $_FILES['userfile']['name'];
$nombre_temporal_archivo = $_FILES['userfile']['tmp_name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($nombre_archivo, "gif") || strpos($nombre_archivo, "jpg") || strpos($nombre_archivo, "jpeg")) || strpos($nombre_archivo, "JPG") || strpos($tipo_archivo, "JPEG")) && ($tamano_archivo > 200000)) {
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 200 Kb máximo.</td></tr></table>";
}else{
if (move_uploaded_file($nombre_temporal_archivo, $path)){
echo "El archivo ha sido cargado correctamente.";
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";


}
}
}
?>

despistao

10/7/2010
El form de comentarios se ha comido la barra diagonal invertida
El form de comentarios se ha 'fumado' las barras diagonales invertidas que pongo antes de las dobles comillas en el formulario del ejemplo anterior.
Os dejo el ejemplo con comillas simples, funciona igualmente...

<?
if(!($_POST)){
echo"<form action='".$PHP_SELF."' method='post' enctype='multipart/form-data'>
<input type='hidden' name='MAX_FILE_SIZE' value='200000'>
<b>Enviar un nuevo archivo: </b>
<br>
<input name='userfile' type='file'>
<br>
<input type='submit' value='Enviar'>
</form>";
}else{

$path = "../../includes/images";
$path = $path."/".$_FILES['userfile']['name'];
//datos del arhivo
$nombre_archivo = $_FILES['userfile']['name'];
$nombre_temporal_archivo = $_FILES['userfile']['tmp_name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($nombre_archivo, "gif") || strpos($nombre_archivo, "jpg") || strpos($nombre_archivo, "jpeg")) || strpos($nombre_archivo, "JPG") || strpos($tipo_archivo, "JPEG")) && ($tamano_archivo > 200000)) {
echo "La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 200 Kb máximo.</td></tr></table>";
}else{
if (move_uploaded_file($nombre_temporal_archivo, $path)){
echo "El archivo ha sido cargado correctamente.";
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";


}
}
}
?>

despistao

11/7/2010
asunto del comentario
esto es el contenido de mi comentario y no voy a aportar nada. solo pasaba a saludar.
un bico putas

pakuki

12/7/2010
no entiendo una cosa
Hola perdon mi falta de cerebro pero no entiendo como hago para direccionarla el envio a una carpeta creada por mi por ejemplos "fotos"

dr-alejandro

09/8/2010
sobre el manual
no se si es el lugar para preguntar esto pero estaba mirando el post ya que tengo que hacer un formulario que suba fotos y despues las guarde en la base de datos y y vi el link del manual php y lo he visto en muchos articulos y supuestamente es en español pero yo siempre lo veo en ingles al mismo link que otros lo ven en español. Que puede que haga que yo no pueda? aparte le busque entre los idiomas peor no me aparece español y elegi catalan (que creo que debe ser parecido) y no funco :(

Me pueden ayudar?

Saludos

mariano

05/9/2010
Felicitaciones
Al fin una explicacion clara y que no da nada por sabido.Ademas con gran poder de sintesis sin perder intelegibilidad.Felicitaciones

Sebastián

13/9/2010
Reemplazar imagen si no se sube alguna
Me podrían ayudar?
Tengo un formulario con un campo file en una página. Recibo la info del file en otra página.
En la página receptora inserto en la base de datos la ruta del file enviado
Ahora, cómo hago para poner una imagen predeterminada (ej:imagenes/image_not_avaible.jpg) en el caso de que no haya mandado ninguna imagen dentro del file?, ya que no es un campo obligatorio y necesito poner una imagen si o si en su reemplazo
Gracias!

ayudaaaa

23/9/2010
Problema de permisos
Buenas, esta muy bien el gestor... me funciona bien en un servidor pero en otro no me funciona, saben que permisos tengo que cambiar del servidor para que me funcione? pregunte a atención al cliente y me han dicho que ellos no son programadores... así que tengo que decirles que quiero que me activen o desactiven o cambien... :S

El_Rolas

25/9/2010
AYUDA
Buenas noches, soy diseñador grafico y es la primera vez que trabajo con paginas web, estoy subiendo unos archivos a traves de FTP (Filezilla) pero a la hora de subirlos cambia el tamaño de los archivos!!!! obviamente no funciona mi pagina, son unos archivos .xml de un template que modifiqué con mis datos, pero por ejemplo si subo un archivo .xml que pesa en mi disco duro 3933 bytes, cuando termina de subir el mismo archivo en la ventana del servidor remoto mide 3885 bytes... la verdad no se porque sucede esto y si es l razon por la cual no funciona mi pagina, tengo instalado el wampserver y de forma local funciona excelente POR FAVOR ALGUIEN AYUDENME
de antemano, les agradezco sus comentarios

olga

05/10/2010
SOLUCION
tu error es la linea diagonal en la ruta /, solo kitasela y listo, yo me kebre la cabeza una semana con ese mismo error

rosss

08/10/2010
php
no funciona guardar documentos me guarda mismo docto

kontramundo

20/12/2010
Gracias + Aporte
Tenia problemas al subir archivos, encontré la solución gracias a varios de ustedes.

Le hice una modificación al código, esto con la finalidad de capturar y filtrar el mayor numero de errores que surgen con respecto a la carga de archivos.

La explicación:

$_FILES['userfile']['error'] Nos devuelve un código de error. algunos de los valores devueltos que podemos utilizar son los siguientes:

Valor 1: UPLOAD_ERR_INI_SIZE
Valor2: UPLOAD_ERR_FORM_SIZE
Valor 3: UPLOAD_ERR_PARTIAL
Valor 4: UPLOAD_ERR_NO_FILE
Valor 6: UPLOAD_ERR_NO_TMP_DIR
Valor 7: UPLOAD_ERR_CANT_WRITE

Estos valores nos permiten manejar los errores de la siguiente manera:

if ($_FILES['userfile']['error'] > 0)
{
echo 'Problema: ';
switch ($_FILES['userfile']['error'])
{
case 1: echo 'El tamaño del archivo cargado supera el especificado en php.ini';
break;
case 2: echo 'El tamaño del archivo cargado supera el especificado en el formulario HTML';
break;
case 3: echo 'El archivo se ha cargado parcialmente';
break;
case 4: echo 'No se he cargado ningun archivo';
break;
case 6: echo 'No se ha especificado ningun directorio temporal en el archivo php.ini';
break;
case 7: echo 'Carga Fallida. No s epuede escribir en el directoio';
break;
}
exit;
}



Quedando el código completo de la siguiente manera:


<?php
echo $_POST['cadenatexto']." Nombres<br>";
$ruta="./uploads/";
$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];


if ($_FILES['userfile']['error'] > 0)
{
echo 'Problema: ';
switch ($_FILES['userfile']['error'])
{
case 1: echo 'El tamaño del archivo cargado supera el especificado en php.ini';
break;
case 2: echo 'El tamaño del archivo cargado supera el especificado en el formulario HTML';
break;
case 3: echo 'El archivo se ha cargado parcialmente';
break;
case 4: echo 'No se he cargado ningun archivo';
break;
case 6: echo 'No se ha especificado ningun directorio temporal en el archivo php.ini';
break;
case 7: echo 'Carga Fallida. No s epuede escribir en el directoio';
break;
}
exit;
}



if (!((strpos($nombre_archivo, "doc") || strpos($nombre_archivo, "gif") || strpos($nombre_archivo,"jpg"))))
{
echo "La extensión del archivo no es correcta";
}
else
{
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $ruta.$_FILES['userfile']['name']))
{
echo "El archivo ha sido cargado correctamente.";
}
else
{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}
}

?>


Espero les pueda ayudar mi aporte para que controlen de mejor manera los errores.


Saludos a todos.

Seb

16/2/2011
...
Excelente el artículo, simple y al grano para lograr subir un fichero.
Gracias!

dibustosb

17/2/2011
Descargar ficheros
Hola, cómo puedo hacer para que este mismo código cuando despliega los ficheros que existen en el servidor, (en la tabla) muestre los nombres de los ficheros como un enlace y que al presionar en ellos se puedan descargar en el computador personal??

ayuda, please!

Adan

23/3/2011
Necesito ayuda
Hola a todos los programadores web, bueno el motivo de este mensaje es para saver si alguna persona me pudiera ayudar en el problemote que se me presento.
He creado una pagina web compre el dominio y todo, la la subi a internet el problema es que quiero que otras personas puedan enviarme archivos como fotos, documentos, musica, etc. a mi pagina y en relidad solo manejo dreamweaver8 en la cual cree la pagina.

si alguien me ayuda en este problema le estaria muy agradecido ya que soy nuevo en el diseño de paginas web y me ha podido ayudar. Si lo hacen y me ayudan a resolver mi problema le ayudaria en cualquien otro tipo de programa ya que manejo una gran variedad y le puedo recomendar paginas buenas para descargar softwares gratis y completos.

adn_funezodair@hotmail.com
adn_funezodair@yahoo.com

Gracias de antemano.
Att; Adan Odair Funez
Honduras

juliteja

27/6/2011
Funciona pero necesito almacenar la ruta de la imagen en MySQL
Hola. Muchas gracias por este excelente tutorial.

Me funciona perfecto la carga de la imagen y me la guarda correctamente en la carpeta que le indiqué en el PHP, pero necesito que también me guarde la ruta de la imagen en un registro de la base de datos MySQL.

¿Cómo puedo hacer para que me guarde la ruta de la imagen dentro del registro de la BD?

Muchas gracias por sus aportes y de nuevo felicitaciones por este excelente sitio.

Marcelo

28/6/2011
$_FILES
Hola a todos, no soy un experto, pero $_FILES no es un array asociativo? y estos no se pueden llamar como los indexados, $array[0].
Es que en mi caso tengo un form con <INPUT NAME="archivo" TYPE="file">
y en el script que uso para subirlo $nombre = $_FILES[0]['name']; y no funciona. Sin embargo si utilizo $nombre = $_FILES['archivo']['name']; si me va.

este es mi código completo (sustituyendo $_FILES[0] por $_FILES['archivo'], funciona, pero quería saber si es posible la otra forma, ya que estuve probando y buscando por ahí pero no he ehncontrado nada):

/*FORMULARIO*/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>

<body>
<form ENCTYPE="multipart/form-data" action="../includes/inc_logos_empresas.php" method="POST"><!--imagen_agregar.php-->
<INPUT NAME="archivo" TYPE="file"><!--NAME="userfile"-->
<p><input type="submit" value="Guardar Imagen">
</form>
</body>
</html>
/*FIN FORMULARIO*/

/*SCRIPT DE SUBIDA*/
<?
include('../connections/miconexion.php');

if(!empty($_FILES[0]['name'])){
$extension= pathinfo($_FILES[0]['name']);
$archivo_name = "../logos_empresas/".$_FILES[0]['name'];
$nombre = $_FILES[0]['name'];

//compruebo si la extension del archivo es el que deseo
//if($extension['extension'] == 'jpg' ){

if (move_uploaded_file($_FILES[0]['tmp_name'], $archivo_name)){ //muevo el archivo temporal al directorio requerido
$log=$log. "<p style='color:green'>El archivo ha sido cargado correctamente.</p>";
$log2="El archivo ha sido cargado correctamente.";
}
else{
$log=$log. "<p style='color:red'>Ocurrió algún error al subir el fichero. No pudo guardarse.</p>";
$log2="El archivo ha sido cargado correctamente.";
}
// }

/*else{
$log=' <p style="color:red">Extensión no permitida</p>';
$log2="Extensión no permitida.";
}*/
}
else{
$log=' <p style="color:red">Error con el nombre del input</p>';
$log2="Error con el nombre del input";
}
//imprimo el log del script
$sql = 'INSERT INTO log_logos (MEMO1,IMAGEN1,FECHA1) VALUES ("'.$log2.'","'.$nombre.'","'.date('Y-m-d H:i:s').'")';
//echo $sql;
$res=mysql_query($sql)or die(mysql_error());
echo $log;
?>

Shirley

21/8/2011
Vaya COPIA EXACTA DEL LIBRO: PHP Y MySQL del grupo editorial Megabyte.
Este artículo es una copia EXACTA del libro PHP Y MySQL del grupo editorial Megabyte. Cuyo autor es Joel De la Cruz Villar. Libro editado en Julio del 2004 con ISBN: 9972-9911-5-6

¡VAYA CARA DURA TENÉIS!!!!

dabichola

30/8/2011
ayuda
entonces cual es el codigo completo para que puedan postear en mi web ok ayuda porfavorrrrrrr

alvaro jimenez

29/12/2011
mensaje de error del upload
por que sera que mi pagina me tira este error: "no such file or directory in .../pagina.php" si ya he dado todos los permisos a la carpeta destino?
tendra algo que ver que la carpeta no esta en "public_html"?

odv144

07/1/2012
no poder subir pdf de mas de 100KB
Hola amigos no pretendo enseñar nada nuevo solo comentar un error que me tuvo 2 dias dando vueltas y talves sea por ser un novato en php, comento mi problema primero:
trataba de subir archivos ya creado en formato pdf al servidor bueno funcionaba perfecto usando las el move_uploaded_file pero me presentaba un problema me subia archivos pdf hasta 100KB pero no mayor aunque jpg los subia sin problema sin importar el tamaño, intente 99 cosas hastas que sin esperanza intente poner esta linea que aparece entodas las paginas que visite, pero al estar funcionando para los otros archivos pense que no erra necesario y es esta en el formulario que va puesta :
<input type="hidden" name="MAX_FILE_SIZE" value="7000000" />
antes de <input file> y con eso ya quedo funcionando y me permite subir pdf hasta de 7MB.
espero no molestar a nadie con este comentario tan simple.
Saludos a todos los grandes que siempre nos ayudan a los principiantes.
Gracias

ariday

24/2/2012
necesito subir paquets tipo SCORM
necsito que alguien me ayude, es que necesito subir archivos ZIP n php que contiene archivos tipo SCORM y agregar una palabra qu vincule a se archivo

resendiz1

25/5/2012
evitar advertencia al cerrar navegador mientras se carga el archivo
me podrian ayudar para que muestre una advertencia al cerrar navegador mientras se carga el archivo al servidor y asi poder asegurarse que se cargó bien el archivo?

31341303P

07/6/2013
Upload de archivos con PHP
Hola, Miguel Angel.

Tu explicación es magistral y me ha resuelto un aspecto tan importante de la aplicación.

Muchas gracias una vez más.

Juan Eugenio

jmorf

29/10/2013
$HTTP_POST_FILES DEPRECATED!!!!
Para las versiones nuevas de php $HTTP_POST_FILES es irreconocible:
cambiar $HTTP_POST_FILES por $_FILES.
Ej.

<?php
//tomo el valor de un elemento de tipo texto del formulario
$cadenatexto = $_POST["cadenatexto"];
echo "Escribió en el campo de texto: " . $cadenatexto . "<br><br>";

//datos del arhivo
$nombre_archivo = $_FILES['userfile']['name'];
$tipo_archivo = $_FILES['userfile']['type'];
$tamano_archivo = $_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo

if (move_uploaded_file($_FILES['userfile']['tmp_name'], '/var/www/netb/'.$nombre_archivo)){
echo "El archivo ha sido cargado correctamente.";
}else{
echo "Ocurrió algún error al subir el fichero. No pudo guardarse.";
}

?>

Carlos Ibañez

25/11/2014
Download
Hola buen dia, para descargar el archivo, que se deberia hacer?. Necesito saber eso, es lo unico que me falta para terminar mi proyecto