<input type="file" > => comment récupérer

Eléphant du PHP | 90 Messages

24 déc. 2005, 03:02

Bonjour,

J'ai 1 formulaire qui me sert à récupérer 1 image sur mon poste local et à la copier sur mon serveur.
Voici un résumé du code de ma page index.php :

<form action="index.php" method="post" enctype="multipart/form-data" name="form1" >
Fichiers à transf&eacute;rer
<input type="file" name="fichier" >
<br><br>
<input type="submit" name="GO" value="Transférer">
</form>

Mon gros pb c'est que je n'arrive pas à récupérer le chemin complet du fichier à transférer. Je trouve bien le nom avec $_FILES['fichier']['name'] mais pas le path, même pas avec pathinfo($_FILES['fichier']['name']).
C'est d'autant plus génant que dans un 2eme temps je propose de copier tout le contenu du répertoire...

Mon deuxième pb c'est que je souhaiterai garder la valeur de file dans mon champ input, même après avoir validé mon formulaire.

MERCI @ tous et JOYEUX NOËL

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 déc. 2005, 03:06

Bonsoir,

Ce que tu cherches à faire est impossible car c'est le fichier qui est envoyé au serveur et non son emplacement sur le disque dur du visiteur.
De plus, pour des raisons de sécurité, il n'est pas possible d'affecter de façon automatique (ni par défaut avec le paramètre value="...") le contenu d'un champ de type input file.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 90 Messages

24 déc. 2005, 03:18

C'est tarrifiant ce que tu me dis...

Comment puis-je faire alors pour choisir 1 fichier sur mon disque local et l'envoyer sur mon serveur ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 déc. 2005, 03:27

Mais non c'est pas si terrifiant que ça ;)

Pour faire simple, je vais tenter de résumer l'utilité de ce champ:

Le champ <input type="file" /> permet a un utilisateur de sélectionner un fichier sur son disque dur local.
Quand il envoie le formulaire, le fichier sélectionné est uploadé sur le serveur distant.
Le script PHP reçoit donc (via la variable $_FILES) le fichier et quelques infos en plus comme son nom, le type renvoyé par le navigateur, etc...

Le chemin complet du fichier sur le disque dur de l'utilisateur ne peut pas être connu par le script PHP.
De plus, seul l'utilisateur peut sélectionner un fichier sur son disque dur (le concepteur de la page ne peut pas pré-remplir ou modifier ce champ)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 90 Messages

24 déc. 2005, 03:44

alors si je fais une copier de $_FILES['fichier']['name'] vers un emplacement de mon serveur, ça va marcher ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 déc. 2005, 04:04

alors si je fais une copier de $_FILES['fichier']['name'] vers un emplacement de mon serveur, ça va marcher ?
Il existe une fonction toute faite ;)
http://fr.php.net/move_uploaded_file
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 90 Messages

24 déc. 2005, 04:30

move_uploaded_file() s'assure que le fichier filename est un fichier téléchargé par HTTP POST => le fait d'avoir sélectionné un fichier par le input de type file, a pour effet de télécharger le fichier ? J'ai tjrs la même question : comment fait le programme pour savoir où aller chercher le fichier à copier ?

Eléphant du PHP | 90 Messages

24 déc. 2005, 04:36

ok, j'ai compris... je suis un peu fatiguée, mais en relisant tes réponse j'ai compris comment il se débrouille... Mais alors, je ne peux pas 'ruser' pour donner l'impression que ça fonctionne comme je le souhaite, cest-à-dire afficher le nom du fichier après la validation du formulaire même si ce n'est pas dans un input ? => faire juste un echo ? Et pour le répertoire source, je vais être obligée de l'imposer pour le cas où l'utilisateur choisisse l'option 'tous les fichiers du même répertoire' ?
Tu vois autre chose ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

24 déc. 2005, 11:58

Mais alors, je ne peux pas 'ruser' pour donner l'impression que ça fonctionne comme je le souhaite, cest-à-dire afficher le nom du fichier après la validation du formulaire même si ce n'est pas dans un input ? => faire juste un echo ?
Si, c'est possible. Tu peux afficher le nom du fichier uploadé mais pas son chemin complet issu du disque dur du visiteur.
Et pour le répertoire source, je vais être obligée de l'imposer pour le cas où l'utilisateur choisisse l'option 'tous les fichiers du même répertoire' ?
Impossible à faire avec un "simple" formulaire HTML.
Tu ne peux récupérer par le biais du HTML+PHP que les fichiers qui ont été sélectionné un par un par l'utilisateur via des champs de type input file. Il est impossible via ces même balises input file d'uploader le contenu de tout un répertoire.

Pour faire ça il faut avoir recours à une applet java.
Quelques pistes (que je n'ai pas testé):
http://jupload.sourceforge.net/
http://www.javazoom.net/applets/jclient ... ad_fr.html
http://www.unlimitedftp.ca/products/uupload/
Quand tout le reste a échoué, lisez le mode d'emploi...

ViPHP
ViPHP | 2144 Messages

24 déc. 2005, 12:02

La raison de ces limitations, c'est la sécurité, sans quoi le vol de fichier à l'insu de l'internaute serait un jeu d'enfant.

Eléphant du PHP | 90 Messages

26 déc. 2005, 05:56

est-ce que si je choisit d'imposer mon répertoire local, par exemple c:/fichier/ et que je veux copier la totalité du contenu vers un répertoire du serveur, sans passer cette fois-ci par les <input type="file"> est-ce que ça peut marcher ? j'ai déjà fait de serveur à serveur, mais là, je ne suis pas sure que php arrive à lire mon répertoire en local car mon test is_dir('c:/fichier/') me renvoie false ;-(( est-ce normal docteur ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 déc. 2005, 11:35

la syntaxe "C:\dir\" est très liée à un environnement Win32 (windows) et si ton serveur distant est un serveur Linux => ça plante

De plus, si ton script est sur ton serveur distant et que tu veux acceder à ton poste local, c'est pas avec C:\ que tu vas y arriver vu que c'est ta vue locale

A mon avis, ce que tu cherches à faire est impossible. Toujours pour des raisons de sécurité.
Tu imagines ? je crée un programme qui copie c:\ de tous les pc qui se connectent sur mon site ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

26 déc. 2005, 11:45

oui effectivement, c'est la raison pour laquelle j'ai pensé que je n'y accèderai pas car sinon c'est comme si je fournissais des fonctionnalités ftp sans avoir de mot de passe pour la connexion ;-(

soit je repense mon histoire, genre transfert fichier par fichier avec le <input type=file> soit avec les applet java...

merci pour tous ces info...

ViPHP
pjl
ViPHP | 2119 Messages

26 déc. 2005, 14:06

Je rapelle quand même qu'il existe déjà tout un tutau sur l'upload : http://www.phpfrance.com/tutoriaux/inde ... e-fichiers

Invité
Invité n'ayant pas de compte PHPfrance

16 avr. 2007, 10:19

Mais alors, je ne peux pas 'ruser' pour donner l'impression que ça fonctionne comme je le souhaite, cest-à-dire afficher le nom du fichier après la validation du formulaire même si ce n'est pas dans un input ? => faire juste un echo ?
Si, c'est possible. Tu peux afficher le nom du fichier uploadé mais pas son chemin complet issu du disque dur du visiteur.
Et pour le répertoire source, je vais être obligée de l'imposer pour le cas où l'utilisateur choisisse l'option 'tous les fichiers du même répertoire' ?
Impossible à faire avec un "simple" formulaire HTML.
Tu ne peux récupérer par le biais du HTML+PHP que les fichiers qui ont été sélectionné un par un par l'utilisateur via des champs de type input file. Il est impossible via ces même balises input file d'uploader le contenu de tout un répertoire.

Pour faire ça il faut avoir recours à une applet java.
Quelques pistes (que je n'ai pas testé):
http://jupload.sourceforge.net/
http://www.javazoom.net/applets/jclient ... ad_fr.html
http://www.unlimitedftp.ca/products/uupload/