Autor Tema: [!] Upload de archivos en PHP by Focux.  (Leído 2726 veces)

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
[!] Upload de archivos en PHP by Focux.
« en: 18 de Noviembre de 2009, 22:04:48 pm »
Bueno, he visto mucha gente que no sabe hacer simples upload con php y quise preparles este manual para usteds.  :-[

Primeramente vamos a comenzar con la parte HTML, que es el formulario.
Citar
<form method="post" action="subir.php" enctype="multipart/form-data">
<
input type="file" name="subir"/>
<
input type="submit" name="ok"/>
<
form/>

Ahora en la parte php utilizaremos un array que php nos cede para ver las propiedades de los archivos, es el array $_FILES.
Citar
$_FILES['subir']['name'] //Devuelve el nombre del archivo
$_FILES['subir']['size'] //Devuelve el tamaño del archivo en bytes.
$_FILES['subir']['type'] //Devuelve el tipo de archivo que es, ejemplo como image/png
$_FILES['subir']['tmp_name'] //Devuelve el nombre del archivo temporal que se subira al servidor.

Ahora, ya que les explique el array $_FILES, vamos a proceder con el source en php.
<?
if(isset(
$_FILES[&#39;subir&#39;])){
if(in_array(NULL$_POST)){ //Verificamos si dejo un campo vacio
exit("No haz seleccionado ninguna imagen");
}
$tamaño $_FILES[&#39;subir&#39;][&#39;size&#39;];
$tamañomaximo 1000//Aqui pon el tamaño maximo que quieres en tu servidor.
if($tamaño $tamañomaximo){ //Verificamos si traspaso los limite de tamaño
exit("Tu archivo a traspaso el limite permitido");
}
$carpeta "log/"//Directorio donde se va a guardar.
$nom $carpeta.sha1_file($_FILES[&#39;subir&#39;][&#39;tmp_name&#39;]).$_FILES[&#39;subir&#39;][&#39;name&#39;];
$nombre = (file_exists($carpeta."/".$_FILES[&#39;subir&#39;][&#39;name&#39;])) ? $nom : $carpeta."/".$_FILES[&#39;subir&#39;][&#39;name&#39;]; //Comprobamos si el archivo existe
echo (@copy($_FILES[&#39;subir&#39;][&#39;tmp_name&#39;],$nombre) ? &#39;Subido con exito&#39; : &#39;Error al subir el archivo&#39;); //Comprobamos si se subio con exito
}
?>


Bueno ese fue el codigo, esta sin provar ya que no estoy en mi casa, desde que llege a mi casa pruebo y si hay errores corrigo.
« Última modificación: 30 de Diciembre de 2009, 17:37:38 pm por Focux »
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Comunidad PHPeros

[!] Upload de archivos en PHP by Focux.
« en: 18 de Noviembre de 2009, 22:04:48 pm »

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #1 en: 18 de Noviembre de 2009, 23:15:20 pm »
revisa los operadores ternarios ... y '$nom' ??? eso imprimiria $nom., no la variable

Desconectado mr.despistado

  • PHPero Avanzado
  • ****
  • Mensajes: 444
  • Karma: 3
  • Sexo: Masculino
  • Busco programadores
    • Ver Perfil
    • Xti
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #2 en: 18 de Noviembre de 2009, 23:37:22 pm »
:bstar:
Citar
<form action="upload" method="post" action="subir.php" enctype="multipart/form-data"/>
<
input type="file" name="subir"/>
<
input type="submit" name="ok"/>
<
form/>


:star: Hay un error supongo que sera en lo de:
Citar
enctype="multipart/form-data"
porque no se crea el form :S


:rstar: Edito 1: A que carpeta/directorio se subirían los archivos? al mismo en el que están los php?
:bstar: Edito 2: Al parecer el "form" si se crea pero en el dreamweaver sale como si estuviera roto (resaltado en amarillo) y en el subir.php da el siguiente error:
Citar
Parse error: syntax error, unexpected T_STRING in /home/a3243289/public_html/fotos/subir.php on line 12

:star: Otro fallo es que al darle a enviar consulta te dice que el archivo php no existe (error 404 según el host que tengamos) cuando el archivo subir.php en este caso esta en la misma carpeta que el agregar.php segun los nombres que yo puse:
Agregar.php: Codigo 1
Subir.php: Codigo 2
« Última modificación: 18 de Noviembre de 2009, 23:53:25 pm por mr.despistado »
Dudas con tus programaciones? Envíame un MP con tu email y hablamos.

Desconectado TheGeorge

  • PHPero Avanzado
  • ****
  • Mensajes: 351
  • Karma: 13
  • Sexo: Masculino
    • Ver Perfil
    • websources
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #3 en: 19 de Noviembre de 2009, 00:50:41 am »
Es por el action del form. que no tiene la extension del archivo. Saludos
¡Solo sé, que nada sé...!

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #4 en: 19 de Noviembre de 2009, 02:50:17 am »
:bstar:

:star: Hay un error supongo que sera en lo de:porque no se crea el form :S


:rstar: Edito 1: A que carpeta/directorio se subirían los archivos? al mismo en el que están los php?
:bstar: Edito 2: Al parecer el "form" si se crea pero en el dreamweaver sale como si estuviera roto (resaltado en amarillo) y en el subir.php da el siguiente error:
:star: Otro fallo es que al darle a enviar consulta te dice que el archivo php no existe (error 404 según el host que tengamos) cuando el archivo subir.php en este caso esta en la misma carpeta que el agregar.php segun los nombres que yo puse:
Agregar.php: Codigo 1
Subir.php: Codigo 2
Disculpen, ya arregle el codigo, como dijo west me faltaron unas comillas simples en los operadores ternarios, tambien puse para que puedan elegir el directorio en el cual van a guardar el archivo.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado Tope

  • PHPero Experto
  • *****
  • Mensajes: 540
  • Karma: 23
  • Sexo: Masculino
  • Programador PHP
    • Ver Perfil
    • www.Info-Keko.Es
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #5 en: 19 de Noviembre de 2009, 11:37:40 am »
Citar
$carpeta "lol/"//Directorio donde se va a guardar.
$rand mt_rand(1000,9000); //Generamos un numero aleatorio del 1000 al 9000
$nom $rand.$carpeta.$_FILES[&#39;subir&#39;][&#39;name&#39;];
$nombre = (file_exists($_FILES[&#39;subir&#39;][&#39;name&#39;])) ? &#39;&#39;.$nom.&#39;&#39; : &#39;&#39;.$_FILES[&#39;subir&#39;][&#39;name&#39;].&#39;&#39;; //Comprobamos si el archivo existe

Eso hace que cada vez que subas un archivo, se cree una carpeta, con lo cual con el tiempo podremos llegar a tener 9000 carpetas creadas y que incluso no se suban los archivos porque ya existe otro con otro nombre.

Sería así: 3924lol/casa.jpg - 1938lol/coche.jpg - 2534lol/perro.jpg (es un error y una tonteria)

Entiendo que es un error, que querrías haber puesto $carpeta.$rand.$_FILES... para que fuera lol/1938_coche.jpg y todo eso.

Aunque no entiendo la complicación de hacer rands tontamente cuando no es mejor calcular el hash (un identificador único que no se repite) y darle ese nombre?

Además:
En el file_exists no has indicado la ruta de la carpeta y además tampoco le has puesto el rand delante.

Lo ideal sería
Citar

$carpeta 
"lol/"//Directorio donde se va a guardar.
$nombre $carpeta.sha1_file($_FILES[&#39;subir&#39;][&#39;tmp_name&#39;]); // Calculamos el HASH SHA1 del archivo subido

Y eso nunca falla ;)

Pd. Cuidado con las Ñ en el nombre de las variables
Un Saludo, Tope >> Programador FIJO en PHPeros

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #6 en: 19 de Noviembre de 2009, 15:24:36 pm »
Los operadores siguen mal... deberian ser:


$nombre 
= (file_exists($_FILES[&#39;subir&#39;][&#39;name&#39;]) ? $nom : $_FILES[&#39;subir&#39;][&#39;name&#39;]); // comprobamos si el archivo existe
echo (@copy($_FILES[&#39;subir&#39;][&#39;tmp_name&#39;], $nombre) ? &#39;Subido con exito&#39; : &#39;Error al subir el archivo&#39;); // Comprobamos si se subio con exito


Y el form deberia ser asi:
Código: [Seleccionar]
<form method="post" action="subir.php" enctype="multipart/form-data">
<input type="file" name="subir"/>
<input type="submit" name="ok"/>
</form>

donde subir.php es tu URL del PHP

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #7 en: 19 de Noviembre de 2009, 15:28:41 pm »
Yo tengo un upload de archivos en PHP , si quereis me lo pedís. Además lista las imagenes subidas :)

Suerte Focux :D

#Fdo. Physlet

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #8 en: 19 de Noviembre de 2009, 19:20:49 pm »
Los operadores siguen mal... deberian ser:


$nombre 
= (file_exists($_FILES[&#39;subir&#39;][&#39;name&#39;]) ? $nom : $_FILES[&#39;subir&#39;][&#39;name&#39;]); // comprobamos si el archivo existe
echo (@copy($_FILES[&#39;subir&#39;][&#39;tmp_name&#39;], $nombre) ? &#39;Subido con exito&#39; : &#39;Error al subir el archivo&#39;); // Comprobamos si se subio con exito


Y el form deberia ser asi:
Código: [Seleccionar]
<form method="post" action="subir.php" enctype="multipart/form-data">
<input type="file" name="subir"/>
<input type="submit" name="ok"/>
</form>

donde subir.php es tu URL del PHP
Los operadores ternarios funcionan de las dos formas, pero lo pondre como dices. En el form no me di cuenta que puse dos action.
Yo tengo un upload de archivos en PHP , si quereis me lo pedís. Además lista las imagenes subidas :)

Suerte Focux :D
Si yo hago un sistema de upload lo manejaria por sql, ya que para mi es más fácil de manejar. No le agrego tantas aplicaciones porque es con fines de aprendisaje y es para novatos.
Eso hace que cada vez que subas un archivo, se cree una carpeta, con lo cual con el tiempo podremos llegar a tener 9000 carpetas creadas y que incluso no se suban los archivos porque ya existe otro con otro nombre.

Sería así: 3924lol/casa.jpg - 1938lol/coche.jpg - 2534lol/perro.jpg (es un error y una tonteria)

Entiendo que es un error, que querrías haber puesto $carpeta.$rand.$_FILES... para que fuera lol/1938_coche.jpg y todo eso.

Aunque no entiendo la complicación de hacer rands tontamente cuando no es mejor calcular el hash (un identificador único que no se repite) y darle ese nombre?

Además:
En el file_exists no has indicado la ruta de la carpeta y además tampoco le has puesto el rand delante.

Lo ideal sería
Y eso nunca falla ;)

Pd. Cuidado con las Ñ en el nombre de las variables
Me equivoque con la carpeta xddd. Otra cosa, como es eso de sha1_file()
« Última modificación: 19 de Noviembre de 2009, 19:31:58 pm por Focux »
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado Tope

  • PHPero Experto
  • *****
  • Mensajes: 540
  • Karma: 23
  • Sexo: Masculino
  • Programador PHP
    • Ver Perfil
    • www.Info-Keko.Es
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #9 en: 19 de Noviembre de 2009, 20:01:34 pm »
Explicación de sha1_file(), concretamente calcular HASH de un archivo.

Supongo que sabreís que es SHA1 y MD5... no me detengo en esto.

Con las funciones sha1_file y md5_file, podremos calcular el HASH ÚNICO del archivo en sha1 o en md5 respectivamente.

Cada archivo tiene un hash único: entre lo que ocupe, la fecha de creación, modificación, contenido y miles de cosas más se calcula, por ejemplo si es un archivo HTML y luego le añadimos por ejemplo "<br />", GUARDAMOS, quitamos el <br /> y volvemos a guardar, el hash ya no es el mismo ;)
Un Saludo, Tope >> Programador FIJO en PHPeros

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #10 en: 19 de Noviembre de 2009, 20:56:34 pm »
Entendido, pero, Cuál es más eficaz de md5_file y sha1_file.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado mr.despistado

  • PHPero Avanzado
  • ****
  • Mensajes: 444
  • Karma: 3
  • Sexo: Masculino
  • Busco programadores
    • Ver Perfil
    • Xti
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #11 en: 19 de Noviembre de 2009, 21:35:14 pm »
 :bstar: va hemos mejorado ahora solo falla en que suba la imagen que suba dice: Error al subir el archivo...
Dudas con tus programaciones? Envíame un MP con tu email y hablamos.

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #12 en: 19 de Noviembre de 2009, 21:54:15 pm »
:bstar: va hemos mejorado ahora solo falla en que suba la imagen que suba dice: Error al subir el archivo...
Eso debe ser porque pusiste una carpeta equivocada.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado mr.despistado

  • PHPero Avanzado
  • ****
  • Mensajes: 444
  • Karma: 3
  • Sexo: Masculino
  • Busco programadores
    • Ver Perfil
    • Xti
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #13 en: 19 de Noviembre de 2009, 22:02:22 pm »
Eso debe ser porque pusiste una carpeta equivocada.
nop... revise varias veces...
Dudas con tus programaciones? Envíame un MP con tu email y hablamos.

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:[!] Upload de archivos en PHP by Focux.
« Respuesta #14 en: 19 de Noviembre de 2009, 22:11:06 pm »
Fue que repeti la carpeta en el operador ternario, listo lo he probado y esta funcionando correctamente :D
« Última modificación: 19 de Noviembre de 2009, 23:00:14 pm por Focux »
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>