OVH Community, votre nouvel espace communautaire.

HELP - Warning: getimagesize()


Homer Jay
13/01/2007, 02h16
Citation Envoyé par fred036
safari, c'est du mozilla déguisé en fait
C'est du Konqueror déguisé, plutôt, il me semble.

Paul Sellis
12/01/2007, 14h58
Mais le problème n'est pas dans le code de traitement de l'image mais bien dans le formulaire et le navigateur :
si je mets en haut de ton code
Code PHP:
    $submitfiles $_FILES["illustration1"];
    
print_r($submitfiles);
    Die(); 
J'obtiens aussi :
Array ( [name] => éàç.jpg [type] => application/octet-stream [tmp_name] => /tmp/php4SIPh4 [error] => 0 [size] => 0 )

Paul Sellis
12/01/2007, 14h27
Oui mais mais je ne suis pas arrivé à le faire encore fonctionner.
J'ai un max de warnings…

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG library reports unrecoverable error
et 5 autres en cascade…

fred036
12/01/2007, 14h10
rien dans le formulaire

juste et enctype dans le


au pire si tu définis pas, il mettra un endroit par défaut (je suis pas sur)
as-tu testé ce code-ci ?

Paul Sellis
12/01/2007, 14h01
Ce que je voulais dire c'est que moi je ne la définis pas du tout en fait…
C'est peut-être là mon pb non ?

Par quel code précises-tu au niveau du formulaire où se téléchargera le fichier ?

fred036
12/01/2007, 13h47
en fait oui... je définis deux fois cette variable, c'est inutile

Paul Sellis
12/01/2007, 13h10
Merci pour tes commentaires sur ton code.

//si j'ai réussit à uploader le fichier illustration1 dans l'uploaddir (variable configurée + haut) sous le nom du fichier illustration1 (en tmp_name, ce n'est pas le meme)
if (move_uploaded_file($_FILES[illustration1]['tmp_name'], $uploaddir . $_FILES['illustration1']['name'])) {
//alors ma variable photo3 = le nom du fichier
$photo3=$_FILES[illustration1]['name'] ;

}
//je définis le dossier source ou j'ai uploadé l'image
$Source ="multimedia/";
L'uploaddir (variable configurée + haut), c'est bien "multimedia" ?

Parce que moi, dans mon code je n'indique nulle part où uploader le fichier…
Tu as indiqué ça dans le formulaire ?

fred036
12/01/2007, 12h17
//si j'ai réussit à uploader le fichier illustration1 dans l'uploaddir (variable configurée + haut) sous le nom du fichier illustration1 (en tmp_name, ce n'est pas le meme)
if (move_uploaded_file($_FILES[illustration1]['tmp_name'], $uploaddir . $_FILES['illustration1']['name'])) {
//alors ma variable photo3 = le nom du fichier
$photo3=$_FILES[illustration1]['name'] ;

}
//je définis le dossier source ou j'ai uploadé l'image
$Source ="multimedia/";
//je définis dans quel dossier l'image modifiée ira
$Destination ="multimedia/profils_photos/";
//la taille max.. utilisée en cas de redimensionnement
$ratio ="800";
//je vérifie les dernières lettres du fichier et je compare à ".gif"
if(substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-4),4)==".gif"){
//si c ca, la source de mon fichier sera ca en gif
$src=imagecreatefromgif($Source.$photo3);
//juste pour insérer dans la db apres
$format="GIF";
//nouveau nom de ma photo, nowh est un mktime() et id_profil ben l'id du profil du membre
$photo2=$nowh."_".$id_profil."a.gif";
}
//si jamais ct pas un gif... je compare à .jpeg et à .pjg
else if(substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-4),4)==".jpg" || substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-5),5)==".jpeg"){
//format pour dans la db
$format="JPEG";
//nouveau nom
$photo2=$nowh."_".$id_profil."a.jpg";
//source = jpg
$src=imagecreatefromjpeg($Source.$photo3);
}
//je récupère la taille
$size = getimagesize($Source.$photo3);
//je définis la largeur
$largeur="$size[0]";
//je définis la hateur
$hauteur="$size[1]";
//si c + large que 800
if($size[0] > "800")
{
//je vérifie si c un mode portrait
if("$size[1]" > "$size[0]"){

//je redimmensionne à max 800 (variable ratio)
$im=imagecreatetruecolor(round(($ratio/$size[1])*$size[0]), $ratio);
imagecopyresized($im, $src, 0, 0, 0, 0, round(($ratio/$size[1])*$size[0]), $ratio, $size[0], $size[1]);
}
//si c po portrait, c paysage
else
{
//je redimensionne à max 800
$im=imagecreatetruecolor($ratio, round(($ratio/$size[0])*$size[1]));
imagecopyresized($im, $src, 0, 0, 0, 0, $ratio, round($size[1]*($ratio/$size[0])), $size[0], $size[1]);
}
}
//si c + petit que 800
else
{
//je crée la variable de l'image tout simplement
$im=imagecreatetruecolor($size[0], $size[1]);
imagecopyresized($im, $src, 0, 0, 0, 0, $size[0], $size[1], $size[0], $size[1]);
}
//avec les variables précédentes je crée mon image
imagejpeg($im, $Destination.$photo2);
//j'efface l'original
unlink($Source.$photo3);
//j'insere des infos dans la db du profil
mysql_query("INSERT INTO profils_photos (id_profil, fichier, date_creation, largeur, hauteur) VALUES ('$id_profil','$photo2','$nowh','$largeur','$haute ur')");

}


si tu envoie un formulaire sur ce script avec nom du fichier illustration1 et que tu vires l'appel mysql apres avoir changé les variables de dossier du haut, tu devrais y trouver la photo uploadée !

fred036
12/01/2007, 12h08
hormis le fait que c'est du "vieux" php, non

\n ==> on met plus ca
print a été remplacé par echo y'a longtemps déjà...

et que ca (si j'ai bien compris, ce n'est pas ton code) est codé en php alors qu'il s'agit de s'imple html et que du coup, ca utilise plus de ressources du système...

tes fichiers fonctionnent chez moi sans problème... Et je gère un site où je permets l'upload de photos aux membres et il n'est pas rare de voir des fichiers avec accents, espaces, cédilles, apostrophes,... (je garde un log de ce qui est uploadé et de comment c'est renommé... j'aime tout logger ce qui est inutile )... et je n'ai jamais entendu quelqu'un se plaindre pour des photos qui ne seraient po uploadées... Bref, aucun souci !

Paul Sellis
12/01/2007, 12h00
Hum…
je bricole en php… mais malheureusement sans tout comprendre alors je ne suis pas sûr de me sortir de ton code non plus !
Car comme j'utilise ImageMagik pour sa qualité visuelle supérieure, il faudrait en plus tout réadapter…

Mais si tu es sur Mac essaie de télécharger un fichier éàç.jpg ou éàç.gif
tu auras peut-être aussi des surprises

Blague à part, tu ne penses pas que le problème est avant le traitement ?
Je le vois plus au moment de l'upload du fichier…
Il n'y a rien à préciser ou corriger vers cet endroit là ?
Code PHP:
print "\n";
print 
'

'."\n"
print 
"\n";
print 
"\n"


fred036
12/01/2007, 11h30
j'te poste un que j'utilise et qui fonctionne sur safari, firefox et explorer sous mac (et explorer pc.. le reste, ai po testé)

Code:
if (move_uploaded_file($_FILES[illustration1]['tmp_name'], $uploaddir . $_FILES['illustration1']['name'])) {

$photo3=$_FILES[illustration1]['name'] ;

}
$Source ="multimedia/";
$Destination ="multimedia/profils_photos/";
$ratio ="800";
if(substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-4),4)==".gif"){
$src=imagecreatefromgif($Source.$photo3);
$format="GIF";
$photo2=$nowh."_".$id_profil."a.gif";
}
else if(substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-4),4)==".jpg" || substr(strtolower($Source.$photo3), (strlen($Source.$photo3)-5),5)==".jpeg"){
$format="JPEG";
$photo2=$nowh."_".$id_profil."a.jpg";
$src=imagecreatefromjpeg($Source.$photo3);
}
$size = getimagesize($Source.$photo3);
$largeur="$size[0]";
$hauteur="$size[1]";
if($size[0] > "800")
{
if("$size[1]" > "$size[0]"){
$im=imagecreatetruecolor(round(($ratio/$size[1])*$size[0]), $ratio);
imagecopyresized($im, $src, 0, 0, 0, 0, round(($ratio/$size[1])*$size[0]), $ratio, $size[0], $size[1]);
}
else
{
$im=imagecreatetruecolor($ratio, round(($ratio/$size[0])*$size[1]));
imagecopyresized($im, $src, 0, 0, 0, 0, $ratio, round($size[1]*($ratio/$size[0])), $size[0], $size[1]);
}
}
else
{
$im=imagecreatetruecolor($size[0], $size[1]);
imagecopyresized($im, $src, 0, 0, 0, 0, $size[0], $size[1], $size[0], $size[1]);
}
imagejpeg($im, $Destination.$photo2);

unlink($Source.$photo3);
mysql_query("INSERT INTO profils_photos (id_profil, fichier, date_creation, largeur, hauteur) VALUES ('$id_profil','$photo2','$nowh','$largeur','$hauteur')");

}
PS j'ai po nettoyé le code par contre à toi de voir ce que tu gardes, si tu veux tester... parce que j'avais du oublié la solution "copy" apres des bugs.. mais sais plus lesquels

Paul Sellis
12/01/2007, 11h26
Citation Envoyé par fred036
quel est ton code d'upload ?
Euh…
Code PHP:
print "\n";
print 
'

'."\n"

Code PHP:
      $submitfiles $_FILES["submitfiles"];
    
$tmpfile $submitfiles['tmp_name'];
    
$photo $submitfiles['name'];{

            if(!empty(
$photo) and ($tmpfile != "none")) { 
        
                
$root_dir $_SERVER['DOCUMENT_ROOT'];
                
$Thumb_dirname $root_dir "/images/blog/thumb/";
                
$Large_dirname $root_dir "/images/blog/large/";
                 

                
$Thumb_pict_file $Thumb_dirname $photo;
                
$Large_pict_file $Large_dirname $photo;
                
                list(
$width$height) = getimagesize("$tmpfile");
                
$imgratio=$width/$height;
                
                        
// Création de l'image large
                        
copy($tmpfile$Large_pict_file) || die("Impossible de charger la photo sur le serveur!");
                        
                        
// Taille du plus grand côté :
                        
$LargeWidth 400;
                        
                           if (
$imgratio>1){
                          
$newLargeWidth $LargeWidth;
                         
$newLargeHeight $LargeWidth/$imgratio;
                         
$Format "H";
                               }
                           else{
                         
$newLargeWidth $LargeWidth*$imgratio;
                         
$newLargeHeight $LargeWidth;
                         
$Format "V";
                               }
                               
                        
// Traitement de l'image par ImageMagick           
                        
$output = `/usr/bin/convert -geometry $newLargeWidth x $newLargeHeight -quality 85 $tmpfile $Large_pict_file`; 
                        print 
$output;
                        
                        
                        
// Création de la vignette
                        
copy($tmpfile$Thumb_pict_file) || die("Impossible de charger la photo sur le serveur!");
                        
                        
// Taille du plus grand côté :
                        
$ThumbWidth 140;
                        
                           if (
$imgratio>1){
                          
$newThumbWidth $ThumbWidth;
                         
$newThumbHeight $ThumbWidth/$imgratio;
                               }
                           else{
                         
$newThumbWidth $ThumbWidth*$imgratio;
                         
$newThumbHeight $ThumbWidth;
                           }
                               
                        
$output = `/usr/bin/convert -geometry $newThumbWidth x $newThumbHeight -quality 100 $tmpfile $Thumb_pict_file`; 
                        print 
$output;

&
#8230;

Paul Sellis
12/01/2007, 11h17
Exactement le même problème avec un fichier GIF
Sur Safari :
Array ( [name] => éàç.gif [type] => image/gif [tmp_name] => /tmp/phpS6Adra [error] => 0 [size] => 1351 )

Sur Camino :
Array ( [name] => éàç.gif [type] => application/octet-stream [tmp_name] => /tmp/phpMdH7iN [error] => 0 [size] => 0 )

Sur Camino en renommant le fichier différemment ça passe…

fred036
12/01/2007, 11h14
quel est ton code d'upload ?

Paul Sellis
12/01/2007, 11h07
Exactement !
Un print_r($submitfiles); me donne :

- Avec Camino (même style pour FireFox) :
Array ( [name] => éàç.jpg [type] => application/octet-stream [tmp_name] => /tmp/phpWmCUls [error] => 0 [size] => 0 )

- Avec Safari :
Array ( [name] => éàç.jpg [type] => image/jpeg [tmp_name] => /tmp/phpBP4F4C [error] => 0 [size] => 455905 )


Mais que faire à partir de ce constat ?

fred036
12/01/2007, 10h50
le enctype de ton formulaire qui pourrait etre mal pris en compte... est-ce que tu peux afficher l'image que tu uploades avant de la traiter ?

fred036
12/01/2007, 10h49
safari, c'est du mozilla déguisé en fait

Paul Sellis
12/01/2007, 10h40
Ah !… un élément à verser au dossier :
sur le Mac le problème ne survient qu'avec mes navigateurs Mozilla (Camino et FireFox).
Aucun souci avec Safari et la vieille version de IE

Paul Sellis
12/01/2007, 10h26
Merci pour tes réponses.

Je garde ton idée de mktime() qui me semble très astucieuse.
Je n'ai pas de problème de doublons : je vérifie la base et si ce nom existe on demande de renommer le fichier.
Pour ce projet je préfère garder les intitulés (sans accents ni espace ni doublons !…).

Mais le pb n'est effectivement pas dans le nom du fichier généré au final. Mais dans celui du fichier téléchargé car un
$photo = mktime();
me produit la même erreur sur le même ordinateur...

Pour le formulaire, oui c'est une piste sérieuse, mais je ne sais pas où aller chercher l'erreur...
Tu penserais à quoi ?

fred036
12/01/2007, 10h00
surtout que c'est ton serveur qui travaille et que donc l'ordi n'a rien à voir dans l'histoire... par contre, ils prennent l'html en compte différemment.. donc vérifie peut-être que c'est au niveau du formulaire qu'il y a un souci... (on ne sait jamais)

ceci dit, pour renommer les fichiers moi je fais simplement en sorte que le new nom soit la date en mktime histoire d'éviter d'écraser des images (les utilisateurs sont champions pour mettre des images sorties direct de l'appareil photo, appelée encore IMG_001 et faisant 2 Mo ) parce que même si tu enlèves les accentes, etc.. si l'image existe déjà, il écrasera ou il fera une erreur.. avec le mktime, aucun souci de la sorte !

Paul Sellis
12/01/2007, 09h45
Citation Envoyé par fred036
parce que généralement, on évite les accents et les cédilles et autres espaces dans les noms de fichiers !!!!
Ben j'utilise une fonction qui renomme le fichier (plus d'espace et de caractère accentué). Mais je ne lui fait traiter "que" $photo, et donc pas le fichier temporaire :

Mon code :
$submitfiles = $_FILES["submitfiles"];
$tmpfile = $submitfiles['tmp_name'];
$photo = getRewriteString($submitfiles['name']);

La fonction :
$string = strtr($string, $conversions); // Elle remplace tous les careactères accentués ici
$string = trim($string);
$string = preg_replace("/[^A-Za-z0-9_.-]+/u", "_", $string);

Que faudrait-il faire ?


Et puis pourquoi le même nom fonctionne avec un ordinateur et pas avec l'autre ?

fred036
12/01/2007, 09h20
parce que généralement, on évite les accents et les cédilles et autres espaces dans les noms de fichiers !!!!

Paul Sellis
12/01/2007, 08h33
Oops...
je vais faire plus court :

- un même ficher image portant comme nom éàç.jpg plante sur 1 ordinateur (un Mac) et pas sur l'autre (un PC)
- un autre fichier image renommé éàç.jpg fait exactement la même chose (plante sur le Mac et pas sur le PC)

C'est donc indépendant du contenu du fichier

Paul Sellis
12/01/2007, 00h46
Bonjour
je suis sur Start 1Go.
J'ai un script php d'upload de fichiers.
Sur certains fichiers à caractères accentués, j'ai un souci avec l'un de mes 2 ordinateurs (un Mac) avec un script d'upload de fichiers. Alors qu'avec l'autre (un PC) tout va bien !!!...

Les message d'erreur :
Warning: getimagesize() [function.getimagesize]: Read error! in /home.2/…/upload.php on line 27
Warning: Division by zero in /home.2/…/www/upload.php on line 28

Je vois sur le manuel php :
Si l'accès à filename est impossible ou bien si filename n'est pas une image valide, getimagesize() retournera FALSE et générera une erreur de niveau E_WARNING.

- l'image est une image valide (sur PC elle est bien traitée par ImageMagick)
- donc : qu'est-ce qui empêcherait l'accès au fichier pour un Mac et sur certains noms de fichiers ???

Exemple de noms de fichiers :
"ÇaCoûteZéro€Pièce.jpg"
aucun problème, l'image est bien uploadée et traitée
"éàç.jpg"
c'est un des fichiers qui n'est pas passé sur Mac (mais aucun souci sur PC...)

Le code php:
$submitfiles = $_FILES["submitfiles"];
$tmpfile = $submitfiles['tmp_name'];
$photo = $submitfiles['name'];

Les lignes citées dans le message d'erreur :
list($width, $height) = getimagesize("$tmpfile");
$imgratio=$width/$height;


Si je fait un
print_r($tmpfile);
j'obtiens :
/tmp/phpuBq6ca

Je n'y comprends rien

Merci pour l'aide !
Paul