Enrera
Mòdul 7
Creació i gestió d'entorns web dinàmics (PHP)
  Pràctica
1
2
3
4
   
Exercicis
Exercicis
 
 

 

  Treball amb fitxers
   
 

En aquest pràctica treballarem amb fitxers:

  • Veurem com obrir-los i modificar-los creant un petit comptador de visites.
  • Crearem un formulari que ens permetrà enviar un fitxer al servidor de manera transparent per a l'usuari.
   
Comptador de visites
   
Pràctica

Crearem un comptador de visites simple que a cada entrada a la pàgina mostri el nombre de visitants. Aquest valor quedarà emmagatzemat en un fitxer de text.

Primerament, cal que creem aquest fitxer de text, amb la llibreta del Windows, per ex., amb el nom de compta.txt. Aquest fitxer només ha de contenir, inicialment, el número 0. El desem al directori de treball. Cal que tinguem permís de lectura i escriptura sobre compta.txt (vegeu més avall Fitxers i permisos).

   
Atenció !
S'ha d'anar alerta amb l'editor que fem servir per crear el fitxer compta.txt. Si aquest editor insereix codis ocults, podríem tenir problemes perquè funcionés correctament el comptador. Cal tenir cura que al final del número 0 no s'hi insereixi un salt de línia o retorn de carro.
   

Tot seguit, creem el fitxer que generarà la pàgina del comptador. El procés que s'ha de seguir serà el següent:

  • Obrim el fitxer compta.txt.
  • Recuperem el valor que conté.
  • Augmentem en 1 aquest valor.
  • Reescrivim el contingut de compta.txt amb el nou valor.
  • Tanquem el fitxer.
  • Mostrem el nombre de visitants actuals.

El codi per aconseguir-ho seria:

   
Veure codi

Executar codi

<?
/*---------------------------------------------------------------
* Mòdul: 7 Pràctica: 1 Fitxer: m7p11.php
* Autor: D116 Data:
* Descripció: Comptador de visites
* Pre condi.: El fitxer 'compta.txt' amb drets d'escriptura
* Post cond.:
----------------------------------------------------------------*/

// Obrim el fitxer en lectura/escriptura
$fp = fopen("compta.txt","r+");

// Recuperem el nombre que conté el fitxer
$nbvisites = fgets($fp,11);

// Incrementem en 1 el nombre de visites
$nbvisites++;

// Anem al començament del fitxer
rewind($fp);

// Escrivim nou número al fitxer
fputs($fp,$nbvisites);

// Tanquem el fitxer
fclose($fp);

// Es mostra el comptador
echo "<b>".$nbvisites."</b> visitants";
?>

  Llistat 7.1.1. Comptador de visites
 

 

 

Deseu aquest codi en un fitxer anomenat m7p11.php en el mateix directori on tingueu el fitxer compta.txt. Alguns comentaris:

  • Amb fopen() obrim el fitxer de text ("compta.txt") en mode de lectura i escriptura ("r+"). Aquesta funció retorna un punter que servirà per saber on som dins el fitxer. Inicialment, el punter es col·loca al principi.
 
  • Amb fgets() llegim les dades contingudes dins el fitxer. Cal que a aquesta funció li passem el punter i el nombre de bytes que ha de llegir (en aquest cas 11); és a dir, començant des del principi llegirà el primers 11 bytes. Si és més llarg del compte, com en aquest cas, s'ignorarà la resta.
 
  • Amb rewind() torna el punter al començament de la línia.
 
  • Amb fputs() escrivim el nou nombre al fitxer.
 
  • Finalment, fclose() serveix per tancar el fitxer.
 

Si executeu aquest codi, observareu que va augmentant el número de visites. Podeu comprovar des d'un editor de text com el contingut de compta.txt ha anat canviant.

   
Atenció !

Com en gairebé tots els apartats que anem treballant, a més de les funcions que hem utilitzat, el PHP té un bon nombre de funcions del sistema de fitxers que poden ser molt útils: creació de directoris, extreure el nom d'un fitxer de tota la ruta, comprovar l'existència d'un fitxer o d'un directori, canviar els permisos d'un fitxer, etc.

   
Atenció !
La funcio fopen() pot servir també per "llegir" el contingut d'una pàgina web si li passem la seva adreça url com a primer paràmetre. D'aquesta manera podem extreure'n algun contingut.
   
  Fitxers i permisos
 

A l'hora d'escriure en un fitxer, cal que tinguem autorització per fer-ho. Això varia en el Windows i en el Linux. En la nostra instal·laciólocal en Windows feta amb EasyPHP, no tindrem problemes per ralitzar aquesta pràctica. Si treballem en Linux o bé volem fer una prova en aquest sistema operatiu, cal que tinguem alguna idea de com funcionen els permisos de fitxers. Sense aprofundir-hi, podem dir que en el Linux els permisos s'apliquen a fitxers o directoris i giren al voltant de dos eixos: usuaris (propietari, grup, tothom o públics) i tipus de permís (lectura, escriptura, execució).

  Lectura Escriptura Execució Permís
Propietaris
4
2
1
7
Grup
4
2
1
7
Tothom
4
2
1
7

A cada tipus de permís se li assigna un nombre. Sumant aquestes xifres podem saber el permís que té un fitxer i, a la inversa, quina xifra hem d'assignar al permís. Per exemple: per donar permís de lectura i escriptura a un fitxer li assignarem un permís 666.

La majoria de programes clients d'FTP faciliten l'assignació d'aquests permisos amb quadres referits a les propietats o atributs dels fitxers. Per exemple, en el programa client FileZilla si cliquem amb el botó dret sobre el fitxer que es troba en el servidor (Lloc remot) i triem l'opció Atributs del fitxer... arribem a un quadre com el que es mostra a la figura 7.1.1

Figura 7.1.1: Permisos en Linux

Podeu veure que al fitxer compta.txt se li assignen, efectivament, permisos d'escriptura i, per tant, podrem canviar-ne el contingut. Si, en canvi, el valor del permís fos 444, només es podria accedir a la lectura i, en conseqüència, no funcionaria la pràctica que hem explicat.

Diguem, també, que aquest valor es pot establir i canviar dinàmicament per programa amb la funció chmod(), així com canviar el propietari amb chown() i canviar el grup amb chgrp().

   
   
  Transferència de fitxers
   
 

Veurem un exemple de com enviar un fitxer al servidor mitjançant un formulari. A diferència de la pràctica 2 del mòdul 3, utilitzarem la mateixa tècnica que hem fet servir en el mòdul 6: la utilització d'un sol fitxer per al formulari i el seu processament en lloc de dos fitxers separats.

   
  Enviar fitxers
Pràctica

Veurem a la pràctica el que acabem d'exposar i com podem enviar un fitxer des d'un ordinador client al servidor. Una possible aplicació pràctica d'això seria, per exemple, la tramesa d'una fotografia (de l'alumnat, del professorat...) a un directori que les contingués totes.

L'script permet triar un fitxer localment (a l'ordinador de l'usuari) i enviar-lo al servidor.

En aquest procés, el PHP genera també l'array associatiu $_FILES, de dues dimensions, que recollirà en la primera columna l'identificador de l'etiqueta <input> del formulari (en el nostre cas, 'fitxer') i a la segona les claus de les característiques del fitxer (nom, tipus, mida, etc.)

Cal tenir en compte, també, que perquè aquest procés funcioni correctament, han d'estar ben definides les directives del php.ini que s'hi relacionen:

Directiva Descripció
file_upload Segons com el tinguem definit (on-off) es permetrà o no la pujada de fitxers
upload_tmp_dir Directori on s'emmagatzemen de manera temporal els fitxers pujats; cal que recuperem el fitxer i el copiem on vulguem
upload_max_filesize Limita la mida màxima que podrà tenir el fitxer enviat per poder ser acceptat
   
  Copieu el codi següent a l'editor i deseu-lo amb el nom de m7p12.php. Després d'estudiar-lo, executeu-lo localment.
   
Atenció !
Per fer funcionar aquest codi, cal també que definiu, abans d'executar-lo en local, el directori recepcio, al mateix nivell que el script m7p12.php. Aquest directori haurà de tenir, si cal (Linux, 2000 Server...), els permisos d'escriptura i execució adequats per a poder rebre fitxers.
   
Veure codi

Executar codi

<?php
/*---------------------------------------------------------------
* Mòdul: 7 Pràctica: 1 Fitxer: m7p12.php
* Autor: D116 Data:
* Descripció: Tramesa de fitxers
* Pre condi.: Directori de destí ('recepcio') amb permisos d'escriptura
* Post cond.:
----------------------------------------------------------------*/

// Recuperarem les dades del formulari (mitjançant l'array de PHP $_POST)
// Recuperarem les dades del fitxer enviat (amb l'array de PHP $_FILES)


// Si $_POST['boto'] està definit, entrarem.
// Per tant, la primera vegada no ho farà
if(isset($_POST['boto'])) {
// Recuperem les dades del fitxer de l'array $_FILES
$fitxer = $_FILES['fitxer']['name'];
$mida = $_FILES['fitxer']['size'];
$tmp = $_FILES['fitxer']['tmp_name'];
$tipus = $_FILES['fitxer']['type'];
$error = $_FILES['fitxer']['error'];
// Recuperem el valor de mida màxima 'ocult' en el formulari
$max = $_POST['max'];

//Recuperació de fitxers
if($fitxer) {
//Controlem mida màxima del fitxer
if($mida <= $max) {
echo "Nom d'origen =>".$fitxer."<br />";
echo "Mida =>".$mida."<br />";
echo "Nom en el servidor =>".$tmp."<br />";
echo "Tipus de fitxer =>".$tipus."<br />";
echo "Codi d'error =>".$error."<br />"; //Si és 0 és que no s'ha produït error
$desti = "recepcio/".$fitxer;
echo "Destí del fitxer =>".$desti;
move_uploaded_file($tmp , $desti); // copiem el fitxer temp. on vulguem
}else{
echo "El fitxer és massa gran";
}
}else{
echo "No s'ha enviat cap fitxer";
}
}
?>


<h2> Transferència de fitxers al servidor</h2>

<!-- a enctype definim el tipus de fitxer-->
<form enctype="multipart/form-data"
action= "<?php echo $_SERVER['PHP_SELF']; ?>"
method="post">
Tria el fitxer<br>
<input name="fitxer" type="file"> <!--observeu el tipus: "file"-->
<input type="hidden" name="max" value="40000"> <!--mida màxima-->
<input type="submit" value="Envia" name="boto">
</form>

  Llistat 7.1.2. Transferència d'un arxiu
   
 

Si observem el codi, veurem que es compon de dues parts:

  • A la primera part hi ha el fragment de codi en PHP que conté el codi per executar un cop haguem triat el fitxer; només s'executa si la variable $_POST['boto'] ha estat enviada (per tant, no ho farà la primera vegada que cridem l'script).
 
  • Una segona part en codi HTML que genera el formulari de tria.
 

Pròpiament s'executa en primer lloc la part del formulari html. Aquí cal remarcar:

  • La clàusula enctype ha de ser "multipart/form-data".
 
  • El tipus d'input és file, és a dir, obrirà un quadre de selecció de fitxer perquè en triem un.
 
  • Com a paràmetre d'action (recordeu que cal posar-hi el nom del fitxer que processarà les dades) hi posem la variable d'entorn del PHP $_SERVER['PHP_SELF']. Recordeu que això equivaldrà a cridar-se a si mateix i, per tant, al nom del fitxer. Podríem dir que és una autocrida al mateix fitxer, es digui com es digui.
 
  • Passem com a paràmetre ocult la variable max que fixa la mida màxima del fitxer enviat. Es tracta d'una mesura efectiva però poc segura, ja que fàcilment es podria manipular el codi html. Si es vulgués fer més segur, es podria fixar el valor de la variable $max directament al codi. Per exemple $max = 40000.
 

Un cop executat el formulari, l'script es torna a carregar. Ara, però, la variable $boto ja tindrà un valor i, per tant, ja processarem les dades enviades. Cal remarcar que:

  • Recuperem les dades del fitxer enviat mitjançant l'array _FILES explicat més amunt.
 
  • Mostrem totes aquestes informacions en pantalla.
 
  • A la variable $desti hi desem el nom del directori afegint-li el nom del fitxer. En el nostre cas: "recepcio/".$fitxer;
 
  • Fixeu-vos que aquesta rutina copia el fitxer al directori temporal definit a php.ini; cal, però, copiar-lo de nou mitjançant la funció move_uploaded_file() al directori que ens interessi. Igualment, amb aquest funció podríem aprofitar per, si escau, canviar el nom al fitxer (posar-li, per ex., el número de codi d'un/a alumne/a com a nom del fitxer de la seva foto).
   
Atenció !
Cal anar molt alerta amb els scripts de transmissió de fitxers o upload i prendre algunes mesures de seguretat, com per exemple: limitar la mida dels fitxers a enviar, autoritzar només determinats tipus de fitxer (imatges, que no siguin executables...), donar permís d'ús només a determinats usuaris, etc.
   
   
Amunt
Pràctica
1
2
3
4
   
Exercicis
Exercicis