Chapitre 8
COMPLEMENTS DE PHP
Gestion des fichiers
 
 
Précédent Suivant
 

Compléments de PHP
Gestion des fichiers
Accès aux fichiers sur le serveur
* PHP peut accéder à des fichiers sur le serveur
* Accès uniquement aux fichiers dans la zone HTTP
* Fichiers accessibles par URL
* Accès aux fichiers protégés par ".htaccess"
* Fichier ".htaccess" limite l'accès par HTTP
* Manipulations possibles par PHP
* Consultation
* Liste des fichiers d'un répertoire
* Contenu d'un fichier
* Modification
* Renommage d'un fichier
* Modification du contenu d'un fichier
* Suppression répertoire et fichier
* Création
* Dépôt de fichier
* Génération de fichier
* Répertoire
Informations sur un fichier
* Taille en octets d'un fichier
* $taille = filesize($chemin);
* Dates d'accès à un fichier
* Création
* $date = filectime($chemin);
* Dernière modification
* $date = filemtime($chemin);
* Dernière consultation
* $date = fileatime($chemin);
* Retournent une date en secondes
* Conversion en texte: fonction "date"
* Exemple: date("d/m/Y H:i:s",$date)
Consultation d'un répertoire
* Ouverture du répertoire
* $dossier = opendir($chemin);
* Parcours des éléments du répertoire
* while ($element = readdir($dossier)) ...
* Type des éléments
* Fichier: if (is_file($element)) ...
* Répertoire: if (is_dir($element)) ...
* Fermeture du répertoire
* closedir($chemin);
* Petit exercice: lister le contenu d'un répertoire
* Afficher des informations sur chaque fichier
* Afficher les répertoires d'une couleur différente
* Proposer un lien pour le téléchargement
Manipulation des fichiers
* Copier un fichier
* copy($chemin_original,$chemin_copie);
* Renommer / déplacer un fichier
* rename($chemin_ancien,$chemin_nouveau);
* Suppression d'un fichier
* unlink($chemin);
* Créer un répertoire
* mkdir($chemin,$droits);
* Droits d'accès: $droits = "0700"
* Détruire un répertoire vide
* rmdir($chemin);
* Retour à l'exercice: proposer les actions suivantes
* Renommer un fichier
* Supprimer un fichier
* Copier un fichier
Dépôt d'un fichier: formulaire HTML
* Paramètres du formulaire
* Méthode "post"
* Encodage "multipart/form-data"
* <form method="post" action="upload.php"
enctype="multipart/form-data">
* Insérer un champ de type "file"
* <input type="file" name="logo"/>
* Limiter la taille du fichier
* Eviter des dépôts trop importants
* Insertion d'un champ caché
<input type="hidden"
name="MAX_FILE_SIZE" value="taille en octets"/>
Dépôt d'un fichier: code PHP (1/2)
* A la soumission du formulaire
* Transmission du fichier au serveur
* Stockage du fichier dans une zone temporaire
* Le fichier porte un nom différent de celui d'origine
* Accès au fichier par le tableau "_FILES"
* La clé est le nom du paramètre dans le formulaire
* $_FILES["logo"]
* Chemin d'origine du fichier
* $_FILES["logo"]["name"]
* Chemin de la copie sur le serveur
* $_FILES["logo"]["tmp_name"]
* Taille du fichier
* $_FILES["logo"]["size"]
Dépôt d'un fichier: code PHP (2/2)
* Déplacer le fichier téléchargé
* Zone temporaire vers répertoire permanent du serveur
* Fonction "move_uploaded_file"
* Exemple: placer le fichier dans "upload"
$original = basename($_FILES["logo"]["name"]);
$temporaire = $_FILES["logo"]["tmp_name"];
$final = "upload/".$original;
if (move_uploaded_file($temporaire,$final))
echo "Dépôt réussi !";
else
echo "Echec du dépôt !";
Un peu de sécurité (1/2)
* Un utilisateur peut déposer un fichier PHP sur le serveur
* Il peut contenir un code pour effacer les fichiers du serveur
* Facile d'appeler ce fichier, il suffit de connaître son URL
* Tester l'extension du fichier
$extensions = array(".png",".gif",".jpg");
$extension = strrchr($chemin_original,".");
if (!in_array($extension,$extensions))
echo "Type de fichier interdit !";
Un peu de sécurité (2/2)
* Un utilisateur peut modifier le formulaire
et donc la taille maximale
* Vérifier la taille du fichier déposé
if (filesize($chemin_temporaire) > $taille_max)
echo "Taille maximale atteinte !";
* Supprimer les caractères spéciaux dans le nom du fichier
* Enlever les accents sur les lettres
$fichier = strtr($chemin_original,
'ÀÁÂÃÄAÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäaçèéêëìíîïoòóôõöùúûüúÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
* Remplacer tout ce qui n'est pas lettre, chiffre, "." ou "-"
$fichier = preg_replace("/([^.a-z0-9\-]+)/i",
"-",$fichier);
Manipulation du contenu d'un fichier (1/2)
* Ouverture d'un fichier
* $fichier = fopen($chemin,$mode);
* Modes d'ouverture
* "r": lecture
* "w": écriture (écrase l'ancien contenu)
* "a": écriture en fin de fichier
* Par défaut, fichier texte
* Pour fichier binaire: rajouter le caractère "b"
* Fermeture d'un fichier
* fclose($fichier);
* Tout un fichier dans une chaîne
* $contenu = fread($fichier,filesize($chemin));
* Tout un fichier dans un tableau (par ligne)
* $contenu = file($chemin);
Manipulation du contenu d'un fichier (2/2)
* Lecture d'une ligne
* $ligne = fgets($fichier,$max);
* $max = nombre maximum de caractères de la ligne
* Ecriture d'une ligne
* fputs($fichier,$ligne);
* Lecture d'une suite d'octets
* $chaine = fread($fichier,$longueur);
* Ecriture d'une suite d'octets
* fwrite($fichier,$chaine);
* Test fin de fichier
* $fini = feof($fichier);
Création d'un flux RSS
* Retour au site collaboratif pour le cinéma
* Ecrire une page PHP qui génère un flux RSS
* Utiliser la table "actualité"
* Générer un fichier XML au format RSS
* Pas de génération "à la volée"
* Le flux RSS n'est pas transmis au client avec "echo"
* Création d'un fichier enregistré sur le serveur
* Réécrit à chaque ajout d'une actualité
* Ne garder que les 10 actualités les plus récentes