Curso de PHP y MySQL
José Gómez Castaño
 

Excritura y Lectura de Ficheros

PHP proporciona una forma sencilla de manipulación del sistema de archivos. En muchas ocasiones es necesario crear un fichero en el servidor o leer su contenido, y por supuesto, eliminarlo. Además podría ser necesario crear o borrar directorio donde ubicar estos ficheros.

Lo primero a tener en cuenta a la hora de manipular directorios o ficheros es que la cuenta de usuario bajo la qeu se ejecuta el script php, debe tener permisos suficientes para realizar la tarea. En la mayoría de los casos, se estará ejecutando sobre un sistema operativo Linux. Antes de ejecutar el script hay que comprobar que los permisos sobre este directorio. En caso de estar ejecutándolo sobre un sistema Windows, no será necesario tener esta precaución.

A continuación vamos a explicar un pequeño script que nos permitirá crear un directorio, crear un fichero en su interior y escribir un contenido.

<?php

// Creamos el directorio
$directorio = "midirectorio";
mkdir($directorio,777);

// Abrimos el fichero en modo escritura
$fich = fopen($directorio."/"."fichero1.txt","w"); 

// Escribimos 100 líneas
for ($i = 1; $i <= 100; $i++){
	fputs($fich,"Esta es la linea ".$i."\n"); 
}

// Cerramos el fichero
fclose($fich); 

?>
 

Para manipular cualquier fichero la primera operación consiste en obtener una referencia al mismo. Eso lo conseguimos con la función fopen. La línea 5 proporciona esta referencia. Permite abrir el fichero para efectuar diferentes acciones sobre él, lo que descfribimos en el segundo parámetro de la función. Están disponibles las siguientes opciones:

  r Se abre en modo solo lectura y se coloca el puntero al principio
  r+ Se abre en modo lectura y escritura, colocándose el puntero al principio
  w Se abre en modo solo escritura. Si el fichero no existe se intenta crear
  w+ Se abre en modo lectura y escritura. Si el fichero no existe se intenta crear
  a Se abre en modo solo escritura y el puntero se coloca al final. Si el fichero no existe se intenta crear
  a+ Se abre en modo lectura y escritura y el puntero se coloca al final. Si el fichero no existe se intenta crear

A continuación haremos la lectura secuencial del fichero creado

<?php
// Abrimos el fichero en modo lectura
$fich = fopen($directorio."/"."fichero1.txt","r"); 

// Recorremos línea a línea y lo escribimos
while(!feof($fich)){ 

    $buffer = fgets($fich,4096); 

    echo $buffer."<BR>"; 
} 

// Cerramos el fichero
fclose($fich); 
?>
 

En este caso, como no conocemos la longitud del fichero, la lectura la hacemos mediante un bucle while, imponiendo la condición de que se siga leyendo hasta el final del fichero (eof).

Un modo más rápido de acceder en modo lecturta a un fichero es utilizar la función file_get_contents. Esta devuelve un estring con el contenido del fichero. En el ejemplo siguiente se muestra como utilizarla, almacenando el contenido de cada línea del fichero en un elemento de un array que después puede ser tratado. Este método es más rápido que el anterior, por contra el consumo de memoria es mayor también.

<?php

$nombreFichero = "fichero1.txt";

if (file_exists($nombreFichero)){

	$completo = file_get_contents($nombreFichero);
	$arrFilas = explode("\n",$completo);
	
	for ($i=0;$i < count($arrFilas); $i++){
		echo $arrFilas[$i]."\n";
	}
	
}

?>
 

Lectura de Hojas de Cálculo excel

Para la lectura de una hoja de cálculo XLS, es posible utilizar la clase php-excel-reader, que permite acceder a las celdas de una hoja de cálculo y obtener los valores y propiedades de las mismas. La documentación está disponible en http://code.google.com/p/php-excel-reader/

Upload de Ficheros

En el siguiente ejemplo vamos a utilizar un formulario y PHP para subir un fichero a nuestro servidor. En primer lugar debemos tener configurada la sección "File Uploads" de php.ini. La primera variable define si permitimos o no la subida de ficheros, la segunda la ubicación del fichero temporal donde se almacenarán y la tercera el tamaño máximo en Mb permitido. Este valor prevalece sobre el campo MAX_FILE_SIZE del formulario.

file_uploads = On
upload_tmp_dir = "c:/wamp/tmp"
upload_max_filesize = 4M

Por otra parte necesitamos un formulario en el que colocaremos un nuevo atributo enctype="multipart/form-data", lo que indica que se enviarán ficheros en el contenido del POST. El campo donde colocaremos el fichero debe ser un type="file", y además incluiremos un campo oculto indicando el tamaño máximo permitido para el fichero en bytes, como se ve en la línea 32.

<input type="hidden" name="MAX_FILE_SIZE" value="20000000">

<?php


if ($_POST[Enviar]){

	$nombre_archivo = "recibido.pdf";

	//compruebo si las características del archivo son las que deseo, estension PDF
	$tipo_archivo = $_FILES['Fichero']['type'];
	if (!(strpos($tipo_archivo, "pdf"))){
			echo "Solo se permite la subida de archivos PDF";
	}else{
		if (copy($_FILES['Fichero']['tmp_name'], $nombre_archivo)){
		   echo "El archivo ha sido cargado correctamente.";
		}else{
			echo "El archivo no se ha podido cargar.";
		}
	} 
}


?>

<html>
<head>
<title>Upload Ficheros</title>
</head>
<body>

Archivo
</body> </html>

El script PHP se ejecutará cuando hayamos enviado el formulario En la línea 6 indicamos el nombre con el que vamos a guardar nuestro fichero subido. El contenido el fichero llega por medio del POST en el array asociativo $_FILES[nombreCampoFichero].

Otras características que se pueden conocer el fichero son las siguientes

$_FILES[nombreCampoFichero]['name']
El nombre original del fichero en la máquina cliente.

$_FILES[nombreCampoFichero]['type']
El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podrá a ser "image/gif". Una lista de los tipos mime puede encontrarse en W3SCHOOL

$_FILES[nombreCampoFichero]['size']
El tamaño en bytes del fichero recibido.

$_FILES[nombreCampoFichero]['tmp_name']
El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

Tratamiento de XML con SimpleXML

PHP5 permite una forma sencilla de tratar contenidos xml mediante el uso de las funciones proporcionadas por SimpleXML. El uso de estas funciones permiten tanto leer como generar contenidos en este formato. XML es un lenguaje de marcado que pensado para el intercambio de datos. Está basado en las especificaciones del W3C, aunque tiene la posibilidad de dejar en manos del usuario, definir los tags necesarios, adaptándose a las necesidades de cada caso. Actualmente se utiliza en muchos ámbitos y existen especificaciones particulares como RSS, XBRL, WML, etc.

XML consiste en un fichero de texto plano. Esto presenta una ventaja importante a la hora de transmitirlo de un sistema a otro. Se puede incluir en una conversación SOAP para usarlo como medio de intercambio entre dos Servicios Web.

En este apartado vamos a practicar con las posibilidades de lectura y generación de un XML por medio de las funciones de PHP5. Partiremos de un xml de clientes sencillo


<?xml version="1.0"  encoding="UTF-8"?>

  
    Antonio
    Calle del sombrero
	25
  
  
    Carlos
    Avda de Gracia
	40
  


 

Ahora usamos SimpleXML para la lectura de los elementos

<?php

// Cargamos el fichero
$xml =  simplexml_load_file('simple.xml');

// acceder al primer id
echo $xml->cliente[id].'
'; // acceder a un elemento echo $xml->cliente->nombre.'
'; // recorremos los elementos y atributos foreach ($xml->cliente as $cliente){ echo $cliente->nombre.'
'; echo $cliente->direccion.'
'; echo $cliente->edad.'
'; echo $cliente[id].'
'; } ?>
Además de leer un XML podemos crearlo. Para ello vamos a usar la función SimpleXMLElement().
<?php

$newsXML = new SimpleXMLElement(""); 

$noticia = $newsXML->addChild('noticia'); 
$noticia->addAttribute("id","001");
$contenido = $noticia->addChild('contenido','contenido de la noticia'); 

echo $newsXML->asXML(); 

?>

 

En Oracle existe una información detallada sobre el tratamiento de ficheros XML para uso con la base de datos en Using PHP 5 with Oracle XML DB.

 

 

 
  • basename
  • chgrp
  • chmod
  • chown
  • clearstatcache
  • copy
  • delete
  • dirname
  • disk_ free_space
  • disk_total_space
  • diskfreespace
  • fclose
  • feof
  • fflush
  • fgetc
  • fgetcsv
  • fgets
  • fgetss
  • file_exists
  • file_get_contents
  • file_put_contents
  • file
  • fileatime
  • filectime
  • filegroup
  • fileinode
  • filemtime
  • fileowner
  • fileperms
  • filesize
  • filetype
  • flock
  • fnmatch
  • fopen
  • fpassthru
  • fputcsv
  • fputs
  • fread
  • fscanf
  • fseek
  • fstat
  • ftell
  • ftruncate
  • fwrite
  • glob
  • is_dir
  • is_executable
  • is_file
  • is_link
  • is_readable
  • is_uploaded_file
  • is_writable
  • is_writeable
  • lchgrp
  • lchown
  • link
  • linkinfo
  • lstat
  • mkdir
  • move_uploaded_file
  • parse_ini_file
  • parse_ini_string
  • pathinfo
  • pclose
  • popen
  • readfile
  • readlink
  • realpath_cache_get
  • realpath_cache_size
  • realpath
  • rename
  • rewind
  • rmdir
  • set_file_buffer
  • stat
  • symlink
  • tempnam
  • tmpfile
  • touch
  • umask
  • unlink
  • Creative Commons License
    Curso PHP y MySQL by José Gómez Castaño is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 España License.
    Based on a work at www.meridi.es/cursos/php.