Un espacio para los entusiastas del web

Upload De Archivos Con PHP

Publicado el 26 de Mayo, 2002

Aquí enseñaré cómo subir archivos al servidor por medio de un script de php, proceso es muy simple y sencillo.

UpPara
el correcto aprendizaje utilizaremos un ejemplo, en él que subiremos
un archivo. Este solo puede ser de extencion .zip y ocupar menos de 30 kb, definiendo
así las opciones del upload con php.

Primero empezaremos con el formulario html, encargado de enviar el archivo al servidor.

<form action="subir.php" method="post"
      name="miformu" enctype="multipart/form-data">
      <input name="archivo" type="file">
      </form>

Cómo se daran cuenta, este formulario tiene un parametro nuevo llamado enctype, con
el valor "multipart/form-data", informando que envía datos
y archivos, opción indispensable para el correcto upload del fichero.

También utilizamos un input "file" para que el usuario pueda explorar su respectiva
computadora en busca del archivo a subir.

Suponemos que el script al que enviamos el formulario y el encargado de procesarlo se
llama subir.php. A continuación explicare el contenido y funcionamiento
de este archivo.

Cómo vimos en el formulario, el campo de archivo se llama archivo:

<input name="archivo"
        type="file">

De acuerdo a este nombre sera que trabajaremos en el lado del servidor, osea en
el script.

El archivo se guarda en la carpeta temporal del servidor, dato que hay que tenerlo
en cuenta ya que no todos los servidores cuentan con esta opción y ponen
el tamaño de dicha carpeta a 0, imposibilitando subir archivos.

Para referirnos al archivo en el script lo hacemos por medio de:

$archivo

Otras propiedades que tendremos a nuestra disposicion es el tamaño (en bytes)
y el nombre del archivo.

$archivo_name
– Nombre del archivo (ej: instaladores.zip, miarchivo.zip)

$archivo_size - Tamaño
del archivo en bytes (si son 10kb serian 10000 bytes)

Nota: A este
punto cuándo nos referimos al archivo lo hacemos siempre con $archivo, debido
a que en el formulario lo denominamos de esta forma (<input name="archivo" type="file">).

La explicacion la hago suponiendo un conocimiento básico de php por parte
del lector.

Primero mostrare el script, luego explicare linea por linea el script:

<?php
	//formulario de upload por jorge luis martinez
	//http://miscodigos.jlmnetwork.com/
	$extension = explode(".",$archivo_name);
	$num = count($extension)-1;
	if($extension[$num] == "zip")
		{
		if($archivo_size < 30000)
		{
		if(!copy($archivo, "archivos/".$archivo_name)
		{
		echo "error al copiar el archivo";
		}
		else
		{
		echo "archivo subido con exito";
		}
		}
		else
		{
		echo "el archivo supera los 30kb";
		}
		}
		else
		{
		echo "el formato de archivo no es valido, solo .zip";
		}
?>

Lo primero que haremos sera comprobar que la extencion del archivo es la permitida
(.zip).

Para ello utilizamos la funcion de php explode, la cual guardará en un array el nombre del archivo segun el primer parametro (el punto):

$extension = explode(".",$archivo_name); 

Para mejor entendimiento, si el archivo se llama ficheros.zip el explode pondria
en este caso en la variable $extencion el nombre en dos partes:

$extension[0] y $extension[1]

los cuales contienen:

$extension[0] --> "ficheros"
$extension[1] --> "zip"

Ahora obtendremos la longitud del array, en este caso seria de 2 (ya que contiene
2 elementos "ficheros" y "zip"), a ese numero le mermamos
1 y lo asignamos a una variable llamada $num:

$num = count($extension)-1;

Nota: Le hemos mermado 1 a la longitud por que cuando queramos llamar al array $extension[$num]
debemos de hacerlo teniendo en cuenta que los elementos van desde 0, por lo
que aunque contenga 2 elementos no podemos llamar al segundo con $extension[2],
si no que tenemos que llamarlo por su posicion $extencion[1].

Ahora haremos el condicional. Si la extencion del archivo es zip continuaremos con
el proceso de upload, de lo contrario mostraremos mensaje de error.

if($extension[$num] == "zip")
{
...
}
else
{
echo "el formato de archivo no es valido, solo .zip";
}

Ahora, continuaremos con el upload, suponiendo que el archivo era el correcto.

Lo siguiente a hacer es comprobar el tamaño del archivo; para ello utilizaremos
la variable antes mencionada $archivo_size. Si el tamaño
es menor a los 30kb (recuerde, debe especificarlo en bytes, por lo que serian
30000) continuaremos con el upload, de lo contrario mostraremos un mensaje de
error:

if($archivo_size < 30000)
{
...
}
else
{
echo "el archivo supera los 30kb";
}

Ahora, continuaremos con el upload, suponiendo que el tamaño del archivo es
correcto.

Utilizaremos la función copy() de php, la cual copiara el archivo
a la carpeta que especifiquemos.

Nota: El archivo que hemos subido por medio del formulario se guarda en la carpeta temporal del
servidor y se accede a él por medio de la variable $archivo, este archivo
será borrado de la carpeta temporal cuando el script finalize su ejecución,
este proceso es automatico y lo realiza el servidor, usted no tiene que preocuparse
por este aspecto.

En este caso copiaremos el archivo a una carpeta del servidor llamada archivos.
Notese que la ruta de copiado debe de ser relativa, no absoluta, y es relativa
al script. Osea, si el script se ejecuta en:

http://www.servidor.net/cuenta/carpeta/subir.php

La funcion en este caso intentara copiarlo a:

http://www.servidor.net/cuenta/carpeta/archivos/

Lo hemos puesto en un if y con signo de negación (!),
para que en caso de no poder copiar el archivo nos salga mensaje de error:

if(!copy($archivo, "archivos/".$archivo_name))
{
echo "error al copiar el archivo";
}
else
{
echo "archivo subido con exito";
}

En este caso el archivo ha sido copiado a la carpeta archivos y con el mismo nombre
que tenía, osea, si el archivo se llamaba "ficheros.zip",
el archivo ha quedado en la carpeta con el mismo nombre "archivos/ficheros.zip".

Notese que esto no es obligatorio, y podemos ponerle el nombre que queramos, si hubieramos
querido que el archivo se llamara "jlmm.zip", simplemente
pondriamos en el copy() lo siguiente:

copy($archivo, "archivos/jlmm.zip")

Bien, espero haya quedado claro, y espero tus comentarios.

Suerte y hasta el proximo tutorial!

¿Te gustó?

¡Sí, me gusta! Le ha gustado a 32 personas
Loading ... Loading ...

Jorge Luis Martinez MJorge Luis Martinez M para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo

Síguenos en: @maestros | Fan page

Comentarios

Páginas: « 1 2 [3]

  1. Martello

    Gracias!

    Responder
  2. No Registrado

    creo que puede ser que en la definicion de cadena te falta una barra para indicar donde se separa la carpeta de la imagen.
    $cadena = “/home/tgcistro/public_html/sigecoweb”.$newimage;
    seria:
    $cadena = “/home/tgcistro/public_html/sigecoweb/”.$newimage;

    angel_q;1615923, hola amigos, alguien q me pueda ayudar a resolver el problema de cargar archivo desde un formulario ami servidor.

    espero q me ayuden.

    Warning: move_uploaded_file(../imagenes/marcas/maxterhosting_08.gif): failed to open stream: Permission denied in /home/tgcistro/public_html/sigecoweb/webmaster/mprocesarm.php on line 35

    Warning: move_uploaded_file(): Unable to move ‘/tmp/phpIHQ6Ar’ to ‘../imagenes/marcas/maxterhosting_08.gif’ in /home/tgcistro/public_html/sigecoweb/webmaster/mprocesarm.php on line 35

    esto es el codigo q he realizado…

    < ?php
    $ruta_logo_name = $HTTP_POST_FILES['ruta_logo']['name'];
    $ruta_logo_type = $HTTP_POST_FILES['ruta_logo']['type'];
    $ruta_logo_size = $HTTP_POST_FILES['ruta_logo']['size'];
    $ruta_logo= $HTTP_POST_FILES['ruta_logo']['tmp_name'];
    $newimage = sprintf (“/imagenes/marcas/%s”, $ruta_logo_name);
    $cadena = “/home/tgcistro/public_html/sigecoweb”.$newimage;
    $link=conectarse();
    if (!(mysql_query(“insert into marca (nombre,logo,url,id_empresa) values (‘$nombre’,'$newimage’,'$url’,'$id_empresa’)”,$link)))
    {
    echo “error :”.mysql_error();
    exit();
    }
    if (!((strpos($ruta_logo_type, “gif”) || strpos($ruta_logo_type, “jpeg”)) && ($ruta_logo_size < 100000))) {
    echo “La extensión o el tamaño de los archivos no es correcta.

  3. Se permiten archivos .gif o .jpg
  4. se permiten archivos de 100 Kb máximo.
  5. “;
    }else{

    if (move_uploaded_file($ruta_logo, $cadena)){
    echo “El archivo ha sido cargado correctamente.”;
    }else{
    echo “Ocurrió algún error al subir el fichero. No pudo guardarse.”;
    }
    }

    gracias …

    Responder
  6. Jose

    No funciona bien el script.

    Responder
  7. Marcos

    No es tan sencillo al final de cuentas…
    no hayo somo solucionar este error:
    failed to open stream :…..

    Responder
  8. Juan Pablo

    No sirve para nada,

    Responder
  9. sito

    Da errores, no se, antes de publicar una cosa pues ay k asegurarse k vaya.

    Responder
  10. yo

    que chafa script no sirve

    Responder
  11. Muchas gracias por esto, la verdad es que adaptandolo un poco me ha servido de mucho.

    GRACIAS DE NUEVO

    Responder
  12. Eduardo

    Muy bien amigo gracias,me funciona corectamente bien,si posoble podria explicar la creacion de un libro de visitas,saludos cordiales

    Responder
  13. norvik

    la verdad no entendi nada xq no entiendo nada de php. alguien me puede explicar, mandar ejemplos,
    msn: norvik1@hotmail.com
    pregunta ¿sirve en geocities?

    Responder
  14. cardigan

    me da este error: failed to open stream: Permission denied , es solo cuestion de chmod???

    gracias.

    Responder
  15. mauri

    a mi me dice lo mismo
    que sera
    me da este error: failed to open stream: Permission denied , es solo cuestion de chmod???

    Responder
  16. el q + sabe

    menuda escoria de codigo

    se supone que esto hace uploads , menuda chapuza de mierda
    Lo que quiere la gente es poder seleccionar varios archivos de una sola vez, no tener que seleccionarlos de uno en uno
    Me parece una puta mierda que deberias de eliminar
    Esto solo les vale a los principiantes

    Responder
  17. Gaby

    Me salvaron la vida…. Gracias

    Responder
  18. Gaby

    Solo una pregunta a ver si alguien me puede ayudar… si tengo una ruta especifica, se en donde se encuentra el archivo, por ejemplo c:\archivo\prueba.zip como le hago para dejarlo fijo?. Gracias

    Responder
  19. Jorge Soto

    BUENA LA AYUDA… ME SIRVIÓ DE MUCHO PARA ACLARAR MIS CONCEPTOS

    Responder
  20. chustens

    Buenas:

    Me vale por ahora, pero necesito guardar el nombre, y sólo el nombre del archivo en una base de datos (lo digo porque me guarda todo el path de donde se encuentra el archivo, y eso no me vale). ¿Cómo depuro la entrada del archivo hasta quedarme con el nombre y la extension del archivo?Gracias

    Responder
  21. Pedro

    Hola, esta explicación me ayudo bastate con lo que tenia que hacer esta muuuuuyyyy buena

    Responder
  22. phpero

    me sale este error: el formato de archivo no es valido, solo .zip, como que nunca esta entrando a if($extension[$num] == “zip”), y el archivo si es un .zip; otra duda, la variable $archivo_name la tengo que cachar con $_POST ???

    Responder
  23. Dieum

    Puse esta ayuda y no tardaron mucho y me hackearon el sitio, ahora por un contrato deley necesito subir imagenes y no se como hacerlo que sea seguro sin hackeadas pueden ayudarme

    Santiago Borja
    Ecuador

    Responder
  24. Manuel Rojas

    hola., disculpa, hice un cambio en tu codigo, para insertar imagenes, en lugar de zip coloqué jpg, JPG pero no me acepta las imagenes que tiene como extension JPG… y no entiendo porque… me podrias ayudar o dar algun dato?

    Responder
  25. ESPERANZA

    Deseo conocer sobre las velocidades. Nose si 500K es mayor que 10,0 mbps

    Responder
  26. Diego

    Hola, quisiera sabes como se hace algo al estilo de esta pagina http://www.subelo.net respondanme por mail a die_93@hotmail.com o a traves de mi pagina http://www.tumodeo.com.ar

    Responder
  27. Digital

    me aparece este error : Parse error: syntax error, unexpected ‘{‘ in /var/www/archivos/subir.php on line 18… soy novato en esto..que estoy haciendo mal?

    Responder
  28. ANGEL

    Al parece como dice el mensaje solo es un error de sintaxis talves un punto y como que te falto poner al final de alguna asignacion de variables bueno espero haberte ayudado cualquier consulta haganlo en mi mail: angel@adelhost.com

    Responder
  29. Alsaciano

    a “el q + sabe”:
    Si alguien pierde el tiempo y se toma la molestia de forma altruista de poner un código y explicarlo para compartir conocimentos, lo menos que puedes hacer es darle las gracias.
    Y SI EL CÓDIGO SÓLO SUBE UN FICHERO, PUES YA QUE ERES EL QUE MÁS SABE, HACES TÚ LA RUTINA PARA SUBIR VARIOS FICHEROS.
    Un respeto para el autor, que NO tiene obligación ninguna de hacer esto.

    Responder
  30. javier

    cuando subo un archivo al servidor me sale este error mi pregunta es si no tengo permiso para subir un archivo al servidor???
    Warning: copy(/var/www/PRISMA/WEB/borrar.php) [function.copy]: failed to open stream: Permission denied

    Responder

Deja tu Comentario

Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.



Acerca de

Maestros del Web nace cuando intentamos traducir Webmaster al Español. Nacimos orientados al diseño y desarrollo web. Hoy somos un espacio de apoyo para los entusiastas que participan en proyectos en la red.
Leer más de Maestros del Web