Upload multiple php/javascript en 36 lignes de code

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 615 fois - Téléchargée 19 fois

Contenu du snippet

Upload multiple en... un peu plus que 36 lignes: 82, en fait. J'ai rajouté un contrôle du type Mime et de la taille du fichier.
J'ai fait dans le simple. C'est la première source que je poste. Il existe déjà plein de solutions pour l'upload multiple, mais toutes celles que j'ai vues me prenaient la tête... Celle-ci fait tout ce qu'il faut en 36 (ou 37) lignes, et sans prendre la tête ! Testée sur IE8, FF, NN9.

Source / Exemple :


<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 :&nbsp;' . $_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&nbsp;:&nbsp;$typ<br />Taille&nbsp;:&nbsp;$siz&nbsp;Ko<br />";
			if($siz > 256)	// si la taille du fichier est supérieure à 256 Ko
				{
					echo "Fichier &quot;$nom&quot; 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 &quot;" . $_FILES['srcfic']['name'][$x] . "&quot; a été correctement envoyé "; 
								echo "dans le dossier &quot;$destin/&quot;</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 &quot;$nom&quot; dans le dossier &quot;$destin/&quot; !<br /><br />"; }
							}
						break;
						// par défaut: rejeter les fichiers autres qu'images
						default:echo "<br />Fichier &quot;$nom&quot; 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>

Conclusion :


Un petit upload simple, sans prétention.

A voir également

Ajouter un commentaire Commentaires
Niveau sécurité, c'est pas top!
Mais je trouves que pour un débutant c'est pas mal du tout
Bons courage!
Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009

Les expressions regulieres ne sont pas si compliquees mais si tu t'y lances, je te conseille de miser sur "les expression regulieres compatible PERL" (PCRE) plutot que les expressions regulieres POSIX (c'est celles que j'utilise, mais qui sont plus limitees et plus lentes que les PCRE... donc ne fait pas comme moi :o) ).
Messages postés
35
Date d'inscription
mardi 7 novembre 2006
Statut
Membre
Dernière intervention
18 septembre 2009

Merci beaucoup, Lefauve42, pour toutes ces précisions, notamment la possibilité de réduire les images avec GDLib, que je vais étudier dès que possible.
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
Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009

Salut,

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
Messages postés
35
Date d'inscription
mardi 7 novembre 2006
Statut
Membre
Dernière intervention
18 septembre 2009

Merci.
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"...
Afficher les 16 commentaires

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.