Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 16h46   #1
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Par défaut Problème de redimensionnement d'images

Bonjour,

Je poste ici, car je cherche depuis plusieurs jours une solution à mon problème, et cela, en vain...

J'ai un upload d'images à faire pour un site web. Lors de cet upload, je vérifie si le fichier et au poids et au format désiré. Si c'est le cas, j'upload l'image sur mon serveur. Suite à ça, j'ouvre le fichier pour le redimensionner. Comme toutes les images sont au format jpeg, j'utilise la fonction imagecreatefromjpeg. Quand les images font moins de 1Mo, tout se déroule correctement, mais lorsque celles ci dépassent 1Mo, rien ne se produit. Après avoir effectué différents tests, je suis sur que l'erreur vient de cette fonction, mais je ne sais pas pourquoi. J'ai regardé sur différents forums mais rien à ce sujet. Je vous met une copie d'un bout de mon code, pour que vous ayez une idée plus concrète du problème.

Merci d'avance

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
 
                $extensions_ok = array('jpg', 'jpeg');
                $typeimages_ok = array(2);
                $extensions_string = "";
 
                $taille_mo = 3; // Taille en kilo octect (ko)
 
                if((isset($_FILES['photo'])) && ($_FILES['photo']['name'] != "")) // Formulaire envoyé
                {
                    $dest_dossier = 'charte/photos_profils/'; // Creez ce dossier et chmoodez le !
                    $_FILES['photo']['name'] = 'profile_'.$_SESSION['**']."_new_min.".get_extension($_FILES['photo']['name']);
 
                    if (file_exists($dest_dossier.$_FILES['photo']['name']))
                    {
                        unlink ($dest_dossier.$_FILES['photo']['name']);
                    }
 
                    $_FILES['photo']['name'] = 'profile_'.$_SESSION['**']."_new.".get_extension($_FILES['photo']['name']);
 
                    if (file_exists($dest_dossier.$_FILES['photo']['name']))
                    {
                        unlink ($dest_dossier.$_FILES['photo']['name']);
                    }
 
                    if($_FILES['photo']['error'] !== "0") {
                            switch ($_FILES['photo']['error']) {
                            case 1:
                                $erreurs[] = "Votre image doit faire moins de $taille_mo Mo !";
                                break;
                            case 2:
                                $erreurs[] = "Votre image doit faire moins de $taille_mo Mo !";
                                break;
                            case 3:
                                $erreurs[] = "L'image n'a été que partiellement téléchargé.";
                                break;
                            case 4:
                                $erreurs[] = "Aucun fichier n'a été téléchargé.";
                                break; // Pas de 5, ne pas demander pourquoi ^^ (voir doc PHP)
                            case 6:
                                $erreur[] = "Un dossier temporaire est manquant.";
                                break;
                            case 7:
                                $erreurs[] = "Echec de l'écriture du fichier sur le disque.";
                                break;
                        }
                    }
 
                    // getimagesize arrive à  traiter le fichier ?
                    if(!$getimagesize = getimagesize($_FILES['photo']['tmp_name'])) {
                        $erreurs[] = "Le fichier n'est pas une image valide.";
                    }
 
                    // on vérifie le type de l'image
                    if( (!in_array( get_extension($_FILES['photo']['name']), $extensions_ok ))
                       or (!in_array($getimagesize[2], $typeimages_ok )))
                    {
                        foreach($extensions_ok as $text) { $extensions_string .= $text.', '; }
                        $erreurs[] = 'Veuillez sélectionner un fichier de type '.substr($extensions_string, 0, -2).' !';
                    }
 
                    // copie du fichier si aucune erreur !
                    if(!isset($erreurs) or empty($erreurs))
                    {
                        $dest_fichier = basename($_FILES['photo']['name']);
                        $search = array ('@[éèêëÊË]@i','@[àâäÂÄ]@i','@[îïÎÏ]@i','@[ûùüÛÜ]@i','@[ôöÔÖ]@i','@[ç]@i','@[ ]@i','@[^a-zA-Z0-9_]@', '@jpg@i', '@jpeg@i', '@gif@i');
                        $replace = array ('e','a','i','u','o','c','_','','','','','');
                        $dest_fichier = preg_replace($search, $replace, $dest_fichier);
                        $dest_fichier = $dest_fichier.".".get_extension($_FILES['photo']['name']);
                        $verif_upload = 0;
 
                        // pour ne pas ecraser un fichier existant
                        while(file_exists($dest_dossier . $dest_fichier)) {
                            $dest_fichier = rand().$dest_fichier;
                        }
 
                        if (move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier . $dest_fichier))
                        {
                            $verif_upload++;
                        }
 
                        if ($verif_upload > 0)
                        {
                                $dest_dossier = 'charte/photos_profils/'; // Creez ce dossier et chmoodez le !
                                $dest_fichier = 'profile_'.$_SESSION['**'].'_new.jpg';
                                $file = $dest_dossier.'profile_'.$_SESSION['**'].'_new.jpg';
 
                                list($width, $height) = getimagesize($file);
 
                                if (($width > 800) || ($height > 600))
                                {
                                        // Constraints 
                                        $max_width = 800; 
                                        $max_height = 600;
 
                                        $ratioh = $max_height/$height;
                                        $ratiow = $max_width/$width;
 
                                        $ratio = min($ratioh, $ratiow);
 
                                        // New dimensions 
                                        $nv_width = intval($ratio*$width);
                                        $nv_height = intval($ratio*$height);
 
                                        if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
                                        {
                                            $img_new = imagecreatefromjpeg($file); //Erreur ici
                                        }
 
                                        $img_mini = imagecreatetruecolor ($nv_width, $nv_height);
                                        imagecopyresampled ($img_mini,$img_new,0,0,0,0,$nv_width,$nv_height,$width,$height);
 
                                        if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
                                        {
                                            imagejpeg($img_mini, $dest_dossier . $dest_fichier);
                                            $verif_upload++;
                                        }
 
                                        if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
                                        {
                                            imagejpeg($img_mini, $dest_dossier . $dest_fichier);
                                        }
                                }
 
                                $dest_fichier = 'profile_'.$_SESSION['**']."_new_min.jpg";
                                $file = ($dest_dossier.'profile_'.$_SESSION['**'].'_new.jpg';
 
                                // Constraints 
                                $max_width = 120; 
                                $max_height = 135;
 
                                list($width, $height) = getimagesize($file);
                                $ratioh = $max_height/$height;
                                $ratiow = $max_width/$width;
 
                                $ratio = min($ratioh, $ratiow);
 
                                // New dimensions 
                                $nv_width = intval($ratio*$width);
                                $nv_height = intval($ratio*$height);
 
                                if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
                                {
                                    $img_new = imagecreatefromjpeg($file);
                                }
 
                                $img_mini = imagecreatetruecolor ($nv_width, $nv_height);
                                imagecopyresampled ($img_mini,$img_new,0,0,0,0,$nv_width,$nv_height,$width,$height);
 
                                if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
                                {
                                    imagejpeg($img_mini, $dest_dossier . $dest_fichier);
                                    $verif_upload++;
                                }
                        }
 
                        // copie du fichier
                        if($verif_upload > 1)
                        {
                            .... Code .....
                            //echo '<meta http-equiv="Refresh" content="0 ;URL=**">';
                        }
                        else
                        {
                            $erreurs[] = "Impossible d'uploader le fichier.<br />Veuillez vérifier que le dossier ".$dest_dossier." existe avec un chmod 755 (ou 777).";
                        }
                    }
                }
                else
                {
                    echo '<meta http-equiv="Refresh" content="0 ;URL=http://**">';
                }
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h25   #2
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
Il ne s'agit pas de ta limitation au niveau du poids des fichiers ?
Jette un coup d'oeil au niveau de ta conf php :
post_max_size
upload_max_filesize

Ajoute simplement peut etre dans ton script :

Code :
ini_set("memory_limit", "30M");
ou créé un fichier .htaccess

Code :
php_value memory_limit 30M
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h28   #3
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Je ne pense pas que ça puisse être lié à ça car j'arrive à upload des images faisant plus de 1Mo. C'est vraiment le redimensionnement qui pose problème. J'ai bien testé d'upload toute sorte d'image au format jpeg, allant de mois de 1Mo à plus de 3Mo, et elles uploadaient correctement tant qu'elles satisfaisaient à mes conditions. Mais le redimensionnement ne fonctionne que pour les images faisant moins de 1Mo. Les images sont déjà sur le serveur lorsque je veux les redimensionner.
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 17h31   #4
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : Biens de consommation

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
J'ai édité entre temps mon post :

Ajoute simplement dans ton script :

Code :
ini_set("memory_limit", "30M");
ou créé un fichier .htaccess

Code :
php_value memory_limit 30M
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 13h26   #5
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Bonjour,

J'ai bien essayé avec ta méthode, le problème persiste. J'insiste, désolé, sur la fonction imagecreatefromjpeg. J'ai mis deux échos, l'un avant, et l'autre après l'appel de cette fonction. "Test 1", et "Test 2".

Je télécharge mon image de 1 Mo, elle s'ajoute bien sur le serveur (La limite que j'ai appliquée est de 3 Mo). J'ouvre mon image, Test 1 s'affiche, et pas le second, donc logiquement, la suite du code n'est donc pas prise en compte.

Lorsque je télécharge une image de moins de 1 Mo, elle s'ajoute bien sur le serveur. J'ouvre à nouveau mon image en vue du redimensionnement, Test 1 et Test 2 s'affichent et les deux redimensionnement sont effectués. L'intégralité du script est effectuée.

Merci d'avance
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 13h36   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
ca ne dépend pas de la taille de ton fichier mais de le taille (largeur hauteur) de l'image, GD décompresse l'image ce qui fait la mémoire peux monter très très vite, je te conseil de bien vérifier les valeurs de :
- display_errors
- error_reporting
- gd.jpeg_ignore_warning
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h30   #7
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Memory Limit est à 30M
Post Max Size est à 8M
Error Reporting est à -1
Display Errors est On

Et je n'ai pas trouvé d'erreur en ce qui concerne le gd.jpeg_ignore_warning :s
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 13h17   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
met des var_dump à plusieurs endroits dans ton code et regarde ou ils s'arrêtent
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 14h55   #9
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Le code s'arrête après imagecreatefromjpeg.
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 14h59   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
bizarre que t'es aucune erreurs qui s'affiche
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h00   #11
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Je sais bien, c'est pour ça que je viens demander votre aide. Et je ne comprend pas pourquoi ça marche quand les images font moins de 1Mo :s
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h03   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par Natril Voir le message
Je sais bien, c'est pour ça que je viens demander votre aide. Et je ne comprend pas pourquoi ça marche quand les images font moins de 1Mo :s
t'es vraiement sur sur des valeurs de ton ini (à vérifie avec un ini_get juste avant l'erreur), le rendu HTML final est totalement blanc ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h07   #13
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Les valeurs que je vous ai indiqué, je les ai trouvé en faisant un phpinfo dans mon script. Donc je suppose qu'elles sont exactes.

Pour le rendu, oui, on peut considérer que c'est une page blanche. (Le script est réalisé dans le corps de la page. C'est le corps qui est totalement vide. Les parties inclues avant le corps s'affichent, mais pas celle qui suivent le corps, comme le pied de page, etc ...)
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h10   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
Citation:
Envoyé par Natril Voir le message
Les valeurs que je vous ai indiqué, je les ai trouvé en faisant un phpinfo dans mon script. Donc je suppose qu'elles sont exactes.
la configuration peu être differente dans ton script le seul moyen d'être sur c'est avec les ini_get juste avant l'erreur
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h18   #15
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
Voici le code que j'ai utilisé :

Code :
1
2
3
4
5
6
 
echo 'display_errors = ' . ini_get('display_errors') . "<br/>";
echo 'register_globals = ' . ini_get('register_globals') . "<br/>";
echo 'post_max_size = ' . ini_get('post_max_size') . "<br/>";
echo 'error_reporting = ' . ini_get('error_reporting') . "<br/>";
echo 'gd.jpeg_ignore_warning = ' . ini_get('gd.jpeg_ignore_warning') . "<br/>";
Et le résultat obtenu :

testdisplay_errors = 1
register_globals = 1
post_max_size = 8M
error_reporting = 2037
gd.jpeg_ignore_warning =
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h26   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
donc le error_reporting a un niveau bas,
au debut de ton code fait:
ps : pas terrible le register_globals sur On
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h34   #17
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
J'ai bien mis ce code en début de script, mais ça ne change rien.

Je m'absente, je part travailler. Merci du temps consacré. Je serai de retour en fin de soirée, si tu as d'autres conseils à me donner.

Merci d'avance
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 15h40   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
t'as regarde au niveau des logs du serveur ?
je te conseil de faire un code de test plus simple, avec un image deja uploader et juste avec imagecreatefromjpeg (et vérifie bien ton error_reporting)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h35   #19
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
J'ai simplifié le code précédent sur une page de test, ou j'ouvre une image qui fait 2Mo. Voici le code, et l'affichage obtenu :

Code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
<div style='padding-top:30px;'>
    Test de redimensionnement
<?php
    function get_extension($nom)
    {
        $nom = explode(".", $nom);
        $nb = count($nom);
        return strtolower($nom[$nb-1]);
    }
 
    $dest_dossier = 'charte/test/'; // Creez ce dossier et chmoodez le !
    $dest_fichier = 'profile_'.$_SESSION['utilisateur_olympecasting_id'].'_new.jpg';
    $file = $dest_dossier.'___Phish_Food_Wallpaper____by_tpgPhotography - Copie.jpg';
 
    list($width, $height) = getimagesize($file);
 
    if (($width > 800) || ($height > 600))
    {
        error_reporting(-1);
 
        // Constraints 
        $max_width = 800; 
        $max_height = 600;
 
        $ratioh = $max_height/$height;
        $ratiow = $max_width/$width;
 
        $ratio = min($ratioh, $ratiow);
 
        // New dimensions 
        $nv_width = intval($ratio*$width);
        $nv_height = intval($ratio*$height);
 
        if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
        {
            echo "Test avant imagecreatefromjpeg <br/>";
 
            echo 'display_errors = ' . ini_get('display_errors') . "<br/>";
            echo 'register_globals = ' . ini_get('register_globals') . "<br/>";
            echo 'post_max_size = ' . ini_get('post_max_size') . "<br/>";
            echo 'error_reporting = ' . ini_get('error_reporting') . "<br/>";
            echo 'gd.jpeg_ignore_warning = ' . ini_get('gd.jpeg_ignore_warning') . "<br/>";
 
            $img_new = imagecreatefromjpeg($file);
 
            echo "Test après imagecreatefromjpeg";
        }
 
        $img_mini = imagecreatetruecolor ($nv_width, $nv_height);
        imagecopyresampled ($img_mini,$img_new,0,0,0,0,$nv_width,$nv_height,$width,$height);
 
        if ((get_extension($file) == "jpeg") || (get_extension($file) == "jpg"))
        {
            imagejpeg($img_mini, $dest_dossier . $dest_fichier);
            $verif_upload++;
        }
    }
?>
</div>
Affichage :
Test de redimensionnement
Test avant imagecreatefromjpeg
display_errors = 1
register_globals = 1
post_max_size = 8M
error_reporting = -1
gd.jpeg_ignore_warning =

Si je ne mets pas error reporting à -1, il m'affiche 2037.
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 16h07   #20
Invité de passage
 
Inscription : mars 2011
Messages : 12
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 12
Points : 0
Points : 0
J'ai testé en local avec le même code... Et ça fonctionne : Voici l'affichage obtenu :

Test de redimensionnement Test avant imagecreatefromjpeg
display_errors = 1
register_globals =
post_max_size = 10M
error_reporting = -1
gd.jpeg_ignore_warning = 0
Test après imagecreatefromjpeg
Natril est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h33.


 
 
 
 
Partenaires

Hébergement Web