5/5 (16 avis)
Snippet vu 6 745 fois - Téléchargée 20 fois
<head><title>Upload multiple en (36) 82 lignes de code</title> <script type="text/javascript"><!-- function ajouter() { var br = document.createElement('br'); // je crée une balise <br /> var neo = document.createElement('input'); // je crée un élément <input> neo.setAttribute('name','srcfic[]'); // je donne à mon INPUT le nom du tableau neo.setAttribute('type','file'); // je précise qu'il est de type FILE neo.setAttribute('size','95'); // je précise sa taille var sortie = document.getElementById("aufront"); // je précise où placer mon INPUT sortie.appendChild(neo); // je le mets en place, ainsi qu'un retour à la ligne sortie.appendChild(br); } //--></script> </head> <body> <form enctype="multipart/form-data" action="#VersServeur" method="post" name="uplo"> <input type="hidden" name="drapeau" id="drapeau" value="oui" /> <div id="aufront"><label>Fichier(s) à envoyer vers le serveur :</label><br /><br /> <input name="srcfic[]" type="file" size="95"><br> <!-- j'ai créé un tableau de fichiers à envoyer --> </div> <!-- script de Richard BACH http://www.valneandre.eu --> Vous pouvez ajouter des fichiers avant d'envoyer : <input type="button" value="Encore un ?" onclick="ajouter()" /><br /> <input type="submit" value="Envoyer"></form> <div name="VersServeur" id="VersServeur"> <?php $destin = "downloads"; // changer ceci par le nom du dossier destinataire souhaité if (isset($_POST["drapeau"])) { echo '<h2>Envoi des fichiers ...</h2>'; //===================================================================================================================== for($x=0;$x<sizeof($_FILES["srcfic"]["name"]);$x++) { $nom = $_FILES['srcfic']['name'][$x]; if ($_FILES['srcfic']['error'][$x] >0) { echo 'Erreur sur le fichier : ' . $_FILES['srcfic']['error'][$x] . "<br /><br />"; } else { if (file_exists("$destin/$nom")) // si le fichier existe déjà, renommer l'ancien { $ancienfic = $nom . microtime() . ".old" ; // certitude de n'avoir pas 2 noms pareils rename("$destin/$nom","$destin/$ancienfic"); echo "<br />Le fichier " . $nom . " existe déjà<br />L'ancien " . $nom . " sera renommé " . $ancienfic . "<br />"; } $siz = round($_FILES['srcfic']['size'][$x] / 1024,2); // calcul de la taille en Ko $typ = $_FILES['srcfic']['type'][$x]; // examen du type MIME echo "Type : $typ<br />Taille : $siz Ko<br />"; if($siz > 256) // si la taille du fichier est supérieure à 256 Ko { echo "Fichier "$nom" trop volumineux pour l'upload<br /><br />"; } else // sinon, filtrer les types MIME admis avant d'uploader { switch ($typ) { case "image/gif": case "image/pjpeg": case "image/jpeg": case "image/x-png": case "image/png": case "image/tiff": case "image/bmp": if(move_uploaded_file($_FILES['srcfic']['tmp_name'][$x],"$destin/$nom")) // si tout s'est bien passé { echo "<strong>Le fichier "" . $_FILES['srcfic']['name'][$x] . "" a été correctement envoyé "; echo "dans le dossier "$destin/"</strong><br><br />"; chmod("$destin/$nom",0644); } else // sinon (case restée vide, ou fichier pas passé...) { if ($nom=="") $nom = "Fichier_Inconnu"; { echo "Désolé, je n'ai pas pu envoyer le fichier "$nom" dans le dossier "$destin/" !<br /><br />"; } } break; // par défaut: rejeter les fichiers autres qu'images default:echo "<br />Fichier "$nom" d'un type incorrect<br /><br />";break; } // fermeture de switch(type) } // fermeture de if(size>256) else... } // fermeture de if(error) else... } // fermeture de for(x=0;...) //===================================================================================================================== } // fermeture de if(isset...) ?> </div></body>
15 janv. 2013 à 14:38
Mais je trouves que pour un débutant c'est pas mal du tout
Bons courage!
11 nov. 2009 à 13:08
11 nov. 2009 à 11:50
En ce qui concerne les expressions régulières, je dois dire que je n'y connais rien, et que j'hésite à m'y lancer, vu le nombre d'autres choses qu'il faut avoir en tête par ailleurs...
Merci en tous cas. C'est encourageant.
Richard
11 nov. 2009 à 11:20
Ce n'est pas si terrible que ce que disent les commentaires, mais vu le nombre de lignes, je pense que tu as du améliorer le source original :o) .
Pour ce qui est de la securite, vu que tu n'acceptes que des images, ce n'est pas si critique que ca.
Le plus sur, selon ce que tu veux faire avec les fichiers uploades, c'est de les mettre dans un repertoire non accessible aux clients web. Si ton hebergeur ne le permet pas, il est toujours possible d'ajouter un .htaccess interdisant cet access pour tout le contenu du repertoire.
Petite remarque: Pour accepter toutes les images, tu peux simplifier ton code avec les expressions regulieres. Ca donne un truc genre :
if(ereg('^image/',$typ))
{
if(move_uploaded_file($_FILES['srcfic']['tmp_name'][$x],"$destin/$nom")) // si tout s'est bien passé
{
echo "Le fichier "" . $_FILES['srcfic']['name'][$x] . "" a été correctement envoyé ";
echo "dans le dossier "$destin/"
";
chmod("$destin/$nom",0644);
}
else // sinon (case restée vide, ou fichier pas passé...)
{
if ($nom=="") $nom = "Fichier_Inconnu";
echo "Désolé, je n'ai pas pu envoyer le fichier "$nom" dans le dossier "$destin/" !
";
}
}
else // par défaut: rejeter les fichiers autres qu'images
{
echo "
Fichier "$nom" d'un type incorrect
";
}
Une autre remarque: Le resultat du mime type des fichiers uploades peut varier avec le navigateur utilise. Ca devrait marcher avec les images, mais j'ei deja eu des problemes par le passe avec par exemple les .gz qui n'ont pas le meme type si envoyes avec firefox ou ie.
Sinon j'ai ecrit un script du meme genre (mais specialise pour les images) et plutot que de rejeter les images trop grosses, j'utilisais GDLib pour reduire leur taille avant de les enregistrer. Ce n'est pas si complique si tu te limites aux images gerees par la GDLib (en gros, si tu ne geres pas les BMP).
Eric
9 nov. 2009 à 14:05
Tiens compte quand même des commentaires de Kohntark et Fadiese, ils ont raison: il faut améliorer ce code au niveau de la sécurité, ne t'en sers pas "tel quel"...
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.