Comme dans la plupart des langages, afin de
travailler avec un fichier, il est nécessaire d’ouvrir l’accès au
fichier, d’y accéder, puis de le fermer.
Il est possible en PHP d’ouvrir un fichier local (fonction fopen) ou distant et le désignant par une URL et un protocole (http ou ftp).
Les différents modes d'ouvertures sont les suivants :
- r : ouverture en lecture seule à partir du début,
- r+ : ouverture en lecture/écriture à partir du début,
- w : ouverture en écriture seule. Si le fichier existe déjà, il est écrasé, sinon, il est crée (si possible),
- w+: ouverture en lecture/écriture. Si le fichier existe déjà, il est écrasé, sinon, il est crée (si possible),
- a :
ouverture en ajout uniquement. Les données sont écrites à la fin du
fichier, s'il n'existe pas, il est crée (si possible),
- a+ :
ouverture en lecture et ajout. Les données sont écrites à la fin du
fichier, s'il n'existe pas, il est crée (si possible).
Afin de revenir au début du fichier, il est nécessaire d'utiliser la fonction
fseek. Le premier paramètre est l'identifiant du fichier retourné par
fopen, le second paramètre est l'
offset (décalage en nombre d'octets, à partir du début du fichier - exprimé par un entier).
Nous n’allons pas le décrire ici, mais il est également possible d’accéder à des fichiers en ouvrant un canal ou
pipe avec la fonction
popen ou en ouvrant une connexion par
socket avec
fsockopen.
Voici un exemple d’ouverture fichier :
< ?
$monFichier = fopen(‘’monfichier.txt’’,’’ w’’) ; // ouverture en écriture
if ( !($monfichier)) {
print(‘’ Impossible de créer le fichier \n’’) ;
exit ;
}
fputs($monfichier, ‘’ligne 1’’) ; // on écrit deux lignes
fputs($monfichier, ‘’ligne 2’’) ;
fclose($monfichier) ; // on ferme le fichier, on libère les ressources
$monfichier = fopen(‘’monfichier.txt’’, ’’r’’) ; // ouverture en lecture
if ( !($monfichier)) {
print(“ Impossible d’ouvrir le fichier ”) ;
exit ;
}
while ( !feof($monfichier) ) {
$ligne = fgets($monfichier,255); // 255 caractères max. ou bien fin de ligne.
print ‘’ $ligne <BR> ‘’ ;
}
fclose ($monfichier) ;
?>
On peut également accéder à des fichiers distants en passant par une URL :
$url = ‘’http://wwwbay.univ-pau.fr/~roose/index.shtml’’
;
fopen($url) ;
Il est parfois nécessaire de lire un fichier pour l’afficher par la suite dans le navigateur. La fonction
readfile
permet ceci en renvoyant le contenu du fichier vers le navigateur. La
valeur retournée est le nombre d’octets lus. Si le nom du fichier
commence par
http:// ou
ftp://,
l’accès à ce dernier sera fait via l’un de ces protocoles. Dans le cas
où aucun protocole n’est spécifié, l’accès se fait sur le système
local, celui sur lequel est hébergée la page PHP correspondante.
Il existe toute une série de fonctions associées
aux fichiers, comme :
- fgetcsv (descripteur, longeur max, séparateur) : permet de lire une chaîne de caractère en ne prenant pas
le marqueur de fin de ligne comme fin, mais le séparateur précisé.
Très pratique pour lire des contenus exportés au format csv.
- file_exists(descripteur de fichier) : teste l’existence d’un fichier (ne fonctionne pas avec des accès HTTP ou FTP).
- filesize(‘’ nom fichier’’) qui retourne la taille en octets du fichier.
- fseek (descripteur fichier, offset) : permet de se positionner à l’octet “ offset ” dans le fichier. Cette fonction retourne 0 si tout c’est bien passé, -1 sinon.
- rewind (descripteur): place le pointeur au début du fichier.
- chmod(fichier, droits unix) : change les droits du fichier (à condition que le serveur PHP ai également les droits dessus).
- unlink(nom du fichier) : supprime ce fichier.
- is_dir(‘’ nom fichier’’) ; is_executable(‘’nom fichier’’), is_link(‘’ nom fichier’’), is_readable(‘’ nom fichier’’), is_writeable(‘’ nom fichier’’) permettant de savoir si un fichier est un répertoire, exécutable, un lien, si les droits en lecture ou écriture sont valides. Lorsque les évaluations sont vérifiées, 1 est retourné, 0 sinon.
- opendir(‘’ nom répertoire’’) retourne un état de répertoire exploitable par la suite avec readdir et closedir.
- readdir(descripteur de répertoire), retourne le nom du fichier suivant à partir du descripteur de répertoire obtenu avec opendir. On fermera le répertoire avec closedir comme on le fait lorsque l’on ouvre un fichier.
- fgetcsv(descripteur, nb max de car à lire, délimiteur). Lorsque l’on a à faire à une ficher encodé au format CSV (chaque champs séparé par un délimiteur), il est possible d’utiliser la fonction : fgetcsv qui s’utilise un peu comme la fonction explode. Elle retourne un tableau dont chaque « case» est un champ de la ligne lue au format CSV. Sur le même format, il existe la commande fputcsv.
7.1 Transfert de fichiers (upload)
Il
est fréquent de désirer transférer un fichier d'un ordinateur vers le
serveur PHP. Afin de réaliser ceci, il est nécessaire d'implémenter la
fonction d'upload. Pour ce faire, il faut utiliser la fonction move_upload_file(source, destination).
Il est à noter que la source est un fichier déjà présent sur le serveur
mais généralement dans un répertoire temporaire. Ce fichier aura été
mis dans ce répertoire à l'aide par exemple du code HTML suivant :
<form ENCTYPE="multipart/form-data" action="upload.php" METHOD="POST">
<input type="file" name="nomfichier"> <br>
<input type="submit" value="Télécharger">
On
se référera au tableau $_FILE pour plus d'informations. Bien
évidemment, on prendra soin de gérer les droits en écriture du
répertoire destinataire.
Une fois le transfert réalisé (appui sur le
bouton submit) la première chose à faire est de vérifier que
l'opération s'est bien passée en vérifiant la présence du fichier dans
le dossier temporaire; pour cela, nous avons à notre disposition la
fonction is_uploaded_file($_FILES['fichier']['tmp_name']). Une fois la vérification réalisée, on copie le fichier sur notre espace web à l'aide de la fonction move_uploaded_file(string $filename , string $destination) qui est plus sûre que la fonction copy(), car elle vérifie que le fichier à copier vient bien du dossier temporaire (et donc, provient d'un formulaire d'upload).