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
  • 1190 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. <You are not allowed to view links. Register or Login action="subir.php" method="post" enctype="multipart/form-data">
  2. <You are not allowed to view links. Register or Login>Archivo: </You are not allowed to view links. Register or Login>
  3. <You are not allowed to view links. Register or Login>
  4. <You are not allowed to view links. Register or Login name="fichero" type="file">
  5. <You are not allowed to view links. Register or Login>
  6. <You are not allowed to view links. Register or Login type="submit" value="Enviar">
  7. </You are not allowed to view links. Register or Login>
  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 = You are not allowed to view links. Register or Login($_FILES["fichero"]["name"]);
  5. if( (You are not allowed to view links. Register or Login($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 = You are not allowed to view links. Register or Login($_FILES["fichero"]["name"]);
  4. You are not allowed to view links. Register or Login($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 (You are not allowed to view links. Register or Login("./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 = You are not allowed to view links. Register or Login(You are not allowed to view links. Register or Login($_GET['page']));
  3. if (You are not allowed to view links. Register or Login($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. You are not allowed to view links. Register or Login("/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 (You are not allowed to view links. Register or Login("./files")){
  3. echo "Si existe";
  4. }else{
  5. You are not allowed to view links. Register or Login("/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 = You are not allowed to view links. Register or Login($directorio);
  4. $total = You are not allowed to view links. Register or Login($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. You are not allowed to view links. Register or Login($directorio); //En este caso no se eliminaría porque existe tutorial.txt
  5. You are not allowed to view links. Register or Login($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 = You are not allowed to view links. Register or Login($directorio); //Escaneamos el directorio
  4. $num = You are not allowed to view links. Register or Login($files ); //Contamos el numero de archivos
  5. for ($i=0; $i<=$num; $i++) {
  6. @You are not allowed to view links. Register or Login ($directorio.$files [$i]); //Ponemos un @ al inicio para evitar mostrar error en pantalla.
  7. }
  8. @You are not allowed to view links. Register or Login ($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. You are not allowed to view links. Register or Login ($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 = You are not allowed to view links. Register or Login("tutorial.txt", 'a+');
  3. You are not allowed to view links. Register or Login($file, "Este es un tutorial de PHP hecho por Xt3mP"); //Se puede utilizar fputs() hacen practicamente lo mismo.
  4. You are not allowed to view links. Register or Login($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!