[JSScript] Vérif extension des pls fichiers

Discussion dans 'Web, design' créé par alan, 24 Janvier 2005.

Statut de la discussion:
Fermée.
  1. Offline
    alan Elite
    le code sans boucle fonctionne nikel,
    mais avec la boucle, ca ne fait rien
    Code:
      echo "\n".'<script language="JavaScript">
        function checkFile(i) {//origin de Guslinux
    for (j=1;j<=i;j++){
    		var file = userfile + j;
    		var fileName = document.form1.file.value;
    		var ext = fileName.split('.')[fileName.split('.').length-1].toLowerCase();
    			
    		switch(ext){
    			
    case "jpg" : break;
    case "jpeg" : break;
    case "gif" : break;
    case "png" : break;
    			default : message = "- Le fichier " + j + " est un fichier invalide\n\n";
    		}
        
        	if (message.length > 0) {
        		window.alert(message += "Veuillez vérifier les données entrées.");
    			return false;
    		}
    
    }
        }
    </script>
    <form method="POST" ENCTYPE="multipart/form-data" action="'.$_SERVER['PHP_SELF'].'" name="form1" onSubmit="JavaScript:checkFile('.$_POST['nb_img'].');return false;">
      <input type="hidden" name="post" value="TRUE">';
      for ($i=1;$i<=$_POST['nb_img'];$i++)
      echo "\n".'<input type="file" name="userfile'.$i.'"> <font size="-2">(fichier '.$i.')</font><br>';
      echo "\n".'<input type="hidden" name="nb_img" value="'.$_POST['nb_img'].'">
      <input type="submit" value="Ajouter">
      </form>'."\n";
    niveau syntaxe ca a m'a l'air bon ....
    le problème est dans la boucle mais pas dans la vérification ;)
    alan, 24 Janvier 2005
    #1
  2. Offline
    Smart Touriste
    Je ne comprend pas comment il peut vérifier ta variable $_POST à partir du moment ou, si le formulaire n'a pas été envoyé, le tableau superglobal n'a pas été crée et ne contient donc pas $_POST(nb_images).

    Pour vérifier les valeurs d'un formulaire, tu dois lui donner un nom et y accéder par document.nomduformulaire.variable.value

    Ta boucle for est donc théoriquement foireuse, et si ton environnement php est bien configuré en ERROR_REPORTING ALL (toujours travailler comme ca) tu devrais avoir un message d'erreur.

    edit : j'ai remarqué une petite erreur de script en allant sur ton site pour les pme. C'est pas grave du tout mais c'est une petite subtilité : Je vois que tu évalues le temps de création de ta page, surement à l'aide de float microtime().
    En effectuant la différence de deux nombres, tu dois t'assurer que le résultat est supérieur au nombre minimal de ton type de variable (sinon il le met en notation scientifique x.xxxx e-xx, donc 0.00008 devient 8.0000 e-5 qqchose du genre).
    J'ai vu que la page avait été générée en 8 secondes, ce qui est surement faux.
    if($difference < 0.0001)
    $difference = '0.0000';

    voila :p

    edit2: faut quand meme pas un pro en info, donc prend ce que je dis avec des pincettes :p, et sinon, si t'as un bouquin java (j'en ai pas :/), tu peux me dire si il y a moyen, en javascript, d'intervenir sur l'url de la fenetre ?
    J'aimerais réécrire l'adresse de certaines pages (pour supprimer la paire session=????????????????????????? dans la barre d'adresse quand les visiteurs n'acceptent pas les cookies).
    Mais tout ce que j'ai trouvé en inventant des noms javascripts c'est document.location.href qui ne se contente pas de changer l'adresse de la barre d'adresse mais qui charge carrément la nouvelle page...
    Smart, 24 Janvier 2005
    #2
  3. Offline
    alan Elite
    alors pour ma variable $_POST, si elle existe ... elle vient de la page précédente ...

    sinon yep lol pour le site pme ... mais c un projet comme ca que j'avais mais tt seul c'est chaud ... j'avais vu sinon pour le probleme d'execution ;) t'inkiete ...

    et pour ton problème humm ... :-s
    ptet en php avec un header('location: url'); mais pas teste et pense pas ..

    sinon en javascript je c pas ...
    crée ton thread ... t'auras plus de chances de réponses ;)
    alan, 24 Janvier 2005
    #3
  4. Offline
    Smart Touriste
    Pardonne moi si je dis des conneries mais :

    onSubmit="JavaScript:checkFile('.$_POST['nb_img'].');return false;

    Ca veut dire que quand on appuie sur le bouton submit, le code se lance ? Et on appuie sur le bouton submit quand quand on veut envoyer les données, donc quand elles ne sont pas envoyées ?

    Si ton code javascript, que tu implémentes dans le formulaire, teste les variables $_POST, franchement je vois pas l'intéret de le faire en javascript, il suffit de tester $_FILE[variable]['type'].

    Le javascript, si il est activé sur le navigateur de l'internaute, permet ce genre de vérification coté client pour économiser de la bande passante (et donc empeche d'appuyer sur le bouton submit si la vérification coté client échoue, et de toute facon tu devras vérifier $_FILE coté server car il y a toujours moyen de percer le javascript).

    Pour terminer, tu dis "si elle existe elle vient de la page précédente". Mais c'est pas bien de coder comme ca, tu dois vérifier isset($_POST), c'est plus propre et au moins on peut comprendre plus aisément la structure de ton code.
    Smart, 24 Janvier 2005
    #4
  5. Offline
    alan Elite
    bon écoute smart je sais qd mem cibler mon probleme....

    et pour ton info
    je fais un test avant pour la BP et un test apres
    un pdt la création de la miniature
    un pdt l'affichage de l'image (non miniature)

    alors si c'est pas sécure assez excuse moi mais ca me suffit

    en plus le jscript ca peut etre utile si qqn choisi un fichier mais que la personne s'est trompée ... et mis un fichier doc pdf zip ou ke sais-je encore ...


    Bref j'ai un probleme dans ma boucle elle meme
    Code:
    <script language="JavaScript">
        function checkFile(i) {
    
    for (j=1;j<=i;j++){
    		var file = userfile + j;
    		var fileName = document.form1.file.value;
    		var ext = fileName.split()[fileName.split().length-1].toLowerCase();
    			
    		switch(ext){
    			
    case "jpg" : break;
    case "jpeg" : break;
    case "gif" : break;
    case "png" : break;
    			default : message = "- Le fichier " + j + " est un fichier invalide\n\n";
    		}
        
        	if (message.length > 0) {
        		window.alert(message += "Veuillez vérifier les données entrées.");
    			return false;
    		}
    
    }
        }
    </script>
    <form method="POST" ENCTYPE="multipart/form-data" action="/gamerz.be/image.php" name="form1" onSubmit="JavaScript:checkFile(3);return false;">
      <input type="hidden" name="post" value="TRUE">
    <input type="file" name="userfile1"> <font size="-2">(fichier 1)</font><br>
    <input type="file" name="userfile2"> <font size="-2">(fichier 2)</font><br>
    
    <input type="file" name="userfile3"> <font size="-2">(fichier 3)</font><br>
    <input type="hidden" name="nb_img" value="3">
      <input type="submit" value="Ajouter">
      </form>
    alan, 25 Janvier 2005
    #5
  6. Offline
    guslinux Gamerz'ien
    Perso je vois completement l'intéret de ce script JS ... vu que à la base c le mien :D.

    Je m'explique, je prends le cas d'une personne quelquonque, qui sait juste comment on fait pour écouter des mp3, prendre les photos sur son appareil numérique top gamme etc 6Mp et naviguer (péniblement je le reconnais) dans les répertoires pou ... au bout de 20minutes se planter en cliquer sur l'anim avi juste à coté de son image de superbe couché de soleil à miami ... disons que l'image fait 8Mo (la limité étant à 8Mo) ... le mec envoies, ca charge (rien ne se passe à l'écran mais ca charge), il en a marre (128kbps c pas si rapide quand meme, surtout avec kazaa sur la ligne !) donc, il va se chercher un p'tit café histoire d'attendre le temps qu'il reste ...

    30 minutes apres il revient et, horreur ! c pas un fichier valide, mais notre homme est pourtant sur, meme certain d'avoir envoyé un fichier valide jpg ou jpeg comme il était marqué. Il dit merde et il ferme tout, tempis pour son couché de Soleil.

    Cas numéro 2, avec mon script JS : le mec a réussi à mettre son image (il c tjs planté il a mis la vidéo), il envoie et là un p'tit popup vient, "Veuillez vérifier le fichier à envoyer, il n'est pas grerer par le systeme. Fichier : tutu.avi" Vite fait le mec clique sur parcourir, il reprend la bonne image ... et c parti !

    JavaScript = "Live"
    PHP = need upload !

    => Différence flagrante de vitesse ...

    ps : ce truc était prévu pour l'upload de gros fichiers !, mais pour les petits c le meme probleme ... perte de temps, de bande passante etc ...
    guslinux, 25 Janvier 2005
    #6
  7. Offline
    null ose();
    Oui mais après la validation JS et l'upload, le script PHP re-vérifie ?
    null, 25 Janvier 2005
    #7
  8. Offline
    La Poubelle Elite
    Obligatoire, sinon un petit malin passera au dessus . Par exemple, en créant un jeu de Frame qui annule le script et délimite la taille des fichiers et des extentions ... ce n'est que théorique, jamais je n'aurais eu l'idée de faire une chose pareil :xmas:
    La Poubelle, 25 Janvier 2005
    #8
  9. Offline
    Smart Touriste
    Je sais encore à quoi sert javascript merci,

    je disais juste que le java ne devrait pas vérifier les $_POST stou, c'est contraire au "live" comme tu dis. Je ne parlais pas du script java en lui meme, mais bien de son formulaire avec utilisation de la fct java.

    Il me semble que j'écris bien en francais, et que ce que je dis est structuré.

    Le script de guslinux vérifie une à une les valeurs des input de type FILE (et donc pas $_POST) lorsqu'ils possèdent des noms de la sorte : userfile(numéro).

    Dans ton premier script j'ai attiré ton attention sur le fait que la fonction javascript ne peut pas accepter de variable de type $_POST, ce qui me semble logique, sinon autant vérifier les variables $_FILE après réception et autant ne pas le faire en javascript.

    On passe en paramètre le nombre d'input files qu'il y a dans le formulaire donc l'input de type hidden ne sert à rien.

    ps : guslinux, tu pourrais meme améliorer en n'affichant pas "j" mais la variable filename que tu as créée.
    Smart, 25 Janvier 2005
    #9
  10. Offline
    guslinux Gamerz'ien
    mon scipt ne permet de tester un seul fichier à la base.

    Mais la variable $_POST passée en argument au onLoad et une bariable passé par le formulaire précédent. Il aurait tres pu etre défini dans le code source, et non passé comme argument à la fonction...
    guslinux, 25 Janvier 2005
    #10
  11. Offline
    guslinux Gamerz'ien
    Code:
    <script language="JavaScript">
    function checkFile() {
    	var UserFiles = document.form1.UserFiles;
    	var message = "";
    	for (j=0;j<UserFiles.length;j++){
            if(checkExt(UserFiles[j].value)==false){
    			id = j+1;
    			message += "- Le fichier " + id + " est un fichier invalide\n";
    		}
    	}        
    	
    	if (message.length > 0) {
    		window.alert(message + "\nVeuillez vérifier les données entrées.");
    		return false;
    	}
    	else {
    		alert("Ok");
    	}
    }
    	
    function checkExt(file){
    	var fileName = file;
    	if(fileName.length>1){
    		var ext = fileName.split('.')[fileName.split('.').length-1].toLowerCase();	
    		switch(ext){
    			case "jpg" 	: return true;
    			case "jpeg" : return true;
    			case "gif" 	: return true;
    			case "png" 	: return true;
    			default 	: return false;
    		}
    	}
    	else
    		return false;
    }
    </script>
    <form method="POST" ENCTYPE="multipart/form-data" action="/gamerz.be/image.php" name="form1" onSubmit="JavaScript:checkFile();return false;">
      <input type="hidden" name="post" value="TRUE">
    <input type="file" id="UserFiles" name="UserFiles[0]"> <font size="-2">(fichier 1)</font><br>
    <input type="file" id="UserFiles" name="UserFiles[1]"> <font size="-2">(fichier 2)</font><br>
    <input type="file" id="UserFiles" name="UserFiles[2]"> <font size="-2">(fichier 3)</font><br>
    <input type="file" id="UserFiles" name="UserFiles[3]"> <font size="-2">(fichier 4)</font><br>
    <input type="file" id="UserFiles" name="UserFiles[4]"> <font size="-2">(fichier 5)</font><br>
      <input type="submit" value="Ajouter">
      </form>
    Ce code ci fonctionne nikel ... pour récuperer les fichiers en php, il suffit de faire :
    Code:
    for($i=0;$i<count($UserFiles);$i++){
    ...
    }
    guslinux, 25 Janvier 2005
    #11
  12. Offline
    alan Elite
    nikel gus ... merci ;)
    keske je ferai ss toi!!!
    alan, 25 Janvier 2005
    #12
  13. Offline
    alan Elite
    humm yep c'est vraiment bizzard en fait!!
    Code:
    <?php $time_end = getmicrotime(); 
    $exec = substr($time_end - $time_start,0,5); $msg=($exec<(0.0001))?'moins de 0.0001':$exec;
    echo $msg;
    ?> secondes.
    edit : ok c'est bon ct juste mon substr mal mis ;) fin ca le faisait encore en le mettant apres mais bon :-s en milisecondes c bien aussi et la pas de problèmes ....
    Code:
    <?php $time_end = getmicrotime(); 
    	  $exec = ($time_end - $time_start)*1000; 
    	  $msg=($exec<=(0.0001))?'moins de 0.0001':substr($exec,0,5);
    	  echo $msg; 
    	  echo($exec<=1)?' miliseconde':' milisecondes';?>
    jvais meme faire miliseconde et secondes .... ;)


    edit 2 :
    Code:
    <?php $time_end = getmicrotime(); 
    	  $exec = $time_end - $time_start; 
    	  switch ($exec) {
    	    case ($exec*1000<0.001) : $msg = 'moins de 0.001 m'; break;
    		case ($exec*1000<1)     : $msg = round($exec*1000,3).' m'; break;
    		case ($exec>=1)         : $msg = round($exec,3).' '; break;
    	  }
    	  echo $msg;
    	  ?>sec.
    voila jpense que la ... c'est pas mal :)
    alan, 25 Janvier 2005
    #13
Statut de la discussion:
Fermée.