begin process at 2010 02 10 02:20:47
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > UPLOAD MULTIPLE PHP/JAVASCRIPT EN 36 LIGNES DE CODE

UPLOAD MULTIPLE PHP/JAVASCRIPT EN 36 LIGNES DE CODE


 Information sur la source

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :upload multiple, upload multi-fichiers, createElement, setAttribute, appendChild Niveau :Débutant Date de création :06/11/2009 Date de mise à jour :10/11/2009 10:23:07 Vu :2 302

Auteur : valneandre

Ecrire un message privé
Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

 Description

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

  • <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>
<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.


 Historique

10 novembre 2009 10:23:07 :
J'ai tenu compte des remarques qui m'avaient été faites, sur la sécurité du code. Le test du type MIME, la limitation de la taille du fichier. Pour le reste, c'est le même code.

 Sources de la même categorie

Source avec Zip GESTION DE PARC AUTOMOBILE AVEC SÉRIALISATION par guyr07
Source avec Zip Source avec une capture FICHIERS_CACHÉS_LECTURE_SEULE par Le Pivert
Source avec Zip Source avec une capture CHANGEUR D'ICONES par djgab21
DIRECTDISKACCESS par XelectroX
Source avec Zip Source avec une capture UTILITAIRE WAV, MID ET MP3 par SnkVrt

Commentaires et avis

Commentaire de valneandre le 06/11/2009 14:08:20

J'ajoute, avant que d'autres me le disent: il n'y a aucun traitement de "fichier déjà présent", de type ni de taille de fichier, et le dossier destinataire est "câblé" dans le code. Tout cela peut être largement amélioré, bien entendu.

Commentaire de destinyfr le 07/11/2009 10:29:09

Salut,

Dans ce cas la, à quoi sert ce code ?

Merci

Commentaire de valneandre le 07/11/2009 15:43:06

Je pense que quelqu'un qui débute, et cherche à comprendre, peut tirer profit de ce genre de "fil d'ariane", tout comme j'ai tiré profit, moi-même, de bouts de code simples et sans prétention du même genre. On ne devient pas expert d'un coup !
Richard

Commentaire de destinyfr le 07/11/2009 16:37:36

faut quand même un minimum de sécurité.. Si il met ça comme ça en ligne, en 2mn il à plus de site xD
Tu aurais au moins pu penser à vérifier un minimum le fichier envoyé...

Commentaire de bj33 le 09/11/2009 09:00:21

mon dieu!! j'm disait aussi.

<< Tu aurais au moins pu penser à vérifier un minimum le fichier envoyé...

faudrait pouvoir, penser;))

allez, poubelle!

Commentaire de fadiese le 09/11/2009 09:52:36 6/10

Pour un débutant c'est un bon début, simple et bien commenté;
Continues et ne tiens pas compte des commentaires plutôt faciles qu'on peut voir ici.

Commentaire de kohntark le 09/11/2009 10:28:29

Salut,

Commentaires plutôt faciles ? On peut même parler d'idiot voire de crétin dans le cas du "allez, poubelle!"

@valneandre :
C'est vrai que ce genre de code peut servir à un débutant, surtout pour l'emploi du DOM, mais encore faudrait il qu'il n'y ait pas d'erreurs :
  - <script language="javascript"> => <script type="text/javascript">
  - le code HTML n'est pas valide (majuscules, name sur un div, ...)
  - aucune (ou presque) gestion des erreurs
  - pas de possibilité de supprimer un champ file
  - etc ... etc ...

Comme cela a été dit ton code est très dangereux s'il est utilisé tel quel.

Bref, il ne faut pas rêver, un code d'upload de fichier ne peut pas tenir en 36 lignes sans avoir de lourdes carences.

Cordialement,


Kohntark-

Commentaire de valneandre le 09/11/2009 11:30:56

Merci pour les commentaires constructifs de Kohntark et Fadiese.
Pour les autres, je dirai simplement: la critique est aisée, mais l'art est difficile !

Commentaire de kertimanoff le 09/11/2009 11:39:51

salut, je suis trés interraissé par l'utilité de ton code, maleureusement il ne fonctionne pas ...
j'ai mi le fichier php puis créé un dossier "downloads"  dans www sur mon serveur.
quand j'envoi un fichier sa affiche sur la page web que le fichier a bien été envoyé, cependant aucun fichier n'est ajouté sur le serveur... si j'ai sauté une étape peut-on m'éclairer?

Commentaire de valneandre le 09/11/2009 13:28:31

Parfois le serveur n'affiche pas immédiatement la mise à jour de son répertoire, il faut changer de session pour vérifier si le fichier est bien arrivé.
Sinon... as-tu modifié quelque chose dans le code ?
Autre piste: qui est ton hébergeur ? As-tu réglé correctement les droits d'écriture dans le dossier "downloads" que tu as créé ? Il faut le mettre au moins en 644, voire 777, pour pouvoir y écrire un nouveau fichier.

Commentaire de kertimanoff le 09/11/2009 13:39:19

autant pour moi, j'ai été victime de mon impatience... ça fonction a merveille, excellent code. merci beaucoup

Commentaire de valneandre le 09/11/2009 14:05:13

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"...

Commentaire de LeFauve42 le 11/11/2009 11:20:18 5/10

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 "<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 />";
  }
}
else // par défaut: rejeter les fichiers autres qu'images
{
  echo "<br />Fichier &quot;$nom&quot; d'un type incorrect<br /><br />";
}

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

Commentaire de valneandre le 11/11/2009 11:50:40

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

Commentaire de LeFauve42 le 11/11/2009 13:08:23

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) ).

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pb dom pr gnérer du xml [ par chanandler ] Bonjour, J'ai code php qui utilise dom qui marche presque sauf qu'il ne fais pas complétement ce que je veux, le code sera mieux qu'un long discours d Probleme modifier xml ! [ par chanandler ] Bonjour,Jai créé un script pour modifier un fichier xml a un certain endroit mais ca marche pas et je voie pas où est l'erreur pourriez vous m'aider m XML d'un tableau [ par gazalii ] Bonjour,je veux faire un flux XML sous la forme suivante&lt;racine&gt;  &lt;element&gt;     &lt;valeur1&gt;test&lt;/valeur1&gt;    &lt;valeur2&gt;test php dom probleme xml [ par G4uthier ] Bonjour, j'ai un probleme pour crer mon fichier XML :il me met une erreur : Warning: domdocument() expects parameter 2 to be long, string given in /e DomXML, TextNode tronqué ... [ par JoJo738 ] Helo tout le monde :pJe suis depuis ce matin sur une class de log, et je rencontre un petit problème ...Je veux enregistrer la Trace de mon erreur ...


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales