Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > Fichiers et dossiers
        Est-il possible d'accéder à un fichier par son url ?
        Comment récupérer le contenu d'un fichier ?
        Comment trier les fichiers d'un dossier par date ?
        Comment lire un fichier au format ini ?
        Comment traiter un fichier ligne par ligne ?
        Comment obtenir la taille en Ko d'un fichier ?
        Comment obtenir le poids d'un fichier distant ?
        Comment forcer le téléchargement d'un fichier ?
        Comment supprimer un fichier ?
        Comment supprimer massivement des fichiers ?
        Je n'arrive pas à uploader les gros fichiers !
        Comment tester l'existence d'un répertoire ?
        Comment connaître le chemin complet du répertoire courant ?
        Comment créer un fichier vide ?
        Comment écrire un retour à la ligne dans un fichier ?
        Comment verifier l'existence d'un fichier sur le serveur ?
        Comment extraire le nom du dossier d'un fichier dans un chemin ?
        Comment extraire le nom de fichier d'un chemin ?
        Comment séparer un nom de fichier de son extension ?
        Comment savoir si un dossier est vide ?
        Comment copier un fichier ?
        Comment déplacer / renommer un fichier ?
        Comment lister les fichiers et dossiers triés par ordre lexicographique ?
        Comment compter le nombre de lignes d'un fichier ?
        Comment créer un fichier de log ?
        Comment extraire les données d'un fichier CSV ?
        Peut-on inclure du code distant ?
        Comment protéger des fichiers en téléchargement ?
        Comment filtrer les fichiers uploadés sur leur type mime ?
        Comment lire un fichier se trouvant sur le disque du poste client ?
        Comment forcer le téléchargement sur le serveur d'un fichier ?
        Comment envoyer un fichier depuis le navigateur sur le serveur à travers un formulaire HTML ?
        Comment utiliser les fonctions file_get_contents et file_put_contents lorsqu'elles sont désactivées ?
        Comment récupérer le type d'un fichier ?
        Comment réaliser un formulaire d'upload via FTP ?
        Comment obtenir/modifier la date d'un fichier ?
        Comment écrire un fichier en binaire ?
        Comment éviter les problèmes de lecture sur les différents systèmes
        10.1. Droits d'accès aux fichiers et dossiers(4)
                C'est quoi le chmod ?
                Comment se calcule un chmod ?
                Comment convertir les bits de permissions au format numérique Unix ?
                Comment convertir les bits de permissions au format symbolique Unix ?

precedent    sommaire    suivant   


Est-il possible d'accéder à un fichier par son url ?
auteur : Eric Berger
C'est possible, mais en lecture seulement (pour modifier des fichiers distants, il faut se servir d'un accès ftp et des fonctions PHP prévues pour ce type de connections).

Comment?
simplement à l'aide de la fonction fopen() en utilisant l'url comme nom de fichier.
$file = fopen('http://www.site.com/page.htm', 'r');

Le "r" signifie que le fichier sera ouvert en mode lecture et que le pointeur sera positionné au début du fichier.
$file contient FALSE si le fichier n'a pas pu être ouvert.
Il se peut qu'un fichier ne soit pas disponible lorsqu'on essaie de l'ouvrir, il est donc fortement recommandé de tester la valeur retournée par la fonction fopen(). Pour lire son contenu, il suffit de se servir de la fonction fread() comme on le ferait avec un fichier issu de l'arborescence locale.


Comment récupérer le contenu d'un fichier ?
auteurs : Forum PHP, Kerod
On peut récupérer le contenu d'un fichier de deux manières différentes :
  • En utilisant la fonction file_get_contents() qui lit tout un fichier dans une chaîne (disponible à partir de PHP 4).
  • En utilisant les fonctions fopen(), fread() et fclose() qui permettent l'ouverture, la lecture et la fermeture du fichier.
Exemples :
  • Récupération du contenu d'un fichier en local :
Avec file_get_contents
$contents = file_get_contents("mon_fichier.txt"); //Récupère tout le contenu du fichier et le place dans une chaîne de caractères
Ou
Avec fopen, fread, fclose
$fd = fopen( "mon_fichier.txt", "r" ); // Ouverture du fichier en lecture seule
$contents = fread( $fd, filesize( $filename ) ); //Récupère tout le contenu du fichier et le place dans une chaîne de caractères
fclose($fd); //Fermeture du fichier
  • Récupération du contenu d'un fichier en ligne :
Avec file_get_contents
$contents = file_get_contents("url du fichier");
Ou
Avec fopen, fread, fclose
$fd = fopen($url, 'r'); // Ouverture du fichier en lecture seule
while(!eof($fd))
{
  $contents .= fread($fd, 8192); //Récupère tout le contenu du fichier et le place dans une chaîne de caractères
}
fclose($fd); //Fermeture du fichier
PS : Il n'est possible de récupérer un fichier par son URI complète que si la directive allow_url_fopen est activée dans le php.ini.

lien : fr Tutoriel : Extraction de données sur un site internet avec Php, MySQL et XML, Olivier Népomiachty.

Comment trier les fichiers d'un dossier par date ?
auteur : Cyberzoide
On va lister les noms des fichiers du dossier et extraire leur date de dernière modification (timestamp Unix) avec filemtime(). Ces deux valeurs seront mise dans un tableau.
$PATH = '.';// Listage d'un répertoire $PATH
if ($dir = @opendir($PATH)) {// ouverture du dossier 
    while($file = readdir($dir)) { // lecture d'une entrée 
        //création d'un tableau à 2 colonnes : nom + date fichiers 
        $tab[] = array($file, filemtime($file));  
        // sauvegarde du nom du fichier et de sa date 
    }
    closedir($dir); // fermeture du dossier 
}
Puis, on va trier ce tableau sur les dates. Comme il n'existe pas de fonction triant directement notre tableau de tableaux, nous allons avoir recours à la fonction usort() qui permet de trier un tableau grâce à une fonction personnalisée, ici cmp(). Cette dernière fonction permet de comparer deux entrées du tableau. Ici elle va porter sur le deuxième élément (la date) du tableau que constitue une entrée du tableau. Notre fonction de comparaison doit retourner 0 si deux entrées sont égales, -1 si la première est inférieure à la deuxième, +1 sinon.
//tri du tableau sur les dates
function cmp($a,$b) {
    if ($a[1] == $b[1])
        return 0;
    return ($a[1] < $b[1]) ? -1 : 1;
}

usort($tab, "cmp");
Puis on va afficher notre tableau trié, en formatant la date pour qu'elle apparaissent en langage humain avec date().
echo "<table>";
foreach($tab as $elem) {
    //formatage de la date avec mktime() selon le format retourné par filemtime()
    echo "<tr><td>".$elem[0]."</td><td>".date("d-m-Y H:i:s",$elem[1])."</td></tr>"; 
}
echo "</table>";

Comment lire un fichier au format ini ?
auteur : Eric Berger
Tout d'abord un petit rappel sur les fichiers ini. Ce sont des fichiers au format texte qui contiennent des sections et des propriétés auxquelles sont affectées des valeurs. Ils sont présentés de la façon suivante.
[SECTION]
prop_1 = valeur
prop_2 = valeur
La fonction parse_ini_file() créé un tableau contenant les valeurs d'un fichier ini. Il y a deux degrés de détail que l'on peut demander à la fonction. Pour l'exemple donné ci-dessus:
$ini = parse_ini_file("fichier.ini");

retournera le tableau suivant:
$ini["prop_1"] = valeur;
$ini["prop_2"] = valeur

Si l'on rajoute TRUE comme deuxième argument:
$ini = parse_ini_file("fichier.ini", TRUE);

Le tableau suivant sera retourné:
$ini["SECTION"]["prop_1"] = valeur
$ini["SECTION"]["prop_2"] = valeur

Un tableau à deux dimensions donc, ce qui est très utile dès lors que le fichier ini contient plus d'une section.


Comment traiter un fichier ligne par ligne ?
auteur : Eric Berger
Si une opération doit être faite sur toutes les lignes d'un fichier, la fonction file() va s'avérer très utile.

Cette fonction retourne le contenu d'un fichier dans un tableau, à raison d'une ligne par élément. Une fois le tableau construit, il est facile d'effectuer une boucle sur les éléments du tableau afin de leur appliquer le traitement souhaité.


Comment obtenir la taille en Ko d'un fichier ?
auteur : Cyberzoide
$file = "monfichier.txt";
if(file_exists($file)) {
    echo round(filesize($file)/1024);
}
La fonction file_exists() teste l'existence d'un fichier (important avant toute manipulation). La fonction filesize() retourne la taille en octets d'un fichier, FALSE sinon. La fonction round() arrondi un nombre à l'entier le plus proche.

Comme 1 Ko = 1024 octets (en base 2, binaire), on divise la taille par 1024 pour l'avoir en ko.


Comment obtenir le poids d'un fichier distant ?
auteur : Cyberzoide
La fonction filesize() permet d'obtenir le poids d'un fichier local, mais cette fonction ne fonctionne pas sur les fichiers distants.

Il va donc falloir passer par la fonction fopen(), si tant est que le support des gestionnaires d'URL ("URL fopen wrapper") soit activé dans le fichier de configuration php.ini.

On va donc ouvrir le fichier, le lire en entier et en compter la taille.
<?php 
$buffer = '';
if($fd = fopen ("http://www.monsite.com/images/avatar.gif", "r")) {
    while (!feof($fd)) {
        $buffer .= fgets($fd, 4096);
    }
    fclose ($fd);
}
$size = strlen($buffer);
?>

Comment forcer le téléchargement d'un fichier ?
auteurs : Cyberzoide, Yogui, kankrelune
Il existe des types de fichiers qui sont normalement interprétés par le navigateur comme étant spécifiques à une application. La dite application va s'exécuter et ouvrir le fichier.

On souhaite ne pas ouvrir cette application et forcer l'enregistrement du fichier sur le disque du client. Pour forcer l'apparition de la boîte de dialogue "Enregistrer...", il faut envoyer les entêtes HTTP adéquats au navigateur.

Exemple :
<?php
//
// Constantes de configuration
//
define('CFG_SYSTEM_FILENAME', 'fichier.ext');
define('CFG_SEND_FILENAME', CFG_SYSTEM_FILENAME);

//
// Constantes à ne pas modifier
//
define('CFG_FILESIZE', filesize(CFG_SYSTEM_FILENAME));
define('CFG_FILE_MD5', md5_file(CFG_SYSTEM_FILENAME));
define('CFG_DATE_FORMAT', 'D, d M Y H:i:s');

//
// Quelques éléments nécessaires
//
error_reporting(0);
ini_set('zlib.output_compression', 0);


/*
 *Début de l'envoi
 */
//
// Gestion du cache
//
header('Pragma: public');
header('Last-Modified: '.gmdate(CFG_DATE_FORMAT).' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');

//
// Informations sur le contenu à envoyer
//
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.CFG_FILESIZE);
header('Content-MD5: '.base64_encode(CFG_FILE_MD5));
header('Content-Type: application/octetstream; name="'.CFG_SEND_FILENAME.'"');
header('Content-Disposition: attachement; filename="'.CFG_SEND_FILENAME.'"');

//
// Informations sur la réponse HTTP elle-même
//
header('Date: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
header('Expires: '.gmdate(CFG_DATE_FORMAT, time()+1).' GMT');
header('Last-Modified: '.gmdate(CFG_DATE_FORMAT, time()).' GMT');
?>



Je n'arrive pas à uploader les gros fichiers !
auteur : Cyberzoide
Il existe dans le fichier de configuration php.ini trois directives qui limitent la taille des fichiers que le serveur est capable de charger depuis le client :
  • upload_max_filesize fixe la taille maximum des fichiers chargés par les méthodes POST et PUT
  • post_max_size (supérieur à upload_max_filesize) fixe la taille maximum des fichiers chargés par la méthode POST
  • memory_limit (supérieur à post_max_size) fixe la taille de la mémoire du script
qui s'expriment en octets.

De plus, côté client, le formulaire HTML peut contenir le champ caché (input type=hidden) suivant : MAX_FILE_SIZE qui s'exprime lui aussi en octets. Ce dernier interdit au navigateur d'envoyer au serveur un fichier plus gros que MAX_FILE_SIZE octets.

Il existe enfin la directive max_input_time qui définit le temps maximal, en secondes, au script pour recevoir les données ; cela inclut le téléchargement du fichier. Pour de multiples fichiers, ou de gros fichiers, ou pour les utilisateurs sur de faibles connexions, la valeur par défaut de 60 secondes peut être dépassée.

Dans le cas où vous n'avez pas accès au php.ini, optez pour une connexion FTP...


Comment tester l'existence d'un répertoire ?
auteur : Jérôme
PHP dispose pour cela de la fonction is_dir() dont le prototype est le suivant :
boolean is_dir(string filename)
Elle renvoie la valeur TRUE si filename existe et est un dossier, FALSE dans le cas contraire.

Cette fonction ne marche qu'avec les fichiers qui sont accessibles par le système de fichier du serveur. Vous ne pouvez donc pas l'utiliser pour tester l'existence de fichiers distants.


Comment connaître le chemin complet du répertoire courant ?
auteur : Julp
La fonction getcwd() qui ne prend aucun paramètre renvoie sous forme de chaîne le chemin complet du répertoire courant.
$current_dir = getcwd();
str_replace("\\", "/", $current_dir); // Utilisateurs de Windows, pensez à changer vos antislashes

Comment créer un fichier vide ?
auteur : Cyberzoide
La fonction touch($nom_fichier) permet de créer le fichier portant le nom $nom_fichier, s'il n'existe pas déjà. Si un fichier du même nom existe déjà, alors sa date de dernière modification sera modifiée en la date actuelle.


Comment écrire un retour à la ligne dans un fichier ?
auteur : Forum PHP
Suivant le système d'exploitation, le code à utiliser pour un retour à la ligne n'est pas le même :
"\n" // pour un fichier lu avec Linux
"\r" // pour un fichier lu avec Mac
"\r\n" // pour un fichier lu avec Windows
Attention à bien mettre des guillemets doubles quand vous utilisez ce code en PHP.


Comment verifier l'existence d'un fichier sur le serveur ?
auteur : Eric Berger
La fonction file_exists()

retourne TRUE si le fichier existe.

Le chemin passé en argument peut être partiel ("./fichier.txt") ou complet ("c:\dossier\fichier.txt" ou /dossier/fichier.txt selon le système) mais ne peut être qu'un chemin local ou une ressource réseau. On ne peut donc pas fournir une adresse du type: "http://www.monsite.com/monfichier.txt".


Comment extraire le nom du dossier d'un fichier dans un chemin ?
auteur : Kerod
Pour le faire on utilise la fonction dirname() qui retourne le nom du dossier qui contient le fichier

Exemple :
$url = "http://www.developpez.net/repertoire/fichier.jpg";
echo dirname($url); // Affiche http://www.developpez.net/repertoire

Comment extraire le nom de fichier d'un chemin ?
auteur : Cyberzoide
Il existe plusieurs méthodes pour extraire le nom d'un fichier d'un chemin complet.

Exemple 1, le chemin est compatible avec le système de fichiers du serveur :
<?php
$path = '/var/www/html/docs/fichier.tex';
$file = basename($path);
echo $file; // affiche 'fichier.tex'
?>
Exemple 2, la chaîne séparatrice des répertoires est connue :
<?php
$file = array_pop(explode('/', $path));
?>
Ici, la foncion explode() scinde le chemin en un tableau, le caractère '/' délimitant les éléments à séparer. Ainsi chaque répertoire donne lieu à un élément distinct du tableau retourné. La fonction array_pop() retourne le dernier élément du tableau, c'est-à-dire le nom de fichier recherché.


Comment séparer un nom de fichier de son extension ?
auteur : Forum PHP
On peut séparer un fichier de son extension en utilisant la fonction pathinfo() qui retourne un tableau associatif, contenant les informations sur le chemin. Les éléments suivants sont retournés : le nom du répertoire (dirname), le nom du fichier (basename) et l'extension (extension).

Exemple :
$path_parts = pathinfo("/forum/index.php");
echo '<pre>';
print_r($path_parts); // Affiche Array ( [dirname] => /forum [basename] => index.php [extension] => php )
echo '</pre>';
lien : faq Comment extraire le nom de fichier d'un chemin ?

Comment savoir si un dossier est vide ?
auteurs : Kerod, Forum PHP
Pour savoir si un dossier est vide, on peut utiliser les fonctions :
  • glob() qui retourne un tableau contenant les chemins et fichiers trouvés
  • scandir() qui retourne un tableau de fichiers et dossiers

Exemple 1 :
$dossier = "test/";
if(glob($dossier."*")) 
{
  echo "Dossier n'est pas vide";
}
Exemple 2 :
$dossier = "test";
if(sizeof(scandir($dossier))>2)
{
  echo "Le dossier n'est pas vide";
}
else
{
  echo "Le dossier est vide";
}

Comment copier un fichier ?
auteur : Cyberzoide
La fonction copy($source, $dest) copie le fichier $source vers son nouvel emplacement $dest. Elle retourne true en cas de succès, false en cas d'erreur.

Exemple :
if(!copy("logo.gif", "images/logo.gif")) {
    echo "Copie impossible.";
}

Comment déplacer / renommer un fichier ?
auteur : Cyberzoide
La fonction rename($ancien, $nouveau) renomme / déplace le fichier $ancien vers son nouvel emplacement $nouveau. Elle retourne true en cas de succès, false en cas d'échec.

Exemple :
if(!rename("toto.html", "titi.html")){
    echo "Impossible de renommer.";
}

Comment lister les fichiers et dossiers triés par ordre lexicographique ?
auteur : Julp
<?php
// Création du tableau qui va contenir les fichiers et dossiers
$files = array();

// Ouverture du répetoire courant
// Pour le changer utiliser chdir() avant opendir()
$handle = opendir(".");

// Parcours des fichiers et dossiers du répertoire courant
while($file = readdir($handle)) {
    if($file != "." && $file != "..") {
        $files[] = $file;
    }
}

// Fermeture du répertoire courant
closedir($handle);

// Tri du tableaunat
sort($files);

// Affichage des fichiers et dossiers triés
foreach($files as $v) {
    echo $v . "<br />";
}
?>
Il suffit d'ajouter les fichiers et les dossiers au fur et à mesure dans un tableau puis de le trier et enfin de le parcourir pour affichage ou autre.


Comment compter le nombre de lignes d'un fichier ?
auteur : Cyberzoide
$file = "monfichier.txt";
if(file_exists($file)) {
    $tab = file($file); 
    echo count($tab);
}
La fonction file() retourne le contenu du fichier sous la forme d'un tableau de lignes et la fonction count() décompte le nombre de lignes d'un tableau.


Comment créer un fichier de log ?
auteur : Cyberzoide
Un fichier de log sert à garder trace des erreurs survenant dans une application PHP. Par exemple, lorsque survient une erreur, en plus d'afficher à l'écran un message d'erreur, on peut enregister quelques informations dans un fichier. Ce fichier pourra être lu régulièrement par un administrateur ou même par une application.

A chaque instance d'erreur correspond une ligne dans notre fichier. Il sera naturellement ordonnée selon la date : on rajoute les lignes les unes après les autres.

On convient d'un format particlulier pour nos lignes. Il est important de conserver le contexte dans lequel survient l'erreur : la date et l'heure, la page, l'identifiant de l'utilisateur connecté... Par exemple le schéma suivant : <comment>date et heure \t identifiant de l'utilisateur \t page \t description de l'erreur</comment>

Le caractère spécial \t représente une tabulation : nos champs seront donc séparés par une tabulation.

Ainsi à chaque erreur, on appelle la fonction suivante : error_log().
function error_log($desc) {
    global $ERROR_FILE, $visitor;
    /* ligne à écrire */
    $ligne = date('Y-m-d H:i:s')."\t".$_SERVER['PHP_SELF']."\t".$visitor->get_login()."\t$desc";

    /* ouverture du fichier de log, le mode "a+" permet d'écrire à la fin */
    if($fp = fopen($ERROR_FILE, "a+")) {
        /* écriture de la ligne à concurrence de 1024 caractères */
        fwrite($fp, $ligne, 1024);
        /* fermeture du fichier */
        fclose($fp);
    }
}
On suppose que les informations sur l'utilisateur connecté sont accessibles via un objet de session $visitor, dont la méthode get_login() retourne l'identifiant. La variable $_SERVER['PHP_SELF'] contient le nom de la page en cours. On pourrait la completer par $_SERVER['QUERY_STRING'] afin de connaître le détail des paramètres passés au script...

Note : ne pas gérer les erreurs qui peuvent survenir dans la fonction de gestion des erreurs !


Comment extraire les données d'un fichier CSV ?
auteur : Cyberzoide
Un fichier au format CSV est souvent utilisé pour exporter les données d'une feuille de calcul Excel, ou d'une base Access. Ensuite on peut réimporter ce fichier via PHP pour remplir une base MySQL.

Ainsi une ligne d'une table Excel ou Access est représentée par une ligne du fichier. Les champs étant délimités par un caractère spécial : \n, : ou autre... Les chaînes de caractères encadrées par des doubles quotes.

La fonction fgetcsv($pointeur, $taille) permet d'extraire une ligne de ce type de fichier. Elle fonctionne comme fgets(). Elle prend pour paramètres le pointeur sur le fichier obtenu par fopen(), ainsi que la taille limite de la ligne à lire. Elle retourne un tableau dont chaque élément est un champ de la ligne.

L'argument optionnel $delimiteur peut être ajouté. Il permet de spécifier le délimiteur de champs.

Exemple :
$file = "mon_fichier.csv";
$taille = 1024;
$delimiteur = ":";
/* ouverture en lecture */
if($fp = fopen($file,"r")) {
    /* extraction d'une ligne */
    while ($ligne = fgetcsv($fp, $taille, $delimiteur)) {
        /* affichage des champs */
        foreach($ligne as $elem) {
            echo "$elem<br/>";
        }
    }
    /* fermeture fichier */
    fclose ($fp);
} else {
    echo "Ouverture impossible.";
}
En lieu et place de fgetcsv(), on peut utiliser fgets(), puis explode($delimiteur,$ligne).

Exemple :
$file = "mon_fichier.csv";
$taille = 1024;
$delimiteur = ":";
/* ouverture en lecture */
if($fp = fopen($file,"r")) {
    /* extraction d'une ligne */
    while ($ligne = fgets($fp, $taille)) {
        /* extraction champs */
        $tab = explode($delimiteur, $ligne);
        /* affichage des champs */
        foreach($tab as $elem) {
            echo "$elem<br/>";
        }
    }
    /* fermeture fichier */
    fclose ($fp);
} else {
    echo "Ouverture impossible.";
}

Peut-on inclure du code distant ?
auteur : Cyberzoide
Non, c'est impossible. Les fonctions d'inclusion du code (include, require) ne peuvent inclure que les fichiers du même site. Sinon, on n'obtient que le code HTML résultant de l'interprétation du script distant sur le serveur distant.


Comment protéger des fichiers en téléchargement ?
auteurs : Cyberzoide, stephaneey
Imaginons que vous créez un espace membre dont l'accès est sécurisé par login et mot de passe, et que vous proposiez à vos visteurs inscrits de télécharger des documents, par exemple :
http://www.monsite.fr/docs/unfichier.pdf
Il suffit que cette URL soit diffusée sur le Net pour que n'importe qui accède à votre fichier sans avoir à s'identifier. Une solution serait d'utiliser des fichiers de directives de configuration du serveur Apache : .htaccess et .htpasswd, mais vous vous retrouveriez avec deux systèmes d'authentification !

La solution passe par le stockage des chemins réels de vos fichiers dans une base de données et de passer un identifiant numérique à un script de téléchargement afin que celui-ci récupère le contenu du fichier en question.

Par exemple, l'URL devient :
http://www.monsite.fr/download.php?id=31
Le script download.php va chercher le chemin du fichier correspondant :
SELECT `path` FROM `file` WHERE `id`=$id
Et en retourne le contenu au navigateur :
<?
if(!empty($_GET["id"])){
    $conn=mysql_connect('host','user','mot de passe');
    mysql_select_db('la bd',$conn);
    $res=mysql_query("select path from files where id=".$_GET["id"]) or die(mysql_error());
    if(mysql_num_rows($res)!=0){
        $row=mysql_fetch_object($res);
        header("Content-type: application/force-download");
        header("Content-Length: ".filesize($row->path));
        header("Content-Disposition: attachment; filename=".basename($row->path));
        readfile($row->path);
    }
}
?>


Comment filtrer les fichiers uploadés sur leur type mime ?
auteur : Cyberzoide
Le type mime d'un fichier est le nom normalisé de son format.
Ainsi, une image GIF ou un document PDF sont des types de fichier bien différents. Leur type MIME respectif a une dénomination normalisée. Ce type est automatiquement détecté par le serveur lors d'un upload. Cette information est fournie par le tableau superglobal associatif $_FILES qui contient les informations sur les fichiers uploadés via un formulaire.

Exemple :
/* tableau des types mimes autorisés */
$mime_types = array('image/jpeg','image/gif','text/html','video/mpeg','application/postscript');
/* informations sur le fichier uploadé */
$file = $_FILES('mon_fichier');
/* contrôle de son type mime */
if(in_array($file['type'], $mime_types)) {
    /* traitement du fichier */
    echo "ok";
} else {
    /* annulation */
    echo "pas ok";
}
Voici une petite liste de types MIME les plus courants :
  • application/msword (fichier Word : doc, dot))
  • application/msexcel (fichier Excel : xls)
  • application/mspowerpoint (fichier PowerPoint : ppt, ppz, pps, pot)
  • application/octet-stream (fichier binaire non interpété : exe)
  • application/pdf (fichier Adobe Acrobat : pdf)
  • application/postscript (fichier PostScript : ai, eps, ps)
  • application/x-dvi (fichier DVI : dvi)
  • application/x-latex (fichier Latex : tex)
  • application/x-tar (fichier compressé TAR : tar)
  • application/zip (fichier compressé ZIP : zip)
  • audio/x-pn-realaudio (fichier RealAudio : ram, ra)
  • audio/x-midi (fichier MIDI : mid, midi)
  • audio/x-wav (fichier audio Wave : wav)
  • image/gif (fichier image GIF : gif)
  • image/jpeg (fichier image Jpeg : jpg, jpeg)
  • image/png (fichier image PNG : png)
  • image/tiff (fichier image TIFF : tif, tiff)
  • image/gif (fichier image GIF : gif)
  • text/html (fichier texte HTML : html, htm)
  • text/plain (fichier texte sans mise en forme : txt, c, h)
  • text/javascript (fichier JavaScript : js)
  • text/css (fichier Feuille de Style CSS : css)
  • text/comma-separated-values (fichier de données séparées par des virgules : csv)
  • video/mpeg (fichier vidéo Mpeg : mpg, mpeg)
  • video/quicktime (fichier vidéo QuickTime : gt, mov)
  • video/msvideo (fichier vidéo Microsoft Windows : avi)


Comment lire un fichier se trouvant sur le disque du poste client ?
auteur : BiD0uille
Il n'est pas possible pour des raisons évidentes de sécurité de faire ce genre d'opération. PHP s'exécute côté serveur et rien ne peut être tenté côte client sans son accord.


Comment forcer le téléchargement sur le serveur d'un fichier ?
auteur : BiD0uille
Il n'est pas possible pour des raisons évidentes de sécurité de faire ce genre d'opération. PHP s'exécute côté serveur et rien ne peut être tenté côte client sans son accord.
Autrement dit, il n'est pas possible de mettre une valeur par défaut dans un champ HTML de type FILE.


Comment envoyer un fichier depuis le navigateur sur le serveur à travers un formulaire HTML ?
auteur : BiD0uille
Il vous faut d'abord un fichier HTML pour le formulaire d'envoi.
<html>
<body>
<p>
<form method="post" enctype="multipart/form-data" action="uploadfile.php">
    <input type="file" name="userfile" size="50">
    <br>
    <input type="submit" value="Envoi">
</form>
</p>
</body>
</html>
Après avoir pressé sur le bouton "submit", le fichier est envoyé par le navigateur via le protocole HTTP et enregistré par le serveur dans le dossier des éléments temporaires (paramétrable dans le fichier de configuration php.ini).

Et maintenant le script PHP qui récupère le fichier pour le stockage dans le répertoire voulu.
<html>
<body>
<?php
$stock = 'mettre ici le chemin où on va stocker le fichier';

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $stock.$_FILES['userfile']['name']))
{
    echo "Le fichier ".$_FILES['userfile']['name'].
            " a été téléchargé avec succès dans ".$stock;
}
?>
</body>
</html>
N'oubliez pas de vérifier les droits d'écriture sur le répertoire où on a stocké le fichier.

Attention également à la fonction move_uploaded_file : si le fichier de destination existe déjà, il sera écrasé

Le client ne peut pas sélectionner plusieurs fichiers dans la boîte de dialogue du navigateur. Pour cela, on utilise une astuce : plusieurs champs <INPUT FILE> :
Fichier 1 : <input type="file" name="userfile[]"><br>
Fichier 2 : <input type="file" name="userfile[]"><br>
Fichier 3 : <input type="file" name="userfile[]"><br>
etc
Dans votre script de récupération, vous aurez tout simplement l'index du fichier (démarrant à zéro) en troisième argument de tableau.
$_FILES['userfile']['name'][0]

Comment utiliser les fonctions file_get_contents et file_put_contents lorsqu'elles sont désactivées ?
auteur : Forum PHP
Il arrive qu'un hébergeur désactive les fonctions file_get_contents() et file_put_contents. Dans ce cas, on peut surmonter cette défaillance en redéfinissant celles-ci de la manière suivante :
Définition de la fonction file_get_contents si elle n'existe pas
if(!function_exists('file_get_contents'))
{   
  function file_get_contents($filename)
  {
    if($fp = fopen($filename,'rb'))
    {
      $buffer = fread($fp,filesize($filename));
      fclose($fp);
      return $buffer;
    }
    else return false;
  }
}
Et
Définition de la fonction file_put_contents si elle n'existe pas
if(!function_exists('file_put_contents'))
{ 
  function file_put_contents($filename,$data)
  {
    if($fp = fopen($filename,'wb'))
    {
      $ok = fwrite($fp,$data);
      fclose($fp);
      return $ok;
    }
    else return false;
  }
}

Comment récupérer le type d'un fichier ?
auteur : Forum PHP
Pour obtenir le véritable type d'un fichier, on utilise la fonction mime_content_type() qui retourne le type MIME d'un fichier en se basant sur les informations présentes dans le fichier magic.mime.
Exemple d'utilisation :
$filename = 'image.jpg'; //Fichier Image de type jpg
echo mime_content_type($filename); //Affiche image/jpeg 
$filename = 'image.jpg'; //Fichier initial de type zip avec l'extension jpg
echo mime_content_type($filename); //Affiche application/x-zip application/x-zip
Il se peut toutefois que cette fonction soit désactivée par le serveur. Dans ce cas, il existe l'alternative suivante (ne fonctionnant que sous Linux) :
if ( ! function_exists ( 'mime_content_type ' ) )
{
   function mime_content_type ( $f )
   {
       return system ( trim( 'file -bi ' . escapeshellarg ( $f ) ) ) ;
   }
}
Il se peut toutefois que cette fonction soit désactivée par le serveur. Dans ce cas, il existe l'alternative suivante :

lien : faq Comment filtrer les fichiers uploadés sur leur type mime ?

Comment réaliser un formulaire d'upload via FTP ?
auteur : Kerod
Il faut tout d'abord définir le formulaire HTML qui permettra de sélectionner le fichier à uploader sur le serveur FTP.
Voici un exemple de formulaire :
<form action="uploadftp.php" method="post" enctype="multipart/form-data">
    <input type="file" name="fichier"  />
    <input type="submit" value="Uploader" />
</form>
Il reste plus qu'à définir le code de la page uploadftp.php qui permettra d'obtenir une connexion au serveur FTP grâce aux fonctions FTP, après soumission du formulaire.
À la soumission, le fichier sera envoyé par le navigateur via le protocole HTTP et enregistré par le serveur dans un dossier temporaire (paramétrable dans le fichier de configuration php.ini).
uploadftp.php
<?php

define('CFG_FTP_SERVER', 'xxx');	// Adresse du FTP
define('CFG_FTP_USERNAME', 'xxx');	// Nom d'utilisateur
define('CFG_FTP_PASSWORD', 'xxx');	// Mot de passe
define('CFG_FTP_TIMEOUT', 2);		// Définition du délai de connexion en secondes

if(!empty($_FILES['fichier']) && $_FILES['fichier']['error'] == UPLOAD_ERR_OK && is_uploaded_file($_FILES['fichier']['tmp_name']))
{
  $fichier_a_uploader = $_FILES['fichier']['tmp_name'];
  $dossier_destination = '/' . $_FILES['fichier']['name'];

  $conn_id = ftp_connect(CFG_FTP_SERVER);	// Création de la connexion au FTP

  if(empty($conn_id))
  {
    echo 'Échec de connexion à ' . CFG_FTP_SERVER;
  }
  else
  {
    // Définition du délai de connexion à 2 secondes
    ftp_set_option($conn_id, FTP_TIMEOUT_SEC, CFG_FTP_TIMEOUT);

    echo "Connecté au FTP\n<br>";
		
    // Identification avec le nom d'utilisateur et le mot de passe
    $login_result = ftp_login($conn_id, CFG_FTP_USERNAME, CFG_FTP_PASSWORD);

    if(!$login_result)
    {
      echo "Échec d'identification à " . CFG_FTP_SERVER;
    }
    else
    {
      // Tentative de chargement sur le serveur FTP
      if(ftp_put($conn_id, $dossier_destination, $fichier_a_uploader, FTP_BINARY))
      {
        echo "Le fichier $fichier_a_uploader a été chargé avec succès\n";
      }
      else
      {
        echo "Il y a eu un problème lors du chargement du fichier $fichier_a_uploader\n";
      }
    }
    // Fermeture de la connexion
    ftp_close($conn_id);
  }
}
?>
Vous devez faire attention aux droits d'écriture sur le répertoire de destination, afin que l'upload soit effectif.

lien : fr Tutoriel d'introduction aux formulaires en PHP, par julp
lien : fr Tutoriel complet sur les formulaires en PHP, par Guillaume Rossolini
lien : fr Tutoriel : Exploration de répertoires et liste des fichiers, par Hugo Étiévant

Comment obtenir/modifier la date d'un fichier ?
auteur : Forum PHP
fileatime() et filemtime() sont des fonctions qui permettent obtenir de manière précise la date de dernier accès pour l'une et de dernière modification pour l'autre. En cas d'erreur, elles retourneront FALSE.
Affichage de la date à laquelle le fichier a été affiché
echo 'Dernier affichage du fichier : ' . date("d M Y",fileatime("test.php")); 
//Affiche Fri Aug 2006, dernière date d'accès au fichier test.
Affichage de la date à laquelle le fichier a été modifié
echo 'Dernière modification du fichier : ' . date("d M Y",filemtime("test.php")); 
//Affiche Fri Aug 2006, dernière date de modification du fichier test.
Pour modifier cette date, on utilise la fonction touch() qui tente de forcer la date de modification du fichier désigné à la date de spécifiée.
Tentative de modification de la date du dernier accès à un fichier
touch("test.php", time(), mktime(0,0,0,1,20,2006)); //Modifie la date du dernier affichage (accès) au 20 janvier 2006
echo date("d M Y",fileatime("test.php"));  //Affiche 20 Jan 2006

Comment écrire un fichier en binaire ?
auteur : Forum PHP
En temps normal, on utilise la fonction fwrite() pour écrire dans un fichier, mais dans ce cas présent nous ne pouvons pas le faire directement car cette fonction prend comme paramètre une chaîne de caractères. Alors, pour obtenir le résultat voulu on va utiliser la fonction pack qui compacte ses arguments dans une chaîne binaire, suivant un format et retourne la chaîne binaire.
Exemple :
$fichier = fopen('out.tst', 'wb+');

$b = pack("c", 0x02); // 0x02 comme char
fwrite($fichier,$b);

$ff=-1.75440;
$b = pack("f", $ff); // $ff comme float
fwrite($fichier,$b);

fwrite($fichier, pack("c", 0x00)); // fonctionne bien sur également sans variable intermédiaire

fclose ($fichier);
PS : Pour obtenir la liste des différents types de formatage, vous pouvez aller sur la page suivante : Caractères de formatage pour pack().


Comment éviter les problèmes de lecture sur les différents systèmes
auteur : titoon
Par défaut, un php tournant sous Windows ou UNIX ne sait pas lire les fichiers MAC, et inversement (un php tournant sous MAC ne sait pas lire un fichier Windows ou UNIX correctement).
Le problème vient des sauts de ligne différents en fonction des systèmes : sous UNIX, par exemple, un fgets (ou fgetcsv) d'un fichier MAC retourne le fichier entier !

Pour éviter ce problème, il suffit juste d'activer l'option "auto_detect_line_endings" de php.ini (éventuellement via la fonction "ini_set()"). L'option est a priori désactivée par défaut (en tout cas pour PHP 4, dans php.ini-dist et php.ini-recommended).


precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com