Diminuer le poids d'une image à l'upload

Eléphant du PHP | 54 Messages

10 nov. 2006, 12:35

Bonjour,

Je cherche un moyen de diminuer la taille des photos uploader vers mon site, car actuellement les photos sont trop importantes et l'upload fonctionne mal du coup. Ca donne ceci comme message :

Code : Tout sélectionner

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 11392 bytes) in photo.php on line 30
La photo est de 800 ko je souhaiterais qu'elle soit environ à 100 ko (voir moins).Il s'agit de photos pour des véhicules (3 photos par véhicule) sachant qu'il y a un stock de 700 voitures, vous imaginez la place que ça prendrait.

Vu que je ne peux pas diminuer la résolution avec l'appareil photo, je cherche un moyen de diminuer l'image avant l'upload.

Voici mon code de l'upload pour le moment :

function thumbail($rep, $file, $maxWidth, $maxHeight){//Créé une image à partir de $file


    $img = ImageCreateFromJpeg($rep.$file);   ------->ligne 30<-------


    //Dimensions de l'image


    $imgWidth = imagesx($img);


    $imgHeight = imagesy($img);


    //Facteur largeur/hauteur des dimensions max


    $whFact = $maxWidth/$maxHeight;


    //Facteur largeur/hauteur de l'original


    $imgWhFact = $imgWidth/$imgHeight;


    //fixe les dimensions du thumb


    if($whFact < $imgWhFact){//Si largeur déterminante


        $thumbWidth  = $maxWidth;


        $thumbHeight = $thumbWidth/$imgWhFact;


    } else { //Si hauteur déterminante


        $thumbHeight = $maxHeight;


        $thumbWidth = $thumbHeight*$imgWhFact;


    }


    //Crée le thumb (image réduite)


    $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight);


    //Insère l'image de base redimensionnée


    ImageCopyResized($imgThumb, $img, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imgWidth, $imgHeight);


    //Nom du fichier thumb


    //$nom_file = basename($path);


    $imgThumbName = "v".$file;


    //Crée le fichier thumb


    $fp = fopen($rep.$imgThumbName, "w");


    fclose($fp);


    //Renvoie le thumb créé


    ImageJpeg($imgThumb, $rep.$imgThumbName);


    return $rep.$imgThumbName;


}



....

//Upload de la nouvelle image

       $nomFichier    = $_FILES["fichier_choisi"]["name"] ;

       //nom temporaire sur le serveur:
       $nomTemporaire = $_FILES["fichier_choisi"]["tmp_name"] ;

       //type du fichier choisi:
       $typeFichier   = $_FILES["fichier_choisi"]["type"] ;

       //poids en octets du fichier choisit:
       $poidsFichier  = $_FILES["fichier_choisi"]["size"] ;

       //code de l'erreur si jamais il y en a une:
       $codeErreur    = $_FILES["fichier_choisi"]["error"] ;


       //chemin qui mène au dossier qui va contenir les fichiers uplaod:
       $chemin = "images/vehicule/" ;


       move_uploaded_file($nomTemporaire, $chemin.$nomFichier);


       if ($nomFichier != "")

	   	chmod ($chemin.$nomFichier, 0644);


       $extension = substr ( strrchr ( $nomFichier, '.' ) , 1 );

       $tmpNom = "images/vehicule/".time().".".$extension;

       rename($chemin.$nomFichier, $tmpNom);

       if ($nomFichier != "")
   	     chmod ($tmpNom, 0644);
      


       $resNom = thumbail("images/vehicule/", basename($tmpNom), 200, 160);

       if ($tmpNom != "")
	   	chmod ($resNom, 0644);
Modifié en dernier par stomper98 le 10 nov. 2006, 12:53, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 nov. 2006, 12:43

Tu ne peut réduire la taille de l'image AVANT l'upload pour la simple raison que PHP ne gère l'image qu'APRES l'upload :?

En effet, PHP est un langage serveur, qui s'exécute donc sur le serveur, et l'upload est l'action de transférer un document d'un poste client vers le serveur 8-[
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

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

10 nov. 2006, 12:46

Tu ne peux pas modifier le fichier depuis le serveur avant l'upload. PHP ne peut travailler que sur le serveur et nécessite donc d'avoir le fichier à disposition... Au mieux, tu peux uploader le fichier, et le réduire une fois sur le serveur pour économiser de la place, mais tu ne peux pas le faire avant d'avoir reçu le fichier...

La seule solution c'est de retoucher ton image avec un logiciel de dessin pour en diminuer la taille ou la qualité (en la compressant) et donc le poids.
Certains sites te permettent de faire ça en ligne, mais le problème est le même pour eux : tu dois uploader ta photo pour qu'ils puissent la retailler et te permettre d'enregistrer l'image une fois modifiée...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 54 Messages

10 nov. 2006, 12:51

Merci de vos réponses.

Code : Tout sélectionner

Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 11392 bytes) in photo.php on line 30


Cette erreur vient donc de mon hébergeur qui a limiter l'upload ?
Parceque concrètement je ne peux même pas upload les photos là :?

Mammouth du PHP | 592 Messages

10 nov. 2006, 12:56

salut
l'upload de fichier est généralement fixé à 2Mo par le php.ini
pour l'augmenter il faut en parler a ton héberguer qui généralement...
"refuse" .... voila voila

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

10 nov. 2006, 13:03

Bah non à priori, si tu avais une erreur lors de l'upload du fichier tu aurais eu un autre message d'erreur avant celui-ci. Si la ligne 30 correspond au ImageCreateFromJpeg(), cela intervient lorsque tu essayes de modifier le fichier.. il a donc à première vue été correctement uploadé et copié...

Le problème serait plus une question de mémoire allouée pour ce que tu veux faire ou d'un problème dans ce que tu fais.. j'ai nottament un peu de mal à comprendre ton bazar sur le nom du fichier : pourquoi ne pas le nommer directement comme tu le souhaite lors du move ? ça serait pas plus simple ??
	$chemin = "images/vehicule/" ; 

	$extension = substr ( strrchr ( $nomFichier, '.' ) , 1 ); 
	$nouveauNom = time().".".$extension; 

	if (move_uploaded_file($nomTemporaire, $chemin.$nouveauNom))
		chmod ($chemin.$nouveauNom, 0644); // est-ce vraiment utile ?
		$resNom = thumbail($chemin, $nouveauNom, 200, 160); 
	}
	else {
		// erreur de récupération du fichier 
	}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

10 nov. 2006, 15:33

Je viens de continuer mes recherches un peu sur google, en fait ce n'est pas le poids de mon image qui dérange mais sa résolution. Actuellement l'appareil donne des photo d'une résolution de : 2848x2136 (ce qui est énorme). Au dela d'une certaine résolution : ImageCreateFromJpeg donne l'erreur :

Code : Tout sélectionner

Fatal error: Allowed memory size of XXXX bytes exhausted (tried to allocate XXX bytes)
Je peux par exemple les diminuer à la volée avec un logiciel comme : Visualizer Photo.

Néanmoins si je pouvais solutionner ce problème par le code ça serait plus simple.

Eléphant du PHP | 54 Messages

10 nov. 2006, 15:45

edit : je n'étais pas connecté mais c'est bien mon message

Eléphant du PHP | 54 Messages

13 nov. 2006, 11:20

Je viens d'en parler à mon hébergeur voila ce qu'il me conseille :
La seule solution possible est d'opter pour un serveur virtuelle ou memory_limit est personnalisable.
vous en pensez quoi ?