Cargar archivos con php

 - [root@Linux th3r0rn]# ./header


Cargar archivos con php

Por th3r0rn | 23 de September de 2009 | 3 comentarios

Hola, ya estoy de regreso, ahora vamos a ver como se cargan archivos con PHP.
Esto muchas personas pueden pensar que es muy dificil, pero esto no es del todo cierto, PHP es un lenguaje de programacion preferido por muchos webmasters debido a su simplicidad y eficacia para la elaboracion de aplicaciones webs en tan poco tiempo.
Muy bien, en primero tenemos vamos a ver paso a paso como se hace esto de una forma muy simple y otra un poco mas elaborada.
En primero tenemos que tener nuestro formulario en html para enviar nuestro archivo al script que lo procesara en el servidor:
[cc lang="html"]

File to upload



[/cc]

Bien, como podemos ver no es nada dificil, es un simple formulario en html que nos permite cargar el archivo y mediante el metodo POST lo mandamos a sube.php, dicho script que procesara el archivo en nuestro servidor:
sube.php
[cc lang="php"]
$file=$_FILES["file"]["tmp_name"];
$name=$_FILES["file"]["name"];
move_uploaded_file($file,"ficheros/$name");
echo"uploadedd";
?>
[/cc]
Bien, este es el script que sube nuestros archivos al servidor, lo explocare detalladamente:
En primero creamos una variable llamada $file a la cual le asignamos el valor de la matriz $_FILES["file]["tmp_name"];
es decir, al igual que $_POST, $_FILES es una matriz que en este caso toma el elemento “file” el cual estamos enviando mediante nuestro html:
[cc lang="html"]
<-- observe la propiedad name, le he asignado el nombre file por lo cual mi matriz al declararla la declaro [/cc]$_FILES["file"]
si en mi html en lugar de tener el nombre file pusiera un nombre como por ejemplo:
[cc lang="html"]
[/cc], llamaria a mi matriz:
$_FILES["ARCHIVO"]["tmp_name"];
Ahora bien, que es ["tmp_name"] ???

Bueno, observe la siguiente tabla de propiedades:
error: Indica si se ha producido un error en el envio de fichero. Si todo ha ido correctamente, esta propiedad almacena el valor 0. Si se ha producido un error el valor es 1.

name: El nombre del archivo, tal como lo tiene almacenado el usuario en su disco duro.

tmp_name: Es el nombre temporal que usa PHP para la gestion provisional del archivo, hasta que lo almacene en disco del servidor, lo envie por correo electronico a donde corresponda, o cualquier otra accion que le hayamos programado al script.

type: Almacena el tipo de archivo que se ha enviado. Puede ser imagem,audio.video,text plano etc…

size: El peso del archivo en Bytes

Ok, entonces quedamos que en primero, creamos una vairable llamada $file que toma como nombre el valor enviado por el script el cual es file y toma la propiedad tmp_name como elemento para poder procesar con ese nombre temporal el archivo
seguido de esto creamos una variable llamada name:
[cc lang="php"]$name=$_FILES["file"]["name"];
[/cc]
en esta variable almacenamos el nombre del archivo que el usuario envia al servidor, es decir. si el usuario envia un archivo llamado foto.jpg
esa variable al imprimirla
echo”$name”; imprimiria en pantalla el nombre del archivo que el usuario envia es decir: foto.jpg
Bien, despues de eso tenemos:
[cc lang="php"]move_uploaded_file($file,”ficheros/$name”)
[/cc]
Muy bien, seguro te estaras preguntando que diablos es move_upload_file
move upload_file es una funcion nos permite guardar los archivos en nuestro servidor. Recibe dos argumentos separados por coma, el primero corresponde a la propiedad tmp-name del archivo subido y el segundo coresponde al nombre con el que se grabara dicho archivo en el servidor, incluyendo la ruta.
En este caso es muy simple entonces observemos nuevamene:
[cc lang="php"]move_uploaded_file($file,”ficheros/$name”)
[/cc]
Tal como explico anteriormente esta funcion recibe dos argumentos, el primero es la pripiedad tmp-name la cual he almacenado anteriormente en la variable $file, seguido de esto, ingreso el otro argumento el cual es el nombre del archovo incluyendo la ruta donde quiero que se guarde. es decir “fiechros/$name”
donde ficheros es el directorio donde quiero que se almacene el archivo y donde $name es la variable que almacena la propiedad name es decir, que se grabara con el nombre tal cual lo envie el usuario, osea que si envio una foto llamada foto.jpg en mi servidor se grabara con dicho nombre. Es necesario que para poder guardar este archivo ya tengamos creado nuestro directorio ficheros donde guardare mi archivo enviado.
Despues de esto despliego el mensaje de que el archivo se ha grabado correctamente
[cc lang="php"]echo “File uploaded”;
[/cc]
Bien, con este simple script ya podemos nuestros ususarios podran subir archivos al servidor en cualquier formato, ya sean videos, imagenes, textos planos, documentos etc..
Pero este tipo de script representa un riesgo a la seguridad, es decir, con este simple script un usuario con malas intenciones nos podria subir una shell en php que le permitan al atacante ejecutar comandos dentro de nuestro servidor y tomar control del mismo, pudiendo colocar un sniffer para capturar todo el trafico de nuestra red o bien poder modificar nuestras paginas webs etc…
Para solucionar esto podriamos hacer un scrip un poco mas elaborado con algunas restrincciones como el que muestro a continuación:
[cc lang="php"]
if

($_FILES["fichero"]["type"]!="image/jpeg")
{
die("the format is not suitable,the format permitted is jpg");
}

elseif
($_FILES["fichero"]["size"]>=1745137) {

die(“File very large, The maximun size permitted is 1745137 Bytes!”);
}

$fichero=$_FILES["fichero"]["tmp_name"];
$nombre=$_FILES["fichero"]["name"];
echo”“; // Show Image
if
(@move_uploaded_file($fichero,”ficheros/$nombre”)) //Save Image
{
echo”File uploaded”;
}
else
{
echo”Could not load file”;

}

?>
[/cc]
Bien, en primero lo que buscamos en este script es que solo almacene archivos que esten en formato .jpg y que cuyo tamaño no sea igual o mayor a los 1745137 Bytes.
Lo que hacemos en primer lugar es emplear un if que compruebe si el archivo que envio este en formato jpg:
[cc lang="php"]if

($_FILES["fichero"]["type"]!=”image/jpeg”)
{
die(“the format is not suitable,the format permitted is jpg”);
}
[/cc]
Como vemos, hacemos uso de la propiedad type para indicarle por medio de un if que si el archivo que envio el usuario esta en otro formato que NO SEA .jpg ejecute las instrucciones que se encuentran entre las llaves:
[cc lang="php"] {
die(“the format is not suitable,the format permitted is jpg”);
}[/cc]
Bien, como vemos, la instrccion que se encuentra entre las llaves imprimiria el mensaje al usuario de que el formato en el que lo envio no esta permitido y que el formato permitido es jpg.
Seguramente te estaras preguntando pero por que ese mensaje lo muestras con esa funcion llamada die y no con un simple echo? Simple, la funcion die lo que hace es terminar con la ejecucion del script de manera que lo que sigue despues de esa funcion no se ejecutara, es decir, die recibe como argumente una cadena de texto la cual sirve para avisarle al usuario que la accion no se pudo completar y seguido de mostrar este mensaje, esta funcion detendra por completo la ejecucion del script de modo que lo que hay despues de esas llaves no se ejecutara ;).
Despues tenemos un elseif:
[cc lang="php"]elseif
($_FILES["fichero"]["size"]>=1745137) {

die(“File very large, The maximun size permitted is 1745137 Bytes!”);
}[/cc]
Aqui comprobamos por medio de la propiedad size que el archivo no sea mayor o igual a los 1745137 Bytes, si el archivo es mayor o igual a los 1745137 Bytes entonces detendremos la ejecución del script no sin antes mostrarle el mensaje al usuaio de que el archivo es muy grande y que el tamaño maximo permitido es de 1745137 Bytes!.
Despues de esto tenemos:
[cc lang="php"]$fichero=$_FILES["fichero"]["tmp_name"];
$nombre=$_FILES["fichero"]["name"];[/cc]
Aqui creo que esta mas que claro, creamos 2 variables, la primera llamada $fichero a la cual como valor le asignamos la matriz FILES que tiene almacenado como elemento a la propiedad tmp_name. La segunda variable llamada $nombre de igual forma asignamos la matriz FILES donde tiene almacenado como valor el nombre del archivo exacto.
Posteriormente lo que hago es mostrar la foto que hemos cargado, algo parecido a lo que hacen los de http://imageshack.us :
[cc lang="php"]echo”“; // Show Image
[/cc]
Aqui como vemos lo muestro con un echo, en el cual ejecuto instrucciones en html usando la funcion img la cual pongo como valor en su src la variable el directorio fiecheros segudi del nombre del archivo que he cargado, entonces si yo cargara una foto llamada ALICIA.JPG en el interprete de html regresado por el servidor esto se veria asi: [cc lang="html][/cc]
Esto por que estoy mostrando la foto que he cargado y que se encuentra almacenada en el directorio ficheros con el nombre que la he cargado llamado ALICIA.JPG
Despues tenemos:
[cc lang="php"]
if
(@move_uploaded_file($fichero,”ficheros/$nombre”)) //Save Image
{
echo”File uploaded”;
}
else
{
echo”Could not load file”;

}
[/cc]
observemos que he puesto un if esto por que? pues por que la funcion move_upload_file() devuelve un valor logico true si ha podido grabar el archivo adecuadamente en el servidor y un valor false si no se ha podido grabar. Es por esto que he empleado el uso de un IF, tambien nos estaremos preguntando por que diablos he puesto un @ antes de la funcion? bien, esto es por que al anteponer este operador, lo que le estamos diciendo al interprete es que si esta funcion da un error, no lo muestre y continué con la ejecucion del script.
seguido de este mostramos un mensaje avisándole al usuario de que el archivo se cargo correctamente y en caso contrario le avisamos lo contrario.
Como vemos no es nada complicado, lo complicado es la manera en la que lo explico :( pero realmente no tiene nada de dificil.
Saludos!


Deja un comentario :)

3 opiniones

Comparte tu opinión

16 de November de 2009
a las 22:31

Alberto:

Hola, estuvo bueno, pero una pregunta… ¿cómo podría hacer para guardar la ruta del archvio que subí al servidor a una base de datos mySQL?

17 de November de 2009
a las 1:34

th3r0rn:

Hola alberto, pues mira muy facil, lo que tienes que hacer es crear una variable con el nombre del directorio por ejemplo $directorio=”fotos/”;
despues de que hayas cargado el archivo, lo que tienes que hacer es concatenar esta variable con el nombre del fichero: $RutaCompleta=$dir.$fichero;
esto daria como resultado si la variable $fichero vale “foto.jpg, el siguiente resultado:
fotos/foto.jpg
Ya que tienes esto lo unico que tienes que hacer es guardar la variable $RutaCompleta que es la que contiene como valor la ruta completa ya que has concatenado las variables del archivo con la del directorio. solo tendrias que hacer el insert:
INERT INTO fotos(mitabla)values($RutaCompleta) etc…..
Saludos

15 de August de 2010
a las 8:11

Edgard:

como hago para cargar un archivo mp3, no me funciona el codigo, no me captura el tamaño del archivo, lo extraño es que el nombre si lo captura, ayuda por favor


Comparte tu opinión

Los campos marcados con * son obligatorios



Sobre nosotros

Diseño basado en MilBits