2009-11-12 8 views
2

Je développe un script en PHP pour télécharger des fichiers dans une base de données MySQL. Il ya diverses choses qui doivent être sélectionnées en plus du fichier réel qui va dans l'entrée de la base de données. Le script doit être conçu de sorte qu'il vérifie que toutes les sélections appropriées ont bien été effectuées. Si ce n'est pas le cas, le script revient à l'état du fichier de téléchargement avec les valeurs que l'utilisateur a sélectionnées. J'ai accompli cela pour les cases de sélection de l'utilisation de variables de session, mais je ne peux pas comprendre comment obtenir le chemin réel de l'entrée de téléchargement de fichier à publier. Je peux seulement sembler accéder au nom de dossier et pas au chemin réel du tableau $ _FILE. J'ai également essayé de faire ce qui suit:Stocker le chemin d'accès d'un fichier sélectionné par l'utilisateur comme variable de session pour remplir le champ plus tard

echo "<input type='hidden' name='MAX_FILE_SIZE' value='8000000'>"; 
echo "<input type='hidden' name='remote_file_path' value=''>"; 
echo "<input name='userfile'type='file' 
     onchange='document.uploadForm.remote_file_path.value=this.value;'>"; 

Naturellement, le nom du formulaire est "uploadForm". Cela fonctionne, mais encore une fois en accédant à la valeur de $ _POST ['remote_file_path'], je reçois seulement le nom de fichier et pas le chemin. Après quelques recherches, il semble qu'il s'agisse d'une fonctionnalité de sécurité intégrée à Fire Fox. Je commence à penser que cela ne peut pas être fait.

Merci d'avance.

Répondre

4

Vous ne pouvez pas remplir la zone de texte de sélection de fichier pour des raisons de sécurité, comme vous l'avez découvert. Cependant, vous n'avez pas vraiment besoin de remplir la zone de texte du fichier pour conserver les fichiers téléchargés.

Chaque fois, un fichier est téléchargé sur votre serveur, déplacé vers un emplacement sécurisé et également lié à la session en cours ou à l'utilisateur. Maintenant, lorsque vous réaffichez le formulaire parce que l'utilisateur a fait une erreur (ou veut éditer quelque chose), affichez le nom de fichier à côté de la boîte de fichier vide. De cette façon, l'utilisateur peut voir quels fichiers ont déjà été téléchargés. Avec un peu de JavaScript, vous pouvez donner à l'utilisateur la possibilité de rayer le nom de fichier sur lequel il peut remplir à nouveau la zone de texte du fichier et soumettre un autre fichier qui sera traité sur le serveur. Si la case est vide, le fichier soumis précédemment sera considéré comme valide et traité.

+0

Donc, une fois qu'un fichier est téléchargé, il reste dans le répertoire tmp sur le serveur jusqu'à ce qu'il soit remplacé par un autre fichier téléchargé? Ce qui signifie que $ _FILES ['userfile'] ['tmp_name'] conserverait le même répertoire sur un deuxième message du formulaire par utilisateur tant qu'aucun nouveau fichier n'a été sélectionné via l'entrée? – dbaugh

+1

Pas exactement. $ _FILES ['userfile'] ['tmp_name'] serait vide ou remplacé par un nouveau fichier selon que quelque chose a été téléchargé ou non.C'est pourquoi le fichier d'origine doit être déplacé vers un autre emplacement sécurisé, lui donner un nom unique et enregistrer le nom dans la session en cours. Si un nouveau fichier est téléchargé, supprimez l'ancien et traitez le plus récent, sinon trouvez le nom du fichier stocké dans la session, saisissez le fichier et poursuivez le traitement ultérieur. –

0

Vous n'avez pas besoin les champs cachés, PHP analyser les données affichées pour vous et présentez dans le tableau $ _FILES:

http://www.php.net/manual/en/features.file-upload.post-method.php

+0

Le tableau $ _FILES donne uniquement le nom du fichier et non le chemin. J'essayais de contourner le problème. – dbaugh

+0

De la documentation: $ _FILES ['userfile'] ['nom'] - Le nom d'origine du fichier sur l'ordinateur client. –

2

Vous ne recevez pas chemin complet du fichier (en certains navigateurs), et ne peut pas changer une valeur <input type=file> (par le biais de scripts) dans l'un d'entre eux, car ces actions posent comme problèmes de sécurité.

+0

donc il n'y a aucun moyen de le faire? – dbaugh

+0

Pour autant que je sache, non –

0

Comme beaucoup l'ont dit, vous ne pouvez pas c'est un problème de sécurité via HTTP. Ce qui se passe lorsque vous téléchargez une image à partir d'une machine locale, c'est que la fonction se déclenche et crée le tmp_name à accéder au serveur.

Cependant, si vous voulez vraiment cette fonctionnalité, vous pouvez utiliser Java pur via une applet pour obtenir un chemin local. Cependant, qu'essayez-vous de faire, il se peut qu'il y ait une meilleure façon de s'y prendre plutôt que ce que vous pensez.

Questions connexes