Bloquer saisie manuelle dans input de type=file

Eléphant du PHP | 134 Messages

13 déc. 2007, 17:13

Bonjour,


En fait j'ai réussi a faire cela mais il n'y a que dans Firefox que ça fonctionne.

Code : Tout sélectionner

<input type="file" id="myfile" name="myfile" onkeyup="this.value='';" />
Sous IE on peut noter tout ce qu'on veut dans le champ de saisie.
J'ai testé avec onkeypress, onchange, onfocus ... niet!

Donc je vous demande comment bloquer la saisie sous IE ?

Merci d'avance,
Devether.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 déc. 2007, 17:43

As-tu essayé les attributs readonly ou disabled selon ce que tu veux faire ? :)

(ca fonctionnera également sous FF sans que tu n'ais besoin de coller de js)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
AB
ViPHP | 5818 Messages

13 déc. 2007, 17:43

disabled="disabled"

Edit Encore grillé par Ryle!
Modifié en dernier par AB le 13 déc. 2007, 17:44, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 déc. 2007, 17:43

Apparemment tu assaies de reproduire l'effet readonly ou disabled

Si je me rappel bien avec "disabled" il n'y a pas de valeur POST envoyée après validation contrairement à "readonly".

EDIT: Joli tir goupé les gars 8-)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 déc. 2007, 17:44

Mouah ah ah !!
Vous n'êtes pas assez rapides, bande de petits scarabés !! ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

13 déc. 2007, 17:48

J'ai cherché un lien pour appuyer mes propos m'a fait perdre du temps... :^o

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
AB
ViPHP | 5818 Messages

13 déc. 2007, 17:56

La ç'est encore plus parlant :
<body>
<form action="" method="post">
<p>
<input type="text" disabled="disabled" name="disabled" value="YES" />
<input type="text" readonly="readonly" name="readonly" value="YES" />
<input type="submit" value="ok" name = "ok" />
</p>
</form>

<?php !empty($_POST)? print_r($_POST) :'';?>
</body>
:)

Eléphant du PHP | 134 Messages

13 déc. 2007, 18:31

J'y avais déja pensé :wink:
Mais je vous rappelle qu'il est question d'un input de type "file".
Les readonly et disabled empechent le clic sur "Parcourir..."

Ce que je veux c'est pouvoir choisir un fichier avec le bouton "Parcourir..." mais qu'il soit impossible d'entrer le chemin d'un fichier à la main.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

14 déc. 2007, 00:41

:lol: Ok triple boulays... :oops:

Le type file est en effet très spécial (em****ant).
Il n'est jamais traité de la même manière suivant le navigateur.
J'avoue même jamais pensé à faire une telle vérification :-k

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

14 déc. 2007, 09:02

Quelle est la raison de cette vérification ?
Est-ce que, si tu saisis du texte "à la main", des données POST sont envoyées ?
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

Eléphant du PHP | 134 Messages

14 déc. 2007, 10:51

Quelle est la raison de cette vérification ?
Est-ce que, si tu saisis du texte "à la main", des données POST sont envoyées ?
Les données POST sont envoyées quand on clique sur un bouton télécharger. Je fais bien une verification de l'extension du fichier avant l'envoi mais il y a un autre problème qui se pose si l'extension est bonne.

Ex : je tape dans le champ "toto.jpg" (jpg étant autorisé) qui n'existe pas, et bien il me créer un fichier "toto.jpg" de 0 octet.
Je pourrais faire un test coté serveur sur les fichiers de 0 octet mais j'aurais aimé qu'on ne puisse rien écrire dans le champ...
impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

14 déc. 2007, 11:29

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop
Ah ben un peu oui !! C'est surtout n'importe quoi si FF te permet de manipuler les données à l'intérieur de ce champ... ça veut dire qu'au moment de l'envoi du formulaire, tu pourrais regarder la valeur du champ, voir s'il s'agit un systeme windows ou unix, et modifier la valeur pour spécifier n'importe quel fichier qui se trouverait sur le disque de l'utilisateur à son insu ? :shock:

J'vois pas vraiment de solution à ton problème.. si l'utilisateur met n'importe quoi dans les champs d'un formulaire, tu te retrouves avec n'importe quoi comme données... Le mieux c'est dans ton contrôle de données envoyées (que tu ne manques naturellement pas de faire en php ;)), est de vérifier avant de faire le move_upload_file() qu'il n'y a pas eu d'erreur d'upload (ou que le fichier ne fait pas 0ko, mais de mémoire y a une erreur adaptée)

En contournement, tu dois pouvoir utiliser un upload de fichier avec flash (en recherchant les scripts de gestion d'upload multiples, tu dois pouvoir en trouver facilement) qui ne proposeront généralement pas l'accès en saisie à un champ texte...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 134 Messages

14 déc. 2007, 12:59

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop
Ah ben un peu oui !! C'est surtout n'importe quoi si FF te permet de manipuler les données à l'intérieur de ce champ... ça veut dire qu'au moment de l'envoi du formulaire, tu pourrais regarder la valeur du champ, voir s'il s'agit un systeme windows ou unix, et modifier la valeur pour spécifier n'importe quel fichier qui se trouverait sur le disque de l'utilisateur à son insu ? :shock:
Effectivement mais c'est pourtant le cas :twisted:

Le mieux c'est dans ton contrôle de données envoyées (que tu ne manques naturellement pas de faire en php ;)), est de vérifier avant de faire le move_upload_file() qu'il n'y a pas eu d'erreur d'upload (ou que le fichier ne fait pas 0ko, mais de mémoire y a une erreur adaptée)
Oui je savais que je pouvais faire comme ça mais je voulais évité que ce soit le serveur qui effectue le test.
Enfin bref c'est ce que j'ai fais :
- Mon formulaire de téléchargement envoi les données POST vers une iframe qui affiche la liste des fichiers uploadés.
<form name="up_form" id="up_form" target="ifra" method="post" enctype="multipart/form-data" action="upload.php">
...
<iframe id="ifra" name="ifra"></iframe>
- Dans mon script d'upload je met une variable à true si le fichier est <0 octet en empéchant sa copie dans le répertoire de destination.
if ($_FILES['myfile']['size'] > 0) {
   $zerofile = false;
}
else {
   $zerofile = true;
}
- J'envoi cette variable vers ma fonction de remplissage de l'iframe.
list_files($init_path, $zerofile);
- Je ne fais appel a une fonction JS qui affiche un alert('Fichier non valide!') que si cette variable est à true.
<?php
...
if ($zerofile) {
 ?>
   <script type="text/javascript">
      alert('Fichier non valide!');
   </script>
<?php
}
...
?>
J'aimerais préciser que même si le $_FILE['myfile']['size'] = 0 et bien le $_FILE['myfile']['error'] = 0 aussi.

Tout ça pour dire que j'ai résolu mon problème. Merci beaucoup pour votre aide. :wink: