Page 1 sur 2

upload fichier: passer de 1 a plusieurs fichiers

Posté : 12 nov. 2007, 12:10
par choubix
hello,

j'ai un formulaire dans lequel j'avais jusqu'a present 1 seule image a uploader.
aucun probleme.

maintenant je voudrais faire en sorte que mon script puisse gerer entre 1 et 6 photos a uploader.
je ne vois pas trop comment faire.

est ce que qqun pourrait me dire quelle est la meilleure marche a suivre. j'essayerais de me debrouiller pour le code :)

merci


$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['file']['name']);
$extension = $ext['extension'];

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

//create a random name for the uploaded file
			$name = random_string();
			$uploadname = "$name.$extension";
			
			move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir.'/'.$uploadname);

//insert fom values into database			
			$fields = array_keys($_POST);

			for ($i = 0; $i < count($fields); $i++)
			{
			$array = array($_POST[$fields[2]], $_POST[$fields[1]], $_POST[$fields[0]]);
			$start = implode("-", $array);
			
			$array = array($_POST[$fields[5]], $_POST[$fields[4]], $_POST[$fields[3]]);
			$expiry = implode("-", $array);
			
			$name = addslashes($_POST[$fields[6]]);	
			$description = addslashes($_POST[$fields[7]]);	
			$stock = $_POST[$fields[8]];
			$points_redeem = $_POST[$fields[9]];
			$points_play = $_POST[$fields[10]];
			$type = $_POST[$fields[11]];
			$link = $_POST[$fields[12]];
			}	
			$query= ("INSERT INTO gifts (start, expiry, name, description, stock, points_redeem, points_play, type, link, pic_path) 
					  VALUES ('$start', '$expiry', '$name', '$description', '$stock', '$points_redeem', '$points_play', '$type', '$link', 'gifts/$uploadname')");
			mysql_query($query) or die('Invalid query: ' . mysql_error()); 
			
			print "Your file has been uploaded successfully! Yay!";
			}
			else
			{
			print "<br>failed uploading the file";
			}
			}
		}
}

else 
	{
	print "Incorrect file extension!";
	}	



Posté : 12 nov. 2007, 14:58
par Ryle
Tu peux essayer de donner le même nom à tous tes inputs de type file en y spécifiant les crochets (name="mon_fichier[]") pour que le résultat récupéré en php soit un tableau.

Un print_r($_FILES) pour voir ce que tu récupères et une boucle devraient ensuite te permettre de résoudre ton soucis d'upload multiple :)

Posté : 12 nov. 2007, 15:43
par choubix
salut ryle,

merci de ton coup de main.
j'ai pas mal avance grace a ca.

je bloque juste sur la fin du code.
je vais voir comment je peux m'en sortir :)

Posté : 12 nov. 2007, 15:51
par Ryle
Ah bah à la fin, il te faut juste ça : " ?> " ;)
(quoi ? s'pas drole ? :D non ? :) bon ok.. c'est pas drole :( )

Quoi qu'il en soit, n'hésite si tu as un soucis :)

Posté : 12 nov. 2007, 17:20
par choubix
en fait j'ai un probleme sur la fin du code: tout va bien jsuqu'au moment ou je donne un no maleatoire a mes fichiers: la ca part en saucisse...

j'ai change mon $_FILES['file']['tmp_name'] en $_FILES['file']['tmp_name'][$key] partout.
ca a bien marche de mettre $key jusqu'a present mais pas la... ;)

			else
			{
			if(empty($upload) && is_uploaded_file($_FILES['file']['tmp_name']))
			{

//create a random name for the uploaded file
			$name = random_string();
			$uploadname = "$name.$extension";
			
			move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir.'/'.$uploadname);

//insert fom values into database			
			$fields = array_keys($_POST);

			for ($i = 0; $i < count($fields); $i++)
			{
			$array = array($_POST[$fields[2]], $_POST[$fields[1]], $_POST[$fields[0]]);
			$start = implode("-", $array);
			
			$array = array($_POST[$fields[5]], $_POST[$fields[4]], $_POST[$fields[3]]);
			$expiry = implode("-", $array);
			
			$name = addslashes($_POST[$fields[6]]);	
			$description = addslashes($_POST[$fields[7]]);	
			$stock = $_POST[$fields[8]];
			$points_redeem = $_POST[$fields[9]];
			$points_play = $_POST[$fields[10]];
			$type = $_POST[$fields[11]];
			$link = $_POST[$fields[12]];
			}	
			$query= ("INSERT INTO gifts (start, expiry, name, description, stock, points_redeem, points_play, type, link, pic_path) 
					  VALUES ('$start', '$expiry', '$name', '$description', '$stock', '$points_redeem', '$points_play', '$type', '$link', 'gifts/$uploadname')");
			mysql_query($query) or die('Invalid query: ' . mysql_error()); 
			
			print "Your file has been uploaded successfully! Yay!";
			}
			else
			{
			print "<br>failed uploading the file";
			}
			}
		}
}

else 
	{
	print "Incorrect file extension!";
	}	

Posté : 12 nov. 2007, 19:12
par choubix
bon,

petit soucis de syntaxe dans le code suivant + probleme d'upload:

a la ligne:
$uploadname = "$date-$name.$extension";
je souhaiterais un _ plutot qu'un - dans le nom du fichier.

a la ligne:
move_uploaded_file($_FILES[image][tmp_name][$key],$uploaddir.'/'.$uploadname);
les fichier ne sont pas uploades dans le repertoire.

si qq un peut me filer un petit coup de pouce ca sera cool :)

merci!

et le pave de code tout de meme (sinon ca serait pas marrant... ;) )

<?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 "$uploadname<br>";
			move_uploaded_file($_FILES[image][tmp_name][$key],$uploaddir.'/'.$uploadname);
			}
			}
						
		}





		}
	}
}
?>
merci!

Posté : 13 nov. 2007, 08:36
par choubix
hello, virament personne n'a d'idee ?

je me suis rendu compte que si je me deconnectais puis reconnectais au ftp, des fichiers etaient uploades mais impossible de les telecharger sur mon ordinateur (critical transfer).

par ailleurs: leur taille me semble ridicule par rapport au fichier que je tente d'uploader.
peut etre qu'il y a erreur de syntaxe dans mon code avant ce que je pense etre l'erreur...

alleeeeeezzzzzzzzzzz un petit coup de main les gars svp. a'vot' bon coeur ;)
merci!

Posté : 13 nov. 2007, 11:20
par Ryle
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.

Posté : 13 nov. 2007, 12:50
par Invité
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!

Posté : 13 nov. 2007, 14:18
par Invité
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
                )

        )

)

Posté : 13 nov. 2007, 14:29
par h0_noMan
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

Posté : 13 nov. 2007, 14:55
par Invité
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 :(

Posté : 13 nov. 2007, 14:59
par choubix
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
)

)

)

Posté : 13 nov. 2007, 15:06
par Ryle
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> ?

Posté : 13 nov. 2007, 15:13
par choubix
j'ai ceci comme enctype:

ENCTYPE="multipart/form-data"

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