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 |