| 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.
|
| 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 :
Ou
Avec fopen, fread, fclose | $fd = fopen( "mon_fichier.txt", "r" );
$contents = fread( $fd, filesize( $filename ) );
fclose($fd); |
-
Récupération du contenu d'un fichier en ligne :
Ou
Avec fopen, fread, fclose | $fd = fopen($url, 'r');
while(!eof($fd))
{
$contents .= fread($fd, 8192);
}
fclose($fd); |
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 : Tutoriel : Extraction de données sur un site internet avec Php, MySQL et XML, Olivier Népomiachty.
|
| 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.
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.
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) {
echo "<tr><td>".$elem[0]."</td><td>".date("d-m-Y H:i:s",$elem[1])."</td></tr>";
}
echo "</table>"; |
|
| 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:
retournera le tableau suivant:
$ini["prop_1"] = valeur;
$ini["prop_2"] = valeur |
Si l'on rajoute TRUE comme deuxième argument:
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.
|
| 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é.
|
| auteur : Cyberzoide | 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.
|
| 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);
?> |
|
| 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
define('CFG_SYSTEM_FILENAME', 'fichier.ext');
define('CFG_SEND_FILENAME', CFG_SYSTEM_FILENAME);
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');
error_reporting(0);
ini_set('zlib.output_compression', 0);
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');
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.'"');
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');
?> |
|
| auteur : Cyberzoide | La fonction unlink() permet de supprimer un fichier. Elle retourne TRUE si succès, FALSE sinon.
if (unlink("images/logo.png")) {
echo "ok";
} else {
echo "erreur!";
} |
Contrairement à ce qui est indiqué dans la documentation, le fonction "unlink" fonctionne sous Linux et Windows.
|
| auteurs : Forum PHP, Kerod | Pour supprimer massivement des fichiers on utilise le code suivant : foreach(glob("*") as $fichier)
{
@unlink($fichier);
} |
La fonction glob() recherche et retourne un tableau contenant tous les fichiers du dossier
Avec la même fonction, on peut également supprimer des fichiers en précisant leur extension. Exemple : foreach (glob("*.jpg") as $fichier)
{
@unlink($fichier);
} |
|
lien : Comment supprimer un fichier ?
|
| 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...
|
| 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.
|
| auteur : Julp | La fonction getcwd() qui ne prend aucun paramètre renvoie sous forme de chaîne le chemin complet du répertoire courant. |
| 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.
|
| auteur : Forum PHP | Suivant le système d'exploitation, le code à utiliser pour un retour à la ligne n'est pas le même : Attention à bien mettre des guillemets doubles quand vous utilisez ce code en PHP.
|
| auteur : Eric Berger |
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".
|
| 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); |
|
| 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;
?> |
Exemple 2, la chaîne séparatrice des répertoires est connue :
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é.
|
| 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 :
|
lien : Comment extraire le nom de fichier d'un chemin ?
|
| 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";
} |
|
| 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.";
} |
|
| 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.";
} |
|
| auteur : Julp | <?php
$files = array();
$handle = opendir(".");
while($file = readdir($handle)) {
if($file != "." && $file != "..") {
$files[] = $file;
}
}
closedir($handle);
sort($files);
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.
|
| auteur : Cyberzoide | 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.
|
| 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 = date('Y-m-d H:i:s')."\t".$_SERVER['PHP_SELF']."\t".$visitor->get_login()."\t$desc";
if($fp = fopen($ERROR_FILE, "a+")) {
fwrite($fp, $ligne, 1024);
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 !
|
| 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.
|
| 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 :
|
| 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 :
$mime_types = array('image/jpeg','image/gif','text/html','video/mpeg','application/postscript');
$file = $_FILES('mon_fichier');
if(in_array($file['type'], $mime_types)) {
echo "ok";
} else {
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)
|
| 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.
|
| 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.
|
| 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] |
|
| 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 :
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;
}
} |
|
| 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 :
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) :
Il se peut toutefois que cette fonction soit désactivée par
le serveur. Dans ce cas, il existe l'alternative suivante :
|
lien : Comment filtrer les fichiers uploadés sur leur type mime ?
|
| 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"));
|
Affichage de la date à laquelle le fichier a été modifié | echo 'Dernière modification du fichier : ' . date("d M Y",filemtime("test.php"));
|
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.
|
| 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 :
|
| 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).
|
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.
|