[RÉSOLU] Problème avec un formulaire

Eléphanteau du PHP | 10 Messages

07 déc. 2011, 13:05

Bonjour à tous, alors je développe un portfolio pour un collègue
j'ai une page ou il peut gérer ses galeries et ses photos j'ai pris ce script pour la gestion du multi-upload : http://net.tutsplus.com/tutorials/javas ... with-ajax/

J'ai donc ce formulaire :

Code : Tout sélectionner

<form method="post" enctype="multipart/form-data" action="upload.php"> <input type="hidden" id="galerie" name="galerie" value="<?php echo $selection; ?>" /> <input type="file" name="images[]" id="images" multiple /> <button type="submit" id="btn">Upload Files!</button> </form>
c'est la valeur de l'input de type hidden que je souhaiterais récupérer

voici le code de ma page upload.php :

Code : Tout sélectionner

<?php require('img.class.php'); foreach ($_FILES["images"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $name = $_FILES["images"]["name"][$key]; $galerie = $_POST['galerie']; move_uploaded_file( $_FILES["images"]["tmp_name"][$key], "../img/galeries/".$galerie."/" . $_FILES['images']['name'][$key]); Img::creerMin("../img/galeries/".$galerie."/".$_FILES["images"]['name'][$key],"../img/galeries/".$galerie."/min/",$_FILES['images']['name'][$key],215,112); } } echo "<h2>Success !</h2>"; ?>
mais impossible de récupérer ma variable avec $galerie = $_POST['galerie']

J'ai aussi à ma disposition un script js qui gère l'upload si ça peut vous aider.

Merci d'avance je sais pas si j'ai post dans la bonne section.
Modifié en dernier par virginweb le 10 déc. 2011, 13:10, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

07 déc. 2011, 13:22

Tu testes bien sous Firefox ? Car le script utilises un objet JS (formData) qui apparemment n'est disponible que sous ce navigateur.
Fais un var_dump() de $_POST pour voir ce qu'il contient.

Eléphanteau du PHP | 10 Messages

07 déc. 2011, 17:52

J'ai testé var_dump($_POST) cela me renvoi array(0) { } sous Chrome et sous firefox
et quand je fais var_dump($_POST['galerie']) il me renvoi NULL

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 déc. 2011, 19:12

Hum ta testé ça tel quel ? (c'est à dire sans tous le merdier js/ Ajax ) ?

Parce que la tu n'a pas de donnée issue de post donc normale que le second test avec var_dump() retourne null.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

07 déc. 2011, 20:18

Merci pour ta réponse j'ai supprimé le script js et ca fonctionne parfaitement.

J'ai cependant encore une question lorsque j'upload plusieurs images, des fois j'ai cette erreur :
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 19008 bytes) in /home/soisn109/public_html/admin/img.class.php on line 213

Voici le code en question de mon fichier img.class.php :

Code : Tout sélectionner

if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 déc. 2011, 21:33

C'est un dépassement mémoire (ça tu t'en doute déjà nan ?) dû à la taille de l'image (parce que quand tu l'utilise avec gd elle prend beaucoup plus de place en mémoire).

Pas grand chose à faire, regarde dans le forum "vos contributions" la classe d'upload de AB il y a pas mal de réponse à ce sujet et il me semble qu'il a géré la chose dans sa classe, tu devrais y trouver une solution ou au moins de quoi finir le script proprent je pense.

Pour ce qui de l'upload, maintenant que tu sais que le traitement est bon il te reste à deboguer la moulinette js/Ajax pour ça roule ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

07 déc. 2011, 23:52

D'accord je vais regarder sinon il n'y a pas moyen d'insérer un imagedestroy() quelque-part ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 déc. 2011, 07:33

Ben si tu a d'autre truc en mémoire avant oui c'est mieux (genre sur de la modification d'image en boucle oui il préférable, je pense, de détruire l'ancienne ressource histoire d'être sur qu'il reste rien en mémoire. Après je sais pas trop comment est gérée la mémoire (ramasse miette ou pas etc etc).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

08 déc. 2011, 14:05

Donc le imagedestroy() d'après vous je le met où ?

Dans mon fichier upload.php :

Code : Tout sélectionner

<?php require('img.class.php'); foreach ($_FILES["images"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $name = $_FILES["images"]["name"][$key]; $galerie = $_POST['galerie']; move_uploaded_file( $_FILES["images"]["tmp_name"][$key], "../img/galeries/".$galerie."/" . $_FILES['images']['name'][$key]); Img::creerMin("../img/galeries/".$galerie."/".$_FILES["images"]['name'][$key],"../img/galeries/".$galerie."/min/",$_FILES['images']['name'][$key],155,105); } } header('Location: index.php'); ?>
Ou dans ma classe image ?

Code : Tout sélectionner

static function creerMin($img,$chemin,$nom,$mlargeur=155,$mhauteur=105) { // On supprime l'extension du nom $nom = substr($nom,0,-4); // On récupère les dimensions de l'image $dimension=getimagesize($img); // On cré une image à partir du fichier récup if(substr(strtolower($img),-4)==".jpg"){$image = imagecreatefromjpeg($img); } else if(substr(strtolower($img),-4)==".png"){$image = imagecreatefrompng($img); } else if(substr(strtolower($img),-4)==".gif"){$image = imagecreatefromgif($img); } // L'image ne peut etre redimensionne else{return false; } // Création des miniatures // On cré une image vide de la largeur et hauteur voulue $miniature =imagecreatetruecolor ($mlargeur,$mhauteur); // On va gérer la position et le redimensionnement de la grande image if($dimension[0]>($mlargeur/$mhauteur)*$dimension[1] ){ $dimY=$mhauteur; $dimX=$mhauteur*$dimension[0]/$dimension[1]; $decalX=-($dimX-$mlargeur)/2; $decalY=0;} if($dimension[0]<($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mlargeur*$dimension[1]/$dimension[0]; $decalY=-($dimY-$mhauteur)/2; $decalX=0;} if($dimension[0]==($mlargeur/$mhauteur)*$dimension[1]){ $dimX=$mlargeur; $dimY=$mhauteur; $decalX=0; $decalY=0;} // on modifie l'image crée en y plaçant la grande image redimensionné et décalée imagecopyresampled($miniature,$image,$decalX,$decalY,0,0,$dimX,$dimY,$dimension[0],$dimension[1]); // On sauvegarde le tout imagejpeg($miniature,$chemin."/".$nom.".jpg",90); return true; }
Parce que je n'ai pas tout compris l'histoire de la classe à AB j'ai essayer de la faire marché mais est-ce qu'il gère le multi-upload ?

ViPHP
xTG
ViPHP | 7331 Messages

08 déc. 2011, 14:08

Tu le mets dans ta class image après le imagejpeg() qui sert à sauvegarder l'image.

Eléphanteau du PHP | 10 Messages

08 déc. 2011, 14:20

j'ai toujours la même erreur :

Code : Tout sélectionner

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 4752 bytes) in /home/soisn109/public_html/admin/img.class.php on line 213
mais avec le imagedestroy() cette fois le "tried to allocate" est nettement inférieur à celui d'avant.

Alors ça à l'aire de fonctionner mais il n’y a toujours pas assez de mémoire ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 déc. 2011, 18:30

Ouep :(

A tu regardé si AB indique comment il gère la chose ?


@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

09 déc. 2011, 01:02

Ouep :(

A tu regardé si AB indique comment il gère la chose ?


@+
J'en ai parlé ici et avant il y a des explications.

Pour un exemple de code, la fonction qui vérifie la mémoire dans ma classe d'upload se nomme "Enoughmem" et elle est appelée dans la fonction "Redim_liste".
En fait on calcule la mémoire nécessaire pour faire le redimensionnement en fonction des résolutions de l'image source et de l'image cible (le poids de l'image n'intervient pas pour ce calcul), et si ça dépasse la mémoire disponible pour le script en cours, on sort du script en envoyant un message personnalisé. Cela évite de se prendre un dépassement mémoire du serveur qu'on ne pourra pas maîtriser.

En bas du premier message de la classe il y a quelques estimations. Avec 64 Mo ça devient confortable et il y peu de limitations. 32Mo est le minimum pour commencer à travailler sur des fichiers un peu volumineux.

Ah oui et dans le lien il y a une procédure de bench pour mesurer la mémoire utilisée en fonction de l'image.

Bah finalement niveau doc sur le sujet y'a de quoi faire :)
Modifié en dernier par AB le 09 déc. 2011, 01:36, modifié 2 fois.

ViPHP
AB
ViPHP | 5818 Messages

09 déc. 2011, 01:34

Parce que je n'ai pas tout compris l'histoire de la classe à AB j'ai essayer de la faire marché mais est-ce qu'il gère le multi-upload ?
Oui mieux même que le muti-upload, le multi-upload multiple :) C'est ici

Dans cet exemple il suffit de remplacer la ligne

Code : Tout sélectionner

$form->Set_Controle_dimImg ();
par
$form->Set_Redim ("1000","800");
si tu veux faire des redimensions en max 1000px de largeur et max 800px de hauteur.

Tu peux aussi faire plusieurs redimensionnement vers plusieurs répertoires et éventuellement garder l'image originale (sans traitement) dans un autre répertoire... imposer un nom de fichier... renommer le fichier si un fichier de même nom existe déjà sur le serveur ...tout cela est détaillé dans "utilisation de la classe".

Eléphanteau du PHP | 10 Messages

09 déc. 2011, 15:25

Ok ! Merci beaucoup je viens de tester c'est super. Cependant si je veux mettre une variable php pour le dossier de destination cela ne marche pas.

Code : Tout sélectionner

$galerie = $_POST['galerie']; // Déclaration de la classe avec envoi des paramètres (cf doc) $form = new Telechargement ('/img/galeries/'.$galerie.'/','envoi_file','photo','get_form_1');
Pourtant j'ai fait un echo de $galerie et il m'affiche bien le contenu.

Je souhaiterais également faire une redirection une fois que les images sont téléchargées, comment je peux faire ça ?
avec un header mais je dois le placer où ?