comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Ficheros en PHP

  • 0 Respuestas
  • 1231 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Xt3mP

  • *
  • Underc0der
  • Mensajes: 432
  • Actividad:
    0%
  • Reputación 0
  • Ellos me están buscando, pero yo los encontraré.
    • MSN Messenger - Xt3mP@h4x0rz.us
    • AOL Instant Messenger - Xt3mP@h4x0rz.us
    • Yahoo Instant Messenger - Xt3mP@h4x0rz.us
    • Ver Perfil
    • Xt3mP
« en: Agosto 13, 2010, 01:36:34 am »
Archivos.

¿Qué explicaré?
Carga de ficheros (Tanto permisos, nombre, tipo, tamaño, etc) y funciones acerca de archivos (copiar, mover, eliminar, crear, etc).

Quisiera comenzar explicando la diferencia entre $_FILES y $HTTP_POST_FILES.
Las dos son variables que contienen la misma información cuando se hace una carga a el script (en este caso, subir un archivo), pero la diferencia es que $HTTP_POST_FILES no es una variable "superglobal", con esto quiero decir que tál vez contenga la misma información del fichero pero no se puede acceder en todo el script a ella sin hacer global $fichero, por otro lado, $_FILES si es una "superglobal" que está disponible ó se puede acceder a ella durante y/ó en cualquier parte del script, y según leí (esto no lo tenía en cuenta) $_FILES esta disponible desde la versión 4.1.0 por lo que $HTTP_POST_FILES quedo completamente "nulled" en esas versiones.

Tomando de siempre de ejemplo en este caso el siguiente uploader:

Código: HTML5
  1. <No tienes permisos para ver links. Registrate o Entra con tu cuenta action="subir.php" method="post" enctype="multipart/form-data">
  2. <No tienes permisos para ver links. Registrate o Entra con tu cuenta>Archivo: </No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  3. <No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  4. <No tienes permisos para ver links. Registrate o Entra con tu cuenta name="fichero" type="file">
  5. <No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  6. <No tienes permisos para ver links. Registrate o Entra con tu cuenta type="submit" value="Enviar">
  7. </No tienes permisos para ver links. Registrate o Entra con tu cuenta>
  8.  

Comenzemos, las variables príncipales de $_FILES son las siguientes (noten que fichero es el nombre del input type por lo que en $_FILES el primer "valor del array" es el nombre del input, y como mencioné anteriormente, en este caso es fichero:
$_FILES['fichero']['tmp_name'] = Muestra el nombre "temporal" del archivo, puede ser parecido a phpC2.tmp, siempre varian.
$_FILES["fichero"]["name"] = Muestra el nombre original del archivo, en este caso muestra tutorial.txt.
$_FILES["fichero"]["type"] = Muestra el tipo del archivo, en este caso es text/plain pero hay image/jpeg, stream, etc, todo depende si es ejecutable, imagen, texto plano, script, entre otros.
$_FILES["fichero"]["size"] = Muestra el tamaño de archivo en bytes, pueden hacer una operación divisoria de / 1024 para ir convirtiendolo a kb, mb, gb, etc.
Código: PHP
  1. <?php
  2. echo $_FILES['fichero']['tmp_name']."<br />"; //Es el archivo temporal para subir al servidor
  3. echo $_FILES["fichero"]["name"]."<br />"; //Es el nombre del archivo a subir al servidor
  4. echo $_FILES["fichero"]["type"]."<br />"; //Es el tipo (mime) del archivo a subir al servidor
  5. echo $_FILES["fichero"]["size"]."<br />"; //Es el tamano (en bytes) del archivo a subir al servidor
  6. /*
  7. Nota: Puedes hacer $_FILES["fichero"]["size"] / 1024 para ir en escala de bytes, kb, mb, etc.
  8. Daria como resultado:
  9. C:\WINDOWS\Temp\phpC2.tmp => Temporal
  10. tutorial.txt => Nombre
  11. text/plain => Tipo (mime)
  12. 0 => Peso
  13. */
  14. ?>
  15.  

Como pudieron observar, esas son los valores del array $_FILES que se utilizan para hacer un uploader, solo tiene que coincidir el nombre del input con el del script (en este caso; fichero).

Para hacer la "copia" ó mejor dicho "mover" el archivo al lugar definitivo en donde se almacenará el fichero, se utiliza la función move_uploaded_file(); creo que el nombre lo dice todo.
move_uploaded_file() recibe dos parámetros, el primero es el nombre temporal del archivo a subir, y el segundo es en donde se almacenará, pueden notar que tengo una variable llamada $path que es donde indico a que carpeta subiré los archivos.

Ejemplo:

Código: PHP
  1. <?php
  2. $path = "files/";
  3. $temporal = $_FILES['fichero']['tmp_name'];
  4. $archivo = No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["fichero"]["name"]);
  5. if( (No tienes permisos para ver links. Registrate o Entra con tu cuenta($temporal,$path.$archivo))){
  6. echo "Archivo subido correctamente.";
  7. }else{
  8. echo "Hubo un error en la carga del archivo.";
  9. }
  10. ?>
  11.  

Aqui pueden utilizar simplemente $_FILES["fichero"]["name"] sin necesidad del basename ya que la funcion basename() solo vota el nombre de fichero.
-----------------------------------------------------------
Copiar un archivo
-----------------------------------------------------------
Para copiar un archivo se utiliza la función copy() que recibe dos parámetros, el fichero original y la ruta a donde se copiará, ejemplo (Tomando de ejemplo el archivo tutorial.txt que anteriormente subimos):
Código: PHP
  1. <?php
  2. $path = "files/";
  3. $archivo = No tienes permisos para ver links. Registrate o Entra con tu cuenta($_FILES["fichero"]["name"]);
  4. No tienes permisos para ver links. Registrate o Entra con tu cuenta($path.$archivo, $path."tutorial_copia.txt");
  5. /*
  6. Daria:
  7. files/tutorial_copia.txt
  8. */
  9. ?>
  10.  

Recuerden que para copiar un archivo se necesita "determinar" el directorio en donde se encuentra el archivo, inclusive se puede copiar de un directorio a otro.
-----------------------------------------------------------
Comprobar si un fichero/directorio existe
-----------------------------------------------------------
Esto les servirá muchos a aquellos que tengan su modulación digamos "index.php?page=home.php", que prácticamente se incluye la página que se obtiene por get y si no la filtran son vulnerables a RFI/LFI, si no tiene modulación igual funciona, existe una función llamada file_exists() que comprueba la existencia de un fichero, tiene un parámetros que por lógica deben suponer que se trata del archivo, en este caso comprobarémos la existencia del archivo "tutorial_copia.txt".
Código: PHP
  1. <?php
  2. if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("./files/tutorial_copia.txt")){
  3. echo "Si existe";
  4. }else{
  5. echo "No existe";
  6. }
  7. /*
  8. Devolveria:
  9. Si existe, pero si cambiamos tutorial_copia por loquesea.txt tiraria no existe porque en este caso no tenemos ese fichero en el servidor.
  10. */
  11. ?>
  12.  

Un ejemplo de la modulación con GET filtrando el archivo (ya que lo mencioné) sería:
Código: PHP
  1. <?php
  2. $pagina = No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta($_GET['page']));
  3. if (No tienes permisos para ver links. Registrate o Entra con tu cuenta($pagina)){
  4. include ($pagina);
  5. }else{
  6. echo "No intentes bugear, la pagina no existe, se envio un correo al administrador con tu IP";
  7. }
  8. ?>
  9.  
-----------------------------------------------------------
Crear un directorio
-----------------------------------------------------------
Para crear un directorio existe la función mkdir() en donde mk significa make/crear y dir es directory/directorio, para utilizar esta función se necesitan dos parámetros, el nombre del directorio y los permisos que tendrá el directorio.
Código: PHP
  1. <?php
  2. No tienes permisos para ver links. Registrate o Entra con tu cuenta("/dir", "0777");
  3. /*
  4. Daria:
  5. path_base/dir/ con permisos de escritura, lectura y ejecucion (0777).
  6. */
  7. ?>
  8.  

Aquí se puede utilizar la función "file_exists()" para comprobar si existe el directorio, ejemplo:
Código: PHP
  1. <?php
  2. if (No tienes permisos para ver links. Registrate o Entra con tu cuenta("./files")){
  3. echo "Si existe";
  4. }else{
  5. No tienes permisos para ver links. Registrate o Entra con tu cuenta("/files", "0777");
  6. }
  7. /*
  8. Daria:
  9. Si existe el directorio te da un aviso de que existe, si no existe lo crea con permisos de 0777.
  10. */
  11. ?>
  12.  
-----------------------------------------------------------
Revisar un directorio y contar archivos
-----------------------------------------------------------
Para ello utilizarémos 2 funciones, scandir() y count() , scandir() ocupa un parámetro (el directorio a escanear) y count ocupa igualmente un parámetro, lo que contará:
Código: PHP
  1. <?php
  2. $directorio = "files/";
  3. $contador = No tienes permisos para ver links. Registrate o Entra con tu cuenta($directorio);
  4. $total = No tienes permisos para ver links. Registrate o Entra con tu cuenta($contador);
  5. /*
  6. Si hacemos un var_dump() para mostrar todas los valores nos mostraría todos los archivos que existen en el directorio, en este
  7. caso solo existe 1 (tutorial.txt);
  8. */
  9. ?>
  10.  
Esto puede ser algo fácil al momento de querer saber que archivos estan en una carpeta determinada, pero casi no se utiliza.
-----------------------------------------------------------
Eliminar un archivo/directorio
-----------------------------------------------------------
Para eliminar un archivo se utiliza la función unlink(), y por otro lado, para eliminar un directorio se utiliza la función rmdir(), las dos funciones tienen un solo parámetros que es la dirección del archivo/directorio.
rmdir() solo permite borrar si el directorio esta vacío:

Código: PHP
  1. <?php
  2. $archivo = "tutorial.txt";
  3. $directorio = "files/";
  4. No tienes permisos para ver links. Registrate o Entra con tu cuenta($directorio); //En este caso no se eliminaría porque existe tutorial.txt
  5. No tienes permisos para ver links. Registrate o Entra con tu cuenta($directorio.$archivo); //Eliminamos files/tutorial.txt
  6. ?>
  7.  
Entonces, ¿Qué hacer si la carpeta no está vacía pero queremos eliminarla? Fácil, utilizamos la función scandir() y count() y la implementamos con un bucle for:
For: Es un bucle en donde a diferencia de foreach, indicamos el número de "ciclos" que se repetirá:

Código: PHP
  1. <?php
  2. $directorio = "files/";
  3. $files = No tienes permisos para ver links. Registrate o Entra con tu cuenta($directorio); //Escaneamos el directorio
  4. $num = No tienes permisos para ver links. Registrate o Entra con tu cuenta($files ); //Contamos el numero de archivos
  5. for ($i=0; $i<=$num; $i++) {
  6. @No tienes permisos para ver links. Registrate o Entra con tu cuenta ($directorio.$files [$i]); //Ponemos un @ al inicio para evitar mostrar error en pantalla.
  7. }
  8. @No tienes permisos para ver links. Registrate o Entra con tu cuenta ($directorio); //Ponemos un @ al inicio para evitar mostrar error en pantalla.
  9. ?>
  10.  
Que hacemos con el for:
Indicamos que mientras $i sea menor que el número de archivos, $i irá aumentando de uno en uno, prácticamente si el número de archivos es 1, sería $i=0; $i<=1; $i++, para eso es el bucle for, para indicarle cuantas veces se repetirá el ciclo. Entonces como no sabemos el número de archivos, los contamos con count() y se creará un array con el número total de archivos, así que al poner $files[$i] y anteriormente indicando en el bucle for que $i irá aumentando de uno en uno cada vez hasta que llegue al número de archivos, se eliminará de uno por uno los archivos. Despúes se elimina el directorio vacío.
-----------------------------------------------------------
Renombrar un archivo/directorio
-----------------------------------------------------------
Para renombrar un archivo/directorio utilizamos la función rename() en donde solo necesitamos dos parámetro; el nombre original y el nombre a cambiar.
Código: PHP
  1. <?php
  2. $file = "files/tutorial.txt";
  3. No tienes permisos para ver links. Registrate o Entra con tu cuenta ($file , "files/tutoriales_2.txt");
  4. ?>
  5.  
-----------------------------------------------------------
Comprobar permisos de archivo
-----------------------------------------------------------
Para comprobar los permisos de archivo (saber si es ejecutable, etc) utilizarémos tres funciones:
is_writable($archivo); = Comprueba si se puede escribir.
is_readable($archivo); = Comprueba si se puede leer.
is_executable($archivo); = Comprueba si se puede ejecutar.
-----------------------------------------------------------
Archivos de texto
-----------------------------------------------------------
Cabe mencionar que no solo se puede para archivos de texto, si no para html, php, etc, solo explicaré una función y las demás en comentarios porque creo que podrán entender perfectamente sin necesidad de que explique de una por una.
Comenzaré explicando los permisos de archivos.
Citar
'r' Solo lectura, ubicará el puntero al inicio de todo el archivo.
'r+'  Solo lectura y escritura, ubicará el puntero al inicio de todo el archivo.
'w' Solo escritura, si el archivo no existe intentará crearlo.
 'w+' Solo escritura y lectura, si el archivo no existe intentará crearlo
 'a' Solo escritura, ubicará el puntero al final de todo el archivo y si no existe intentará crearlo.
 'a+' Solo escritura y lectura, ubicará el puntero al final de todo el archivo y si no existe intentará crearlo.
 'x' Solo escritura, si el archivo ya existe devolverá un FALSE, si no existe intentará crearlo.
 'x+' Solo escritura y lectura, si el archivo ya existe devolverá un FALSE, si no existe intentará crearlo.

Ahora, para abrir un archivo se utiliza la función fopen() el cual recibe dos parámetros, el archivo a abrir y los permisos que le darémos, despues viene fwrite() quien igualmente recibe dos parámetros, el fopen y lo que se intentará escribir en el archivo, y finalmente viene fclose() que solo recibe un parámetro a diferencia de los otros dos, solo recibe el fwrite quien ya trae el fopen.
Código: PHP
  1. <?php
  2. $file = No tienes permisos para ver links. Registrate o Entra con tu cuenta("tutorial.txt", 'a+');
  3. No tienes permisos para ver links. Registrate o Entra con tu cuenta($file, "Este es un tutorial de PHP hecho por Xt3mP"); //Se puede utilizar fputs() hacen practicamente lo mismo.
  4. No tienes permisos para ver links. Registrate o Entra con tu cuenta($file)
  5. /*
  6. Daria:
  7. tutorial.txt
  8. Este es un tutorial de PHP hecho por Xt3mP
  9. */
  10. ?>
  11.  

Se pueden hacer saltos de línea pero podrás identificarlas con \n.
-----------------------------------------------------------
Bueno, esto ha sido todo por este tutorial, estoy un poco cansado y necesito fumar, cualquier error que haya tenido ó parecido favor de avisarme para acomodarlo.
Saludos.
« Última modificación: Marzo 27, 2014, 06:07:35 pm por Expermicid »
Cada vez que me das Karma me motivas

 

¿Te gustó el post? COMPARTILO!