Upload de archivos usando PHP

Escrito por Mauro Rondinelli el Jueves 16 de Setiembre de 2004 a las 00:00hs

Por medio de este articulo aprenderemos la forma de subir un archivo al servidor por medio del navegador. El único requisito para que todo funcione es que la carpeta donde vayamos a subir el archivo tenga los permisos de escritura.

El Formulario

Lo primero que debemos armar es el formulario para permitir que el usuario indique que archivo desea subir al servidor, para esto utilizamos la etiqueta HTML <input> con su atributo type establecido a "file", veamos el código HTML...

<form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data" name="form1">
<p align="center">Archivo
<input name="archivo" type="file" id="archivo">
</p>
<p align="center"><input name="boton" type="submit" id="boton" value="Enviar"></p>
</form>

Tengamos en cuenta varios detalles importantes: el formulario esta apuntado (action) a el archivo php actual ($PHP_SELF) y el atributo enctype esta establecido a "multipart/form-data", esto es así por que debemos enviar un archivo. Otro detalle importante son los nombre de los campos "archivo" para el input y "boton" para el submit.

El Script

Bueno llego el turno de crear el script que hará el trabajo de subir el archivo, este script php va ubicado al comienzo de la pagina...

<?
if($boton) {
if (is_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name'])) {
copy($HTTP_POST_FILES['archivo']['tmp_name'], $HTTP_POST_FILES['archivo']['name']);
$subio = true;
}

if($subio) {
echo "El archivo subio con exito";
} else {
echo "El archivo no cumple con las reglas establecidas";
}
die();
}
?>

Lo primero que tenemos es un bloque if que detecta si se envió el formulario, para esto preguntamos si la variable $boton esta presente, si esta presente quiere decir que se envió el formulario entonces entramos en el segundo if que comprueba que se haya enviado algún archivo, si se envió el archivo se copia (copy) desde el directorio temporario donde subió al lugar donde queremos alojarlo, en este caso al mismo directorio del script PHP.

¿Que es el $HTTP_POST_FILES?

Seguro que observaron que esta variable aparece muy seguido en nuestro script, la misma es una variable del tipo matriz (array) predefinida de PHP que contiene la información del archivo que estamos subiendo, por ejemplo...

  • $HTTP_POST_FILES['archivo']['tmp_name'] - Guarda la ruta donde esta alojado temporalmente el archivo.
  • $HTTP_POST_FILES['archivo']['name'] - Guarda el nombre del archivo (ej: "dibujo.gif").

Esos son algunos de los valores que tiene esa variable, mas adelante veremos mas, lo importante es aprender la forma de acceder a esos valores...

$HTTP_POST_FILES['nombre_del_input_file']['clave']

Volvamos al script, si todo salió bien se establece la variable $subio a true para que luego sepamos que mensaje mostrarle al usuario "El archivo subio con éxito" o "El archivo no cumple...".

Avanzando Mas

El ejemplo mostrado anteriormente fue algo básico como para comprender el funcionamiento pero a la hora de implementarlo seguramente nos surgirán problemas como "¿Que pasa si me suben archivos muy grandes?" "¿Que pasa si en ves de una imagen suben otro tipo de archivo?" ...ETC.

Para solucionar esto utilizaremos el $HTTP_POST_FILES que contiene mas información del archivo enviado, veamos...

  • $HTTP_POST_FILES['archivo']['size'] - Devuelve el tamaño del archivo (ej: 25445)
  • $HTTP_POST_FILES['archivo']['type'] - Devuelve el tipo de archivo.(ej: image/gif)

Con esta información podemos mediante bloques if ir viendo si el archivo supera los x bytes de tamaño o es de otro formato, veamos el ejemplo de el script avanzado...

<?
if($boton) {
if (is_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name'])) {
if($HTTP_POST_FILES['archivo']['size'] < 85000) {
if($HTTP_POST_FILES['archivo']['type']=="image/gif") {
copy($HTTP_POST_FILES['archivo']['tmp_name'], $HTTP_POST_FILES['archivo']['name']);
$subio = true;
}
}
}

if($subio) {
echo "El archivo subio con exito";
} else {
echo "El archivo no cumple con las reglas establecidas";
}
die();
}
?>

Este script restringe la subida a archivos GIF menores a 80k, ¿fácil no? Podes descargar los ejemplos desde aquí. Digamos que es algo simple de realizar y sirve mucho para agregarle nuevas funciones a nuestra web.


comentarios



  1. Necesito poder subir un archivo de 9Mb al servidor y ya cambié el parámetro en php.ini upload_max_filesize=20M, reinicié el servicio de Apache y nada. ¿Me puede colaborar en esto por favor?



  2. El tamaño se especifica en Bytes



  3. Oye y este soporta archivos mp3.. esque e estado buscando algun script para subir archivos mp3 por medio de php pero hasta ahora no he encontrado alguno ke funcione bien... espero respuesta gracias.. saludos¡



  4. Otra cosa a cambiar y es aconsejable es el timeout.......



  5. para subir mp3 es lo mismo solo cambia el jpg y gif por mp3



  6. En q carpeta queda el upload del archivo??



  7. Hola .. estoy tratando de subir archivos... el codigo funciona perfecto solo hasta 500Kb si el archivo es mas grande me sale que no se puede mostrar a pagina.. podria ser problemas del server?? ya vi las variables del PHP ini y todo esta normal..



  8. hola, el script funciona perfecto, pero resulta de que los archivos que estoy subiendo me los esta subiendo a la carpeta del public_html... hay forma de que yo pueda poner esos archivos en una carpeta dentro de public_html, por ejemplo public_html/uploads o en otra parte en el server?



  9. mira
    para subir archivos grandes debes cambiar unas variables que hay en el servidor (en este caso apache)

    en php.ini
    file_uploads=On

    Max_execution_time= (el tiempo que consideres apropiado segun el tamaño del fichero, en segundos)

    max_input_time= (el tiempo que consideres, en segundos)

    memory_limit= las megas que consideres (siempre con el M detras ejemplo 16M, 500M...)
    upload_tmp_dir= directorio que creas conveniente (temporal, donde sube el fiecho por primera vez)

    post_max_size= tamaño del fichero que subas (la M que no se te olvide)

    upload_max_filesize= tamaño del archivo a subir (la M ... ya sabes)

    consejo:
    marca el tiempo por lo meos el doble del que creas, porque el servidor espera un tiempo, en funcion del transito de informacion, y si empieza a subir el fichero y se corta, quiere decir que el tiempo de espera es demasiado corto

    bueno, que te vaya bien, Un saludo



  10. COMO LO SUBO EN OTRA CARPETA



  11. Oye amigo he buscado por mucho tiempo respuesta a esto, y esta es la mejor y mas completa sinceramente te lo agradezco funciona perfectamente



  12. Pana la cosa es donde se pasa las imagenes y se podria
    que funcionara conprograma o otra cosa



  13. Como puedo hacer para guardar la ruta de un archivo enviado por un input file

    Gracias



  14. Quisiera saber como guardar el archivo que suba en una base de datos... por favor sean explicitos soy novato



  15. Hola a todos, cargo un archivo para leerlo desde una aplicación web PHP que esta en un servidor linux (en este momento no tengo conocimiento de la versión de linux), resulta que la aplicación envia y procesa archivos nmenores de 8 mb aprox. estoy tratando de enviar una archivo de 10 Mb y no lo hace.

    Incluso al archivo de 10 Mb le quito información y lo dejo de 7 Mb y lo sube y procesa sin problema, con esto se descarta que el archivo pudiese estar corrupto.

    Cuando le doy al boton de enviar el archivo solo aparece el mensaje en la parte inferior del navegador "enviando petición a XXXX" luego la página se recarga y no aparece nada, ni un error.

    De verdad no se que hacer, tuve problemas comunes como el tamaño maximo del archivo con los archivos de 3 Mb, luego el error de tiempo máximo de ejecución de un script con los archivos de 7 Mb, pero con los de 10 Mb ni idea de lo que pudiera estar pasando... a menos que no tenga nada que ver con PHP, sino con el servidor de Linux.

    Gracias de antemano por cualquier sugerencia.



  16. fijate en la solucion que dieron mas arriba.
    Está perfecta!!!

    para subir archivos grandes debes cambiar unas variables que hay en el servidor (en este caso apache)

    en php.ini
    file_uploads=On

    Max_execution_time= (el tiempo que consideres apropiado segun el tamaño del fichero, en segundos)

    max_input_time= (el tiempo que consideres, en segundos)

    memory_limit= las megas que consideres (siempre con el M detras ejemplo 16M, 500M...)
    upload_tmp_dir= directorio que creas conveniente (temporal, donde sube el fiecho por primera vez)

    post_max_size= tamaño del fichero que subas (la M que no se te olvide)

    upload_max_filesize= tamaño del archivo a subir (la M ... ya sabes)

    consejo:
    marca el tiempo por lo meos el doble del que creas, porque el servidor espera un tiempo, en funcion del transito de informacion, y si empieza a subir el fichero y se corta, quiere decir que el tiempo de espera es demasiado corto

    bueno, que te vaya bien, Un saludo



  17. Excelente, gracias.

    Una consulta, que sucede con la seguridad al dejar subir archivos al servidor, de eso no conozco nada pero habría que tomar algún resguardo?, qué se puede hacer?.

    Saludos



  18. He probado el script, no sé por qué ni si quiera me aparecen los datos en el script que recibe el archivo, he probado con el siguiente código

    $name = $_FILES["userfile"]["name"];
    $tmp = $HTTP_POST_FILES["userfile"]["tmp_name"];
    $tama = $_FILES["userfile"]["size"];
    echo $tama;
    echo $tmp;
    echo $name;

    y no se imprime nada, ya modifiqué las variables que se mencionan en php.ini y no consigo que jale, alguna idea?

    Estoy usando php en Tomcat, gracias



  19. ¿como se le puede especificar la carpeta donde queremos que se guarden los archivos subidos al servidor?



  20. Yo tengo que subir un archivo excel al servidor y hago lo que viene en el primer ejemplo. Cuando subo el archivo no me da error pero el archivo no esta en el servidor. He cambiado el tmp_name por tmp, ya que mi carpeta temporal tiene ese nombre y sigue pasando lo mismo, tb he buscado el php.ini del servidor y no lo he encontrado ....
    espero que me podais ayudar .... gracias



  21. esta excelente tu codigo solo quisiera molestarte necesito que la ruta donde se guarda la imagen se guarde en un campo de mi base de datos (Imagen de tipo text) para asi poder mandarla llamar luego, como le hago?? te agradeceria mucho la ayuda, esque soy nuevo en esto de php y mysql



  22. bueno yo necesito saber si algunos sabe ya yo tengo un formulario personalizado de un scrip que me baje, lo que necesito es ponerle al momento de subir un archivo que diga tiempo restante velocidad etc y alfinal le muestre el link para descargar dicho archivo si tienen un ejemplo se los agradeceria muchisimas gracias!



  23. me funciona perfectamente en el servidor local.. pero cuando la cuelgo me sale error al subir los archivo ya coloque los permisos solo ala carpeta donde cuelgo la fotos, y si le doy el permiso 777 al archivo con el que lo subo .. no me funciona no hace nada no sube el archivo al servidor pero no me sale ningun error solo se queda en esa pagina quisiera q me ayudaran un poco con eso de los permisos pues creo q es ahi el problema gracias....



  24. Hola, de verdad es ta muy interesante el scrip que desarrollaste ahora mi pregunta digamos que en mi servidor tengo una carpeta donde esta mi web y dentro de esta esta imagenes por ejemplo, diagmos que un usuario sube una imagne que se llame ejemplo.jpg, despues otro quiere subir otro archivo que se llama ejemplo.jpg hay alguna forma de cambiar los nombre de estos archivos ala hora de subirlos que cada imagen se guerde con un numero por ejemplo 1.jpg y la otra 2.jpg y asi nombre[5].jpg no se que mas pueda ser de ante mano gracias por su colaboracion.



  25. hola que tal, mira necesito saber como subo a mi pagina apache http server un archivo para que otra persona de otro pc pueda descargar el archivo sin complicacion



  26. Gracias!!! Fue de demaciada Ayuda!



  27. hola
    mi pregunta es como hago para cargar un archivo plano y cargar la base de datos de mysql con php



  28. Muy bueno el tutorial y el script



  29. como tendria q ser en caso de quere que cuando el usuario suba el archivo el mismo cambie de nombre.. es decir: si el archivo a subir se llama pepito.jpg que cuando se aloje dentro de mi servidor sea 123.jpg



  30. para guardar el archivo en una carpeta que ustedes elijan deben agregar la función move_uploaded_files al script

    la linea agregada deberia quedar asi:

    move_uploaded_file($_FILES['archivo']['tmp_name'],'nombre de la carpeta personalizada/'.$_FILES['archivo']['name']) ;



  31. Hola a todos:
    Agradecedía si alguien puede orientarme en lo siguiente:

    El script lo he probado en local y me funciona perfectamente.
    Lo he probado en otro servidor remoto que soporta php 5 y tambien funciona.

    Pero en el servidor en el que necesito subir los archivos, me da el siguiente error en los ficheros log:

    [client 80.34.59.60] PHP Notice: Undefined variable: boton in /var/www/vhosts/brenesygironella.com/httpdocs/pruebas/subir_archivos.php on line 12
    [client 80.34.59.60] PHP Notice: Undefined variable: PHP_SELF in /var/www/vhosts/brenesygironella.com/httpdocs/pruebas/subir_archivos.php on line 30
    [client 80.34.59.60] PHP Notice: Undefined variable: boton in /var/www/vhosts/brenesygironella.com/httpdocs/pruebas/subir_archivos.php on line 12, referer: http://www.brenesygironella.com/pruebas/subir_archivos.php
    [client 80.34.59.60] PHP Notice: Undefined variable: PHP_SELF in /var/www/vhosts/brenesygironella.com/httpdocs/pruebas/subir_archivos.php on line 30, referer: http://www.brenesygironella.com/pruebas/subir_archivos.php.

    Esto es porque la versión de este servidor es php4 y necesita algo más en el script ?.

    Gracias de antemano.

    Begoña



  32. Hola a todos



  33. Hola Begoña, sustituye action="" por action="".
    y sustituye $boton por $_POST[boton]
    Son los dos fallos que veo. Es porque tienes las globales en Off, cosa que es correcta. El progamador de esta rutina lo montó para globales en On (mala práctica).

    Un saludo



  34. Perdón, cambia action="" por action="". Y cambia como te he dicho la variable boton.



  35. Necesito poder subir un archivo de 9Mb al servidor y ya cambié el parámetro en php.ini upload_max_filesize=20M, reinicié el servicio de Apache y nada. ¿Me puede colaborar en esto por favor?)))
    Jose Leonardo Rodriguez:

    Un amigo una vez me dijo que existia un achivo de configuracion htacces o similar que permitioa hacer eso... en conjunto con php tal vez te sirva a averiguarlo asi..



  36. que grandes son... la solucion mas clara y transparente que he encontrado hasta ahora. No es la primera vez que esta pagina ofrece una gran lección. Muchas gracias por compartir sabiduría.

agregar comentario


Se permiten las etiquetas HTML <b>, <i> y <p>. Si ingresa alguna dirección web o dirección de email serán convertidos en enlaces automáticamente.





publicidad