upload fichier: passer de 1 a plusieurs fichiers

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : upload fichier: passer de 1 a plusieurs fichiers

par choubix » 14 nov. 2007, 11:58

ca marche super!

je m'y prenais comme un manche pour stocker mes infos dans un tableau.
la: ca marche! :)

(je suis dans le 2nd cas: j'ai plusieurs fichiers pour un seul enregistrement)

t'es une star Ryle :)

merci aussi a kaoteknik et aux autres :)

par Ryle » 14 nov. 2007, 10:05

On doit effectivement pouvoir faire mieux... cela dépend un peu de comment tu veux stocker tes données en base ensuite. Est ce que tu as un enregistrement par fichier ? un enregistrement dans lequel tu as 6 champs pour stocker les chemins des fichiers ?

Dans le premier cas, il te suffit d'exécuter l'insertion dans ta boucle après chaque move_upload effectué avec succès (tu insères directement l'enregistrement du fichier que tu viens de traiter).

Dans le second cas tu peux utiliser un tableau dans lequel tu stockeras le nom des fichiers au fur et à mesure et que tu pourras parcourir une fois ta boucle terminée pour les retrouver :
$tabNomFichier = array();
while (...) {
  // ...
  $tabNomFichier[] = $uploadname;
  // ...
}
Tu auras alors $tabNomFichier[0] contenant le nom du premier fichier uploadé, $tabNomFichier[1] le suivant, ... La taille du tableau dépendra du nombre de fichiers uploadés avec succes. A toi de voir s'il ne doit contenir que ces valeurs, ou si tu veux savoir quels sont les "trous" (fichier non ou mal uploadé), suffit dans ce cas d'insérer une valeur vide à la place du $uploadname et de la gérer ensuite si le nom de fichier est vide :)

par Invité » 13 nov. 2007, 21:31

un coup dans l'eau, ca me retourne DES tableaux, bien decoupe tous les 45 caracteres. mais la clef est toujours 0.

pas tres pratique pour l'insertion dans la base de donnees ;)

par Invité » 13 nov. 2007, 21:27

ok: dis moi si je me trompe mais si j'utilise str_split() normalement je dois pouvoir m'en sortir.

ca me permettrait de "decouper" $uploadname en parts egales (45 caracteres a chaque fois dans mon cas) et coller tout ca dans un tableau. une fois que c'est fait: plus de probleme pour stocker dans une table.

correct? :)

on peut trouver mieux?

par Invité » 13 nov. 2007, 21:03

c'est de la magie ce script...

pour ce qui est du path: aucun probleme ;)
par contre pour ce qui est du nom des fichiers je ne vois pas trop car dans $uploadname j'ai entre 1 et 6 noms en fonctions des fichiers que j'y mets.

ce qui aurait ete pratique: appeller $uploadname['0'], $uploadname['1'] etcetc au moment de l'insertion dans la base de donnees mais utiliser ['0'] n'affiche que la premiere lettre du 1er fichier par exemple.

je dois par contre pouvoir exploser la chaine de caractere apres l'extension, faire une boucle et stocker chacun des noms dans une variable separee.

sincerement: je pense qu'il y a plus simple.

je me trompe?

au fait Ryle: vraiment tres sympa de ta part de passer du temps sur mon cas :)

par Ryle » 13 nov. 2007, 19:59

Toujours pas d'explication puor l'upload, mais pour conserver le nom du dossier et du fichier en base, ça ne devrait pas être bien compliqué. Après tout, c'est toi qui défini le dossier ($uploaddir) et le nom du fichier ($uploadname) ;)

par choubix » 13 nov. 2007, 18:44

bon, apparement ca marcherait MAIS:
- ca n'est pas immediat (si je vais dans le repertoire "gift" je ne vois rien, je dois me deconecter, attendre un peu et me reconnecter)
- je n'arrive pas a telecharger les fichiers que j'ai uploade (j'ai un "critical transfer error" qui s'affiche)

par ailleurs: je dois stocker le chemin et le nom de ces fichiers dans une table (Avec d'autres infos qui sont dans le formulaire). comment est ce que je peux recuperer ca svp?

par choubix » 13 nov. 2007, 15:13

j'ai ceci comme enctype:

ENCTYPE="multipart/form-data"

je comprends vraiment pas pourquoi ca marche avec 1 et pas avec plusieurs :(

par Ryle » 13 nov. 2007, 15:06

Pour le chemin, ce que je reprochais, c'était le '/' présent à la fin du $uploaddir qui du coup devenait redondant avec celui que tu ajoutais entre tes variables :
$uploaddir = "../../gifts/" et ton chemin : $uploaddir.$uploadname
ou
$uploaddir = "../../gifts" et ton chemin : $uploaddir ."/". $uploadname
:)


Par contre, je ne vois pas trop pourquoi tes fichiers ne se stockent pas.. as-tu bien spécifié l'enctype dans ta balise <form> ?

par choubix » 13 nov. 2007, 14:59

a titre d'exemple: si j'upload 4 fichiers ca me donne ca:

le [3] n'est pas rempli, c'est normal car je n'ai pas uploade d'image dans cette boite
ce tableau est repete autant de fois uq'il y a d'images uploadees (en l'occurence 4 x)

Array
(
[image] => Array
(
[name] => Array
(
[0] => Active.jpg
[1] => Actual.jpg
[2] => Dynamic.jpg
[3] =>
[4] => Emotion.jpg
[5] =>
)

[type] => Array
(
[0] => image/jpeg
[1] => image/jpeg
[2] => image/jpeg
[3] =>
[4] => image/jpeg
[5] =>
)

[tmp_name] => Array
(
[0] => /tmp/phpBbDY6e
[1] => /tmp/phplAgV2J
[2] => /tmp/phpzIOpHg
[3] =>
[4] => /tmp/phpMkkqRo
[5] =>
)

[error] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 4
[4] => 0
[5] => 4
)

[size] => Array
(
[0] => 15540
[1] => 18600
[2] => 18898
[3] => 0
[4] => 24400
[5] => 0
)

)

)

par Invité » 13 nov. 2007, 14:55

salut ho_no_man

mon formualire me permet d'envoyer un max de 6 images. dans le cas present je n'en ai envoye qu
une ca doit etre pour cela que tu me dis que les autres ne sont pas transmises ;)

mon probleme est que je n'arrive pas a faire le move_uploaded_file :(

par h0_noMan » 13 nov. 2007, 14:29

Sur les 6 images, la 1ere à bien été envoyée et les autres ont une taille nulle.

1. Fichier trop gros (definie dans PHP.INI)
2. Fichier trop gros (MAX_FILE_SIZE dans formulaire)
3. Envoi interrompu pendant le transfert
4. Le fichier envoyé à une taille nulle

par Invité » 13 nov. 2007, 14:18

j'ai essaye de debugger avec:
printf("<pre>%s</pre>\n", print_r($_FILES, 1));



et ca me retourne ca:
Array
(
    [image] => Array
        (
            [name] => Array
                (
                    [0] => Active.jpg
                    [1] => 
                    [2] => 
                    [3] => 
                    [4] => 
                    [5] => 
                )

            [type] => Array
                (
                    [0] => image/jpeg
                    [1] => 
                    [2] => 
                    [3] => 
                    [4] => 
                    [5] => 
                )

            [tmp_name] => Array
                (
                    [0] => /tmp/php5710wx
                    [1] => 
                    [2] => 
                    [3] => 
                    [4] => 
                    [5] => 
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 4
                    [2] => 4
                    [3] => 4
                    [4] => 4
                    [5] => 4
                )

            [size] => Array
                (
                    [0] => 15540
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                )

        )

)

par Invité » 13 nov. 2007, 12:50

salut ryle.

bon, je crois que je dois arreter de coder facon "Banzaiiiiiiiiiiiiiiiii"... je vais me trouver un tuto sur la syntaxe ca me fera du bien ;)

par contre: ca marche pour le nom du fichier (avec un _ au lieu d'un -)
mais l'upload quand a lui ne e fait toujours pas

le chemin que tu me demdandes de changer fonctionnait auparavant.

maintenant j'ai ca:

<?php

session_start();

if (isset($_SESSION['level']) && $_SESSION['level'] == 2)
{
}
else
{
$_SESSION['error'] = "3";
header('Location: ../../error.php');
}

require("../../includes/config.php");
require('../../includes/functions.tpl.php');

while(list($key,$value) = each($_FILES['image']['name']))
{
	if(!empty($value))
	{
	$filename = $value;
	//echo $_FILES[image][name][$key];    equivalent to    print "$filename<br>";
	$uploaddir = "../../gifts"; 

	$allowed_ext = array( 'jpg', 'gif', 'jpeg', 'png' );  
	
	
	$max_size = "50000"; 
	$max_height = "300"; 
	$max_width = "300"; 
	
	$upload = ''; 
	  
	
	//get the file's extension
	$ext = pathinfo($_FILES['image']['name'][$key]);
	$extension = $ext['extension'];

	//compare uploaded file with authorized extensions
		if (in_array($extension,$allowed_ext)) 
		{
		//check the file's size in kb
		if($_FILES['image']['size'][$key] > $max_size)
		{
		print "File '$key' size is too big!";
		$upload = false;
		}
		//check the file's	dimension WxH
		if ($max_width && $max_height) 
		{
		list($width, $height, $type, $w) = getimagesize($_FILES['image']['tmp_name'][$key]);
			if($width > $max_width || $height > $max_height)
			{
			print "<br>File '$key' height and/or width are too big!";
			$upload = false;	
			}
			
			//upload the file!			
			else
			{
			if(empty($upload) && is_uploaded_file($_FILES['image']['tmp_name'][$key]))
			{

			//create a random name for the uploaded file
			$date = date ("Ymd");
			$name = random_string();
			$uploadname = $date.'_'.$name.'.'.$extension;
			
			print "$uploaddir/$uploadname<br>";
			move_uploaded_file($_FILES['image']['tmp_name'][$key],$uploaddir/$uploadname);
			}
			}
						
		}





		}
	}
}
?>

je ne pense pas que cela vienne du chemin ou sont stockes les images mais plutot dans ma maniere d'appeller les variables. je pensais a une erreur de { } mais apparement ca me semble ok (il y a pas un soft ou une fonction qui te dit si les { } sont ok?? )

par ailleurs: une fois que j'aurais fini l'upload je dois stocker le chemin vers les images dans une table: ca se recupere toujours avec le $key ?

merci!

par Ryle » 13 nov. 2007, 11:20

je souhaiterais un _ plutot qu'un - dans le nom du fichier.
Bah ça tu peux le faire facilement... :) (et profites en pour sortir les variables de tes chaines ;))
$uploadname = $date . '_' . $name . '.' . $extension; 


Pense également lorsque tu utilises un index dans un tableau à l'encapsuler de quotes ou apostrophe pour faire référence à une chaine et non à une constante que php irait cherché, ne trouverait pas, et par dépit interpréterait juste comme une chaine ;)
$_FILES['image']['size'][$key]
// et pas 
$_FILES[image][size][$key]
Affiche la valeurs de " $uploaddir.'/'.$uploadname " ou tu souhaites déplacer le fichier (tu devrais déjà remarquer un soucis au niveau des "/"). Assure toi que le chemin vers le dossier depuis celui ou est exécuté le script est correct, que le nom correspond à ce que tu veux etc.