Outil "parcourir" / choix de fichiers pour formulaire

Soyez le premier à donner votre avis sur cette source.

Vue 12 407 fois - Téléchargée 1 190 fois

Description

Vous désirez avoir un champ contenant le chemin d'un fichier du serveur dans un formulaire. Ce script "Parcourir" permet de choisir un fichier sur le serveur grâce à un explorateur PHP (basé sur le code de DHKold) et d'inclure automatiquement le chemin dans le formulaire.
    • MAJ du 04/05/2003 **

- simplification du code
- permet désormais de filtrer les fichiers à afficher pour la sélection (ex: n'afficher que les fichiers jpg et gif)
- permet de sélectionner un répertoire complet
- les répertoires sont gérés en chemin relatif
- possibilité de voir directement le contenu d'un fichier
- l'exploration est limitée en profondeur pr éviter de parcourir les répertoire jusqu'à la racine

CEPENDANT, CE SCRIPT EST SENSIBLE ET DANGEREUX SI IL EST UTILISE SANS PRECAUTIONS !!!
(perso, je l'utilise en backoffice protégé par mot de passe)

pour tester ce code chargez le zip qui contient un formulaire de test, les images et la feuille de style.

Toutes contributions, modifications, suggestions sont bienvenues.

ce code est basé sur un script de DhKold (http://www.phpcs.com/article.aspx?Val=345)

Source / Exemple :


<HTML>
<HEAD>
<LINK rel=stylesheet type="text/css" href="style_browser.css">
<script language="JavaScript">
<!--
function Reporter(choix) {
	window.opener.document.forms["<? echo $form; ?>"].elements["<? echo $textfield; ?>"].value=choix;
	window.close();
}

//-->
</script>
</HEAD>
<BODY>
<?

function cmp($ar1, $ar2, $key)
{
    return ( (strtoupper($ar1[$key]) > strtoupper($ar2[$key])) ? 1 : ( (strtoupper($ar1[$key]) == strtoupper($ar2[$key])) ? 0 : -1));
}

function trier($array, $critere)
{
    $cmp = create_function('$a, $b', 'return cmp($a, $b, "'.$critere.'");');
    uasort($array, $cmp);
    return $array;
}

function relative_url($chemin,$base_root) {
	return "/".str_replace($base_root,"",$chemin);
}

/*********************************

  • BROWSER / SELECTION DE FICHIER *
arguments: $form: le nom du formulaire où reporter la sélection $textfield: le nom du champ où reporter la sélection $action: le type des fichier à sélectionner, on peut afficher plusieurs types de fichiers on concatenant à l'aide de |, mettre les extensions en minuscule ex: afficher les images JPG|GIF Pour effectuer une selection de dossier $action=directory (les fichiers sont qd même affichés) $chemin: répertoire de base pour le parcourt, le parcourt sera limité en profondeur à ce rep $tri: le tri s'effectue: - "n": le nom du fichier - "t": le type - "s": la taille - "d": la date de modif
  • /
//si le chemin est vide, on prend le repertoire courant if (!isset($chemin)) { //on récupère le chemin du répertoire courant //on remplace les "\" par "/" pour éviter les soucis liés a Windows/Unix $chemin = "./"; } if (!isset($base_root)) { $base_root=$chemin; } //si l'action n'est pas précisé, l'action par défaut est la sélection d'image if (!isset($action)) { $action=""; } if ($action!="") { //on récupère tous les types à afficher $types_affiches= explode("|", $action); } echo "<TITLE>".relative_url($chemin,$base_root)."</TITLE>"; echo "<H2>".relative_url($chemin,$base_root)."</H2>"; //si l'action est la sélection de dossier on ajoute un lien de sélection if ($action=="directory") echo "<p><A HREF=\"javascript:void(0)\" onClick=\"Reporter('". relative_url($chemin,$base_root) ."');\">Sélectionner ce dossier</A></p>" ; //on ouvre le répertoire $dir = opendir($chemin); rewinddir($dir); $typ = array("file" => "Fichier","dir" => "Dossier","0" => "Inconnu"); //on affiche la petite icône du tri if ($tri == "n") $imgn = "<IMG SRC=images/ordo.gif>"; elseif ($tri == "t") $imgt = "<IMG SRC=images/ordo.gif>"; elseif ($tri == "s") $imgs = "<IMG SRC=images/ordo.gif>"; elseif ($tri == "d") $imgd = "<IMG SRC=images/ordo.gif>"; echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADING=0>\n<TR BGCOLOR=#CCCCCC><TD WIDTH=150><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin&tri=n&action=$action&base_root=$base_root\">Nom</A>$imgn</TD><TD ALIGN=CENTER><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin&tri=t&action=$action&base_root=$base_root\">Type</A>$imgt</TD><TD WIDTH=100 ALIGN=RIGHT><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin&tri=s&action=$action&base_root=$base_root\">Taille</A>$imgs</TD><TD WIDTH=200 ALIGN=RIGHT><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin&tri=d&action=$action&base_root=$base_root\">Dernière modification</A>$imgd</TD></TR>"; //le chemin du dossier père $chemin_pere = strtr(dirname($chemin)."/","\\","/"); //on parcourt les fichiers $index = 0; $tab=array(); while ($fichier = readdir($dir)) { // DOSSIER PERE if ($fichier == "..") { //bloque si on est au max de l'arborescence (le répertoire de base) if ($chemin != $base_root) echo "<TR><TD COLSPAN=4><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin_pere&tri=$tri&action=$action&base_root=$base_root\"><IMG SRC=\"images/ret.gif\" BORDER=0> ..</A></TD>\n"; } // DOSSIER FILS elseif (is_dir($chemin.$fichier)) { if ($fichier != ".") { $tab[$index]["n"] = $fichier; $tab[$index]["t"] = "dossier"; $tab[$index]["s"] = ""; $tab[$index]["d"] = filemtime($chemin.$fichier); $index++; } } // FICHIER elseif (is_file($chemin.$fichier) ) { $ext = strtolower(substr($fichier,strrpos($fichier,".")+1,strlen($fichier)-strrpos($fichier,".")-1)); //si l'extension correspond aux types affiches if (($action!="" && in_array($ext,$types_affiches)) || ($action=="") || ($action=="directory")) { if (! is_file("images/ico_browser/$ext.gif")) $ico = "file"; if (strtoupper($ext) == substr(strtoupper($fichier),1)) $ext = ""; $taille += filesize($chemin.$fichier); $tab[$index]["n"] = $fichier; $tab[$index]["t"] = "fichier ".strtoupper($ext); $tab[$index]["s"] = filesize($chemin.$fichier); $tab[$index]["d"] = filemtime($chemin.$fichier); $index++; } } } //tri par nom par défaut if ($tri == "") $tri = "n"; $tab=trier($tab,$tri); while (list($key,$ligne)=each($tab)) { $fname=$ligne["n"]; $ftype=$ligne["t"]; $fsize=$ligne["s"]; $fdate=$ligne["d"]; $fext = strtolower(substr($fname,strrpos($fname,".")+1,strlen($fname)-strrpos($fname,".")-1)); // si l'image n'existe pas, on affiche l'icone par défaut if (! is_file("images/ico_browser/$fext.gif")) $fext = "file"; if (is_dir($chemin.$fname)) echo "<TR><TD nowrap><A HREF=\"?form=$form&textfield=$textfield&chemin=$chemin$fname/&tri=$tri&action=$action&base_root=$base_root\"><IMG SRC=\"images/dir.gif\" BORDER=0> $fname </A></TD><TD WIDTH=75 ALIGN=CENTER>".$ftype."</TD><TD></TD><TD WIDTH=200 ALIGN=RIGHT>".date("d/m/Y h:i:s",$fdate)."</TD></TR>\n"; elseif (is_file($chemin.$fname)) if ($action!="directory") echo "<TR><TD nowrap><A HREF=\"javascript:void(0)\" onClick=\"Reporter('". relative_url($chemin.$fname,$base_root) ."');\"><IMG SRC=\"images/ico_browser/$fext.gif\" BORDER=0> $fname </A><A HREF=\"$chemin$fname\" target=\"_blank\"><IMG SRC=\"images/loupe.gif\" BORDER=0></A></TD><TD WIDTH=75 ALIGN=CENTER>".$ftype."</TD><TD ALIGN=RIGHT>".number_format(($fsize/1000), 3, ","," ")." Ko</TD><TD WIDTH=200 ALIGN=RIGHT>".date("d/m/Y h:i:s",$fdate)."</TD></TR>\n"; else echo "<TR><TD nowrap><IMG SRC=\"images/ico_browser/$fext.gif\" BORDER=0><font face=\"Times New Roman, Times, serif\" size=\"2\" color=\"#000000\">$fname </font><A HREF=\"$chemin$fname\" target=\"_blank\"><IMG SRC=\"images/loupe.gif\" BORDER=0></A></TD><TD WIDTH=75 ALIGN=CENTER>".$ftype."</TD><TD ALIGN=RIGHT>".number_format(($fsize/1000), 3, ","," ")." Ko</TD><TD WIDTH=200 ALIGN=RIGHT>".date("d/m/Y h:i:s",$fdate)."</TD></TR>\n"; } $taille = ($taille/1000); echo ("<TR BGCOLOR=#999999><TD COLSPAN=3 ALIGN=RIGHT><FONT COLOR=#DDDDDD><B>".number_format($taille, 3, ","," ")." Ko</B></FONT></TD><TD></TD><TD></TD></TR>"); echo ("<TR BGCOLOR=#999999><TD COLSPAN=3 ALIGN=RIGHT></TD><TD></TD><TD></TD></TR>"); echo ("</TABLE><BR>"); ?> </BODY> </HTML>

Conclusion :


En gros c simple: le bouton du formulaire ouvre une popup en javascript contenant l'explorateur php. Grâce à un petit bout de code en javascript, un clic sur un fichier mets à jour la fenêtre principale contenant le formulaire. Fermez la fenêtre de l'explorateur et soumettez votre formulaire
    • MAJ du 04/05/2003 **

les paramètres d'appel de la page php sont:

form: le nom du formulaire qui contient le texfield où reporter la sélection

textfield: le nom du champ où reporter la sélection

action: le mode de sélection, par défaut l'appli affiche tous les fichiers. pour n'afficher qu'un type de fichier, action=type_du_fichier (ex: action=jpg) avec possibilité d'afficher plusieurs types avec '|' (ex: action=jpg|gif)
- action=directory pour sélectionner un dossier

chemin: répertoire de base pour le parcourt, le parcourt sera limité en profondeur à ce repertoire

tri:
- tri=n: sur le nom du fichier
- tri=t: le type
- tri=s: la taille
- tri=d: la date de modif
par défaut le tri s'effectue sur le nom de fichier

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_jacques-antoine
Messages postés
79
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
22 mai 2017
-
ave, dpitard
ce source m'a mis l'eau à la bouche : ça fait des jours que je cherche un truc similaire. Mon but est de, à partir d'un formulaire de saisie de pièces jointes, de récupérer le chemin complet du fichier à joindre et, bien sûr, son nom. Jusque là, je suis planté parce qu'aucun exemple de mail à pièce jointe, que j'ai pu pêcher ici ou là, n'aborde l'aspect de la récupération du chemin alors, quand on envoie le message avec juste le nom du fichier...

Bon, donc j'ai récupéré ton petit et je l'ai bidouillé à ma sauce, juste pour éviter les injures dues aux variables inconnues. Ouch! Je viens de voir la date des messages... Je suis un brin à la bourre.

Bref, après modifs, ça m'a l'air de coller sauf que :
- je n'arrive pas à parcourir les répertoires : je reste toujours scotché au même endroit (C:/), puisque les fichiers à joindre sont chez l'utilisateur, il doit pouvoir parcourir toutes ses arborescences,
- rien ne se passe quand je clique sur un nom, que ce soit un répertoire ou un fichier...

Est-ce que tu pourrais me dire où j'ai fait une connerie? Parce qu'il y en a forcément une...
Merci d'avance

J-A

Les fichiers :
**********************************************
le htm (non modifié sauf son nom)
=============================


Choix d'un fichier















=============================

**********************************************
le browser : j'ai aussi ajouté ce qu'il faut pour avoir une fenêtre plus grande, de façon à ce que le type apparaisse sur une seule ligne et que plus de lignes soient affichées.
=============================









large_fen = 700
haute_fen = 600
large_ecran = window.screen.width
haute_ecran = window.screen.height
px= (large_ecran - large_fen) / 2
py= (haute_ecran - haute_fen) / 2
self.resizeTo(large_fen,haute_fen)
self.moveTo(px,py)

theboubourse
Messages postés
41
Date d'inscription
mercredi 30 janvier 2008
Statut
Membre
Dernière intervention
6 mars 2008
-
bonjour moi je souhaiterai juste pouvoir lire les fichier car on a la posibilité de sauvegardé.
j'ai fé un test sous easyPhp 1.8 et mon fichier word et modifié donc pas cool car le fichier normalement se trouve sur le serveur
si vs avé la solution merci
Beldom
Messages postés
1
Date d'inscription
jeudi 12 juillet 2007
Statut
Membre
Dernière intervention
12 juillet 2007
-
Bonjour ;)
J'ai le même problème que Thomas84, et je peux vous assurer que mon serveur supporte le php, que je bosse bien dessus, etc ^^
En effet, je suis sur une appli en php et ce script correspond parfaitement à ce que je cherche à faire d'après ce que j'en ai lu.
Si il ya une solution, elle m'interesse, sinon, je vais me débrouiller :)
AlBud
Messages postés
49
Date d'inscription
mardi 18 juin 2002
Statut
Membre
Dernière intervention
19 décembre 2006
-
Salut,
très bon code c'est exactement ce que je cherchais, mais il ne marche pas bizarrement en local chez moi avec la config : easyphp 1.8 : apache 1.3.33 - php 4.3.10
j'ai déjà dû déclaré les variables car j'avais un message "non défini", mais en cliquant sur le bouton du browser la fenêtre s'ouvre mais le clic ne fonctionne pas, impossible d'aller dans un répertoire ou de choisir un fichier, la fenêtre ne se ferme pas.
Tout en bas j'ai le message "erreur sur la page" et quand j'active le déboggueur IE il me dit à la ligne 7 : chaîne non terminée
window.opener.document.forms["<? echo "$form"; ?>"].elements["<? echo "$textfield"; ?>"].value=choix;
??
Je ne vois pourtant pas d'erreur les seconds " sont inclus dans un code php
quelqu'un a t-il une solution car toujours testés sur le serveur c'est pas super.
Merci,
Ranx

à quand une maj permettant par exemple de faire un upload ??
cs_iubito
Messages postés
629
Date d'inscription
mercredi 3 juillet 2002
Statut
Membre
Dernière intervention
9 octobre 2006
-
même réponse que sur l'autre script
http://www.phpcs.com/code.aspx?ID=13073

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.