Récupérer le chemin complet d'un fichier sur un serveur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Récupérer le chemin complet d'un fichier sur un serveur

par Luke Sonore » 05 sept. 2008, 11:30

Bonjour Sadeq,

Merci beaucoup pour ta réponse et la correction du script.
Ta proposition répond parfaitement au besoin que j'exprime.
Je vais la mettre en balance avec la solution proposée par @rthur.

Merci encore :)
Cordialement,
LS

par sadeq » 05 sept. 2008, 10:34

Voici la mise à jour de ce script pour qui ça intéresse :
<?php
function explorer($dir="", $types="") { 
    $file_list = ''; 
    $stack[] = $dir; 
    while ($stack) { 
        $current_dir = array_pop($stack); 
        //Parcourir le dossier
        if ($dh = opendir($current_dir)) { 
            while (($file = readdir($dh)) !== false) { 
                if ($file !== '.' AND $file !== '..') { 
                    $current_file = "{$current_dir}/{$file}"; 
                    if (is_file($current_file)) {
                        //Appliquer s'il existe, le filtre de sélection du fichier
                        if (!empty($types)){
                            //correction du filtre pour l'expression régulière. format attendu:(ext|ext|...)
                            $types = preg_replace("#\.#"," ", $types); //éliminer les .
                            $types = trim(preg_replace("#,+|;+|\s+|\++#","|", $types)); //remplacer séparateurs possibles par |
                            //sélection filtrée
							if (!preg_match("#.($types)$#", $file)) continue;
                        }
                        //
						$file_list["$current_dir"][] = array ( 
									"url" => "{$current_dir}/{$file}" , 
									"infos" => pathinfo("{$current_dir}/{$file}") ,									
									"size" => filesize("{$current_dir}/{$file}"),
									"date_modif" => date("d-m-Y H:i:s", filemtime("{$current_dir}/{$file}")),
									"perms" => getPermissions("{$current_dir}/{$file}"),
								); 
                        
                    } elseif (is_dir($current_file)) {
                        //Pour explorer le sous-dossier 
                        $stack[] = $current_file; 
                    } 
                } 
            } 
        } 
    } 
    return $file_list; 
}
function trier($file_list=array(), $ordre="ASC"){
    //Trier la liste par l'ordre donné (par défaut ASC: croissant)
    if ($file_list && is_array($file_list)){
        if (strtoupper($ordre)!= "DESC") array_multisort($file_list, SORT_ASC);
        else array_multisort($file_list, SORT_DESC);
    }
    return $file_list;
}
function getPermissions($file){
if (!file_exists($file)) return null;
$perms = fileperms($file);
//
if (($perms & 0xC000) == 0xC000) {
    // Socket
    $info = 's';
} elseif (($perms & 0xA000) == 0xA000) {
    // Lien symbolique
    $info = 'l';
} elseif (($perms & 0x8000) == 0x8000) {
    // Régulier
    $info = '-';
} elseif (($perms & 0x6000) == 0x6000) {
    // Block spécial
    $info = 'b';
} elseif (($perms & 0x4000) == 0x4000) {
    // Dossier
    $info = 'd';
} elseif (($perms & 0x2000) == 0x2000) {
    // Caractère spécial
    $info = 'c';
} elseif (($perms & 0x1000) == 0x1000) {
    // FIFO pipe
    $info = 'p';
} else {
    // Inconnu
    $info = 'u';
}

// Propriétaire
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
            (($perms & 0x0800) ? 's' : 'x' ) :
            (($perms & 0x0800) ? 'S' : '-'));

// Groupe
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
            (($perms & 0x0400) ? 's' : 'x' ) :
            (($perms & 0x0400) ? 'S' : '-'));

// Tous
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
            (($perms & 0x0200) ? 't' : 'x' ) :
            (($perms & 0x0200) ? 'T' : '-'));

return $info;
}
//Test
if (!$_GET["dir"]) {
    //Rappel de l'usage correct (paramètres obligatoires)
    echo "<p><b><u>Usage:</u></b> explorer.php?dir=lecteur:[/dossier/dossier/...][&types=ext|ext|...][&ordre=ASC|DESC]";
    exit;
}
//Explorer et trier le chemin donné
$dir = trier(explorer($_GET["dir"], $_GET["types"]), $_GET["ordre"]); //paramètres reçus du navigateur
//Afficher le résultat
echo "<pre><h1>Contenu de $_GET[dir]</h1>";
print_r($dir);
echo "</pre>"; 
?>

par B.Moncef » 05 sept. 2008, 06:39

Question : Pourquoi utiliser eregi() ? preg_match() est pourtant plus rapide, et s'il a plusieurs fichiers, ça peut influencer un peu la rapidité du script non ?

par sadeq » 04 sept. 2008, 23:13

Voici le contenu du message pour faire simple :
Voici un explorateur de dossiers et de fichiers d'un chemin disque donné.
Le résultat est une liste hiérarchique dont les noeuds principaux sont les dossiers et les noeuds finaux sont les fichiers.

Structure :
[lecteur ou chemin de départ]
|
|____ [sous dossier ]
|--------------|
|--------------|___ [0] fichier 0
|--------------|___ [N] fichier N
|
|____ [sous dossier N]
|--------------|
|--------------|___ [sous dossier 1]
|--------------|----------|
|--------------|----------|___ [0] fichier 0
|--------------|----------|___ [N] fichier N
|--------------|
|--------------|___ [sous dossier N]
|
|____ [0] fichier 0
|____ [N] fichier N

Programme php:
<?php
function explorer($dir="", $types="") { 
    $file_list = ''; 
    $stack[] = $dir; 
    while ($stack) { 
        $current_dir = array_pop($stack); 
		//Parcourir le dossier
        if ($dh = opendir($current_dir)) { 
            while (($file = readdir($dh)) !== false) { 
                if ($file !== '.' AND $file !== '..') { 
                    $current_file = "{$current_dir}/{$file}"; 
                    if (is_file($current_file)) {
						//Appliquer le filtre de sélection du fichier s'il existe
						if (!empty($types)){
							//correction du filtre pour l'expression réguliaire. format attendu:(ext|ext|...)
							$types = preg_replace("#\.#"," ", $types); //éliminer les .
							$types = trim(preg_replace("#,+|;+|\s+|\++#","|", $types)); //remplacer séparateurs possibles par |
							if (eregi(".($types)$", $file)) $file_list["$current_dir"][] = "{$current_dir}/{$file}"; //sélection filtrée
						}
						else $file_list["$current_dir"][] = "{$current_dir}/{$file}"; //sélection sans filtrage
						
                    } elseif (is_dir($current_file)) {
						//Pour explorer le sous-dossier 
                        $stack[] = $current_file; 
                    } 
                } 
            } 
        } 
    } 
    return $file_list; 
}
function trier($file_list=array(), $ordre="ASC"){
	//Trier la liste par l'ordre donné (par défaut ASC: croissant)
	if ($file_list && is_array($file_list)){
		if (strtoupper($ordre)!= "DESC") array_multisort($file_list, SORT_ASC);
		else array_multisort($file_list, SORT_DESC);
	}
	return $file_list;
}

//Test
if (!$_GET["dir"]) {
    //Rappel de l'usage correct (paramètres obligatoires)
	echo "<p><b><u>Usage:</u></b> explorer.php?dir=lecteur:[/dossier/dossier/...][&types=ext|ext|...][&ordre=ASC|DESC]";
	exit;
}
//Explorer et trier le chemin donné
$dir = trier(explorer($_GET["dir"], $_GET["types"]), $_GET["ordre"]); //paramètres reçus du navigateur
//Afficher le résultat
echo "<pre><h1>Contenu de $_GET[dir]</h1>";
print_r($dir);
echo "</pre>";

?>

par Luke Sonore » 04 sept. 2008, 22:53

Il marche chez moi en tout cas ;)
non désolé...j'obtiens un formulaire de login.
Une fois loggé, un message m'informe que "le message ou le sujet demandé n'existe pas" :?

par @rthur » 04 sept. 2008, 22:06

Voici un lien, ou il y a une ébauche de solution pour explorer des fichiers : http://www.phpfrance.com/forums/voir_su ... plorer.php
Ton lien ne marche pas on dirait...
Il marche chez moi en tout cas ;)

par Luke Sonore » 04 sept. 2008, 10:45

Voici un lien, ou il y a une ébauche de solution pour explorer des fichiers : http://www.phpfrance.com/forums/voir_su ... plorer.php
Ton lien ne marche pas on dirait...

par sadeq » 04 sept. 2008, 10:31

Voici un lien, ou il y a une ébauche de solution pour explorer des fichiers : http://www.phpfrance.com/forums/voir_su ... plorer.php

par Luke Sonore » 04 sept. 2008, 10:10

Salut @rthur,
Point de départ:
http://fr.php.net/glob
cette solution m'a l'air très interessante. Merci pour cette suggestion, je vais étudier ça de près.

A+

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par @rthur » 03 sept. 2008, 19:57

Mais pour ta 2ème suggestion (reproduction de l'arborescence réseau), pourais-tu stp me préciser la chose?
Point de départ:
http://fr.php.net/glob

Regarde les exemples laissés dans les commentaires ça sera plus parlant.
Si ton arborescence est peu importante, tu peux utiliser les exemples qui utilisent la récursivité pour parcourir les sous-répertoires.
Si ton arborescence est importante, il conviendra d'utiliser plutôt de l'Ajax pour charger le contenu des répertoires à la demande.

Dans les 2 cas, tu peux utiliser glob() pour la partie PHP :)

par Luke Sonore » 03 sept. 2008, 15:01

Je comprends ce que tu veux faire : tu veux transmettre seulement le chemin d'accès (réseau) + le nom du fichier sélectionné que ton script traite puisque tu es dans un INTRANET et non INTERNET.
Oui, c'est exactement ça :D

par sadeq » 03 sept. 2008, 13:01

Bonjour Sadeq,

Pas vraiment. ....
....
Ceci n'arrange donc pas mes affaires, puisque je ne souhaite pas faire d'upload.
A moins (mais là ça me parait tordu...) que d'empêcher le fichier d'être uploadé...mais bof...ca me paraît vraiment bancal....
Ok, l'Input File est dans ce cas grillé car non seulement il ne sert que pour un upload mais aussi, coté serveur il n'envoi pas le chemin complet d'origine mais seulement le nom propre et les données contenues.

Je comprends ce que tu veux faire : tu veux transmettre seulement le chemin d'accès (réseau) + le nom du fichier sélectionné que ton script traite puisque tu es dans un INTRANET et non INTERNET.

Pour cela il faut personnaliser mais pour l'instant je ne peux dire comment j'ai pas le temps ... A+ tard

par Luke Sonore » 03 sept. 2008, 12:21

Bonjour,
Tu souhaites faire quoi alors ? traiter le fichier directement sur le pc du visiteur ?
Je souhaite simplement accéder aux informations contenues dans le fichier pour pouvoir les stocker en base.
Mais encore une fois, la récupération des données et leur stockage (étape 6) n'est pas le problème, puisque j'ai déjà rédigé le script permettant de faire celà.

par B.Moncef » 03 sept. 2008, 10:34

Ceci n'arrange donc pas mes affaires, puisque je ne souhaite pas faire d'upload.
Tu souhaites faire quoi alors ? traiter le fichier directement sur le pc du visiteur ?

par Luke Sonor » 03 sept. 2008, 09:49

Bonjour Sadeq,

Si la 6 est résolue alors tu as terminé car les étapes de 1 à 5 sont des fonctions intégrées dans le champ INPUT de type FILE
Pas vraiment. L'étape 6 consiste à traiter les informations du fichier choisit. C'est un autre script. Pour le rédiger, j'ai ecrit en dur le chemin du fichier afin que le script sache où travailler. Et ce script fonctionne parfaitement. Le problème (tu l'auras compris) c'est que le fichier doit pouvoir être choisi dynamiquement par l'utilisateur. D'ou les points 1 à 5.

Merci pour tes infos sur le input file, mais je connaissais tout ça.
D'après la documentation, lorsque le input file est rempli (avec le chemin du fichier) et que l'on valide le formulaire contenant l'input, le fichier est immédiatement traité, puisque qu'il est copié en tant que fichier temporaire sur le serveur (en attente de déplacement vers sa destination finale). Ce n'est donc pas le chemin complet du fichier qui est considéré, mais seulement le fichier contenu dans ce repertoire temporaire.
Ceci n'arrange donc pas mes affaires, puisque je ne souhaite pas faire d'upload.
A moins (mais là ça me parait tordu...) que d'empêcher le fichier d'être uploadé...mais bof...ca me paraît vraiment bancal....