Bonjour,
Voici les données de mon problème:
Je fais une application de gestion de fichiers sur un serveur, avec comme possibilité:
- upload de fichiers (forcément ...)
- création d'une vignette à la volée quand il s'agit d'une image
J'ai une fonction qui doit normalement s'occuper de créer des vignettes lors du chargement.
la voici:
la fonction setMemoryForImage me permet (normalement) d'allouer les ressources nécessaires pour la manipulation de l'image. c'est une fonction récupérée sur php.net:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 function createThumb($source,$cible,$NW,$NH,$ext){ setMemoryForImage( $source ); // Cacul des nouvelles dimensions list($width_orig, $height_orig) = getimagesize($source); if ($NW && ($width_orig < $height_orig)) { $NW = ($NH / $height_orig) * $width_orig; } else { $NH = ($NW / $width_orig) * $height_orig; } $NW=floor($NW); $NH=floor($NH); // Redimensionnement $create_cible = imageCreateTrueColor($NW, $NH); if($ext=="jpg" || $ext=="jpeg"){ $image = imageCreateFromJpeg($source); imageCopyResampled($create_cible, $image, 0, 0, 0, 0, $NW, $NH, $width_orig, $height_orig); if(imageJpeg($create_cible,$cible)){ $report=true; } else{ $report=false; } } return $report; }
l'upload du fichier repose sur un formulaire avec un champ parcourir et un bouton ok.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function setMemoryForImage( $filename ){ $imageInfo = getimagesize($filename); $MB = 1048576; // number of bytes in 1M $K64 = 65536; // number of bytes in 64K $TWEAKFACTOR = 1.5; // Or whatever works for you $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + $K64) * $TWEAKFACTOR); //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also //Default memory limit is 8MB so well stick with that. //To find out what yours is, view your php.ini file. $memoryLimitMB = 32; $memoryLimit = $memoryLimitMB * $MB; if (function_exists('memory_get_usage') && (memory_get_usage() + $memoryNeeded > $memoryLimit)){ $newLimit = $memoryLimitMB + ceil( ( memory_get_usage() + $memoryNeeded - $memoryLimit ) / $MB); ini_set( 'memory_limit', $newLimit . 'M' ); return true; } else{ return false; } }
le formulaire pointe vers un fichier qui copie le fichier sur le serveur et, en fonction de l'extension, tente de créer la vignette.
mon problème: la création des vignettes de certains fichiers images ne passent pas, et d'autres passent sans souci. Aucun problème au niveau de l'upload dans tous les cas.
Quelques indications:
- Serveur dédié
- la version de PHP: 4.3.11
- la version de la GD: bundled (2.0.28 compatible) => support de GIF, JPG, PNG
- 32 Mo en memory_limit
- 10 Mo en upload maximal
- les fichiers qui ne passent pas ne sont pas forcément plus lourd que ceux qui passent. Une vignette a été créée pour une image de 1.56 Mo et aussi pour une image de 1.69 Mo, et ça plante pour une image de 1.27 Mo
- les images qui ne passent pas sont bien en RVB
- En mode de debug, j'affiche un message basique qui indique que la vignette a été créée puis exit. Quand le script ne fonctionne pas, Internet Explorer m'affiche "Impossible d'afficher la page" (erreur 404 quoi !), et Firefox lui fait comme si aucun lien n'est cliqué, c-a-d rien.
Je sèche et je ne comprends pas ce qui se passe.
Toute proposition, voire solution, est bienvenue.
Merci d'avoir lu jusqu'ici
Partager