IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload d'image qui ne marche que parfois [Débutant(e)]


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut Upload d'image qui ne marche que parfois
    Salut

    J'ai enfin réussi à trouver un upload d'image qui marche, mais j'ai une dernière erreur lors de l'upload d'un JPG.

    Ce qui est bizarre, c'est que cette erreur arrive sur certains JPG (comme les photos prises avec mon telephone) et pas avec d'autes (captures d'écran).

    Fatal error: Function name must be a string in /home/a7805396/public_html/fxphoto.php on line 20
    Pourtant pour d'autres JPG, la photo s'upload et se redimensionne parfaitement...

    Pour un autre JPG, il n'y a aucune erreur de code, la BDD s'update mais la photo ne s'upload pas...

    Voici mon code (celui de fxphoto.php, un include des fonctions) :

    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
    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
    <?php
        function creerImageDepuis($source) {
            $imageCreateFrom = array(
                "jpg" => "imagecreatefromjpeg",
                "png" => "imagecreatefrompng"
            );
     
            // Récupération de l'extention du fichier
            $extention = pathinfo($source, PATHINFO_EXTENSION);
            $extention = strtolower($extention);
            $extention = ($extention == "jpeg") ? "jpg" : $extention;
     
            $function = $imageCreateFrom[$extention];
            $image_source = $function($source);
     
            // Sauvegarde de la transparence de l'image
            imagealphablending($image_source, false);
            imagesavealpha($image_source, true);
     
            return $image_source;
        }
     
        function creerImage($image, $destination, $quality = 100) {
            $imageCreate = array(
                "jpg" => "imagejpeg",
                "png" => "imagepng"
            );
     
            // Récupération de l'extention du fichier
            $extention = pathinfo($destination, PATHINFO_EXTENSION);
            $extention = strtolower($extention);
     
            $function = $imageCreate[$extention];
     
            if ($extention == "jpg") {
                $function($image, $destination, $quality);
            } else {
                $function($image, $destination);
            }
     
            imagedestroy($image);
        }
     
        function redimensionneImage($source, $destination, $width, $height,
            $quality = 100){
            $image_source = creerImageDepuis($source);
     
            $size = getimagesize($source);
     
            if ($width == -1 || $height == -1) { // Si valeur automatique
                // On remplace le -1 par la valeur calculée
                $height = ($width != -1 && $height == -1) ?
                    (($size[1] * $width) / $size[0]) : $height;
                $width = ($width == -1 && $height != -1) ?
                    (($size[0] * $height) / $size[1]) : $width;
            } else if ($size[0] < $size[1]) { // Si portrait
                $tmp = $height;
                $height = $width;
                $width = $tmp;
            }
     
            $image_redim = @imagecreatetruecolor($width, $height);
            imagealphablending($image_redim, false);
            imagesavealpha($image_redim, true);
     
            imagecopyresampled ($image_redim, $image_source, 0, 0, 0, 0,
                $width, $height, $size[0], $size[1]);
     
            imagedestroy($image_source);
     
            creerImage($image_redim, $destination);
        }
    ?>
    Comment régler ça ?

    Merci d'avance

    Fiskal

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Par défaut
    est-tu sur de ton extension d'image ? Si elle n'est pas bonne ta fonction sera vide...
    Fait un var_dump de tes différentes variables et vois ce qui change quand ça marche et quand ça marche pas peut être ?

  3. #3
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Oui c'est bien un JPG...

    var_dump ? Tu pourrais m'expliquer ? Je suis, comme tu le vois, débutant

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut
    La casse est peut-être importante et un .jpg est différent de .JPG ainsi que .jpeg et .JPEG.

    Tu as regardé cela ?

    Citation Envoyé par iSteelZ Voir le message
    var_dump ? Tu pourrais m'expliquer ? Je suis, comme tu le vois, débutant
    Le var_dump te permet d'afficher ta variable et son contenu, histoire de voir qu'elle n'est pas null ...

    Entre autre ici tu devrais faire un au début de ta fonction, histoire de voir ce que contient ta source quand ça fonctionne pas ...

  5. #5
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Ouhla, sans le header y a TELLEMENT d'erreurs dans une image prise avec mon téléphone (un .jpg d'après var_dump : string 'upload/iSteelZ20120623-135438.jpg' (length=33))
    Mais les erreurs...

    http://pastebin.com/JEbr5gQP
    (pour pas que ça prenne toute la place)

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 051
    Par défaut
    Quand obtiens-tu cette erreur ? Lors de l'upload de l'image ?

    Sinon je vois ceci :
    No such file or directory in C:\wamp\www\debug\fxphoto.php on line 14
    Ça semble être explicite ... qu'as-tu à cette ligne ?

  7. #7
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $image_source = $function($source);
    C'est justement ce que je ne comprend pas

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 422
    Par défaut
    Oui ou tu aurais peut-être intérêt à utiliser une classe d'upload qui gère les erreurs.
    Tu peux essayer celle-ci. En suivant les exemples il ne te faudra qu'une dizaine de minute pour faire les premiers tests.

  9. #9
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Wow, c'est complet c'est fonction !
    Par contre, j'ai juste un problème lors de l'ajout à la BDD, comment mettre l'extension du fichier dans ma ligne "photo" ?
    Et aussi, l'image ne se renomme pas, mais sinon ça marche

    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
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
    session_start();
    $dossier = 'upload/';
    $pseudo = $_SESSION['pseudo'];
     
     
     
    include("fxphoto.php");
     
     
    	$up = new Telechargement('debug/upload','form1','doc');
     
    	$extensions = array('png', 'jpg', 'jpeg', 'gif', 'JPG', 'PNG', 'JPEG', 'GIF');
     
    	$up->Set_Extensions_accepte($extensions);
     
    	$up->Set_Redim ('100','100');
     
    	$up->Set_Renomme_fichier($pseudo);
     
    	$up->Upload('reload');
     
    	$chemin = 'upload/' . $pseudo;
     
        include("connexion.php");
     
    		$req = $bdd->prepare('UPDATE inscription SET photo = :photo WHERE pseudo = :pseudo');
            try{ $req->execute(array(
    		':pseudo' => $pseudo,
            ':photo' => $chemin    
            ));
     
    		}
    		catch (Exception $e)
    		{
    			echo $e;
    		}
     
    ?>

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 422
    Par défaut
    Faut pas mettre "reload" dans $up->Upload('reload'); sinon cela produit un reload de ta page (et donc n'exécute pas le code qui suit). Fais simplement $up->Upload();
    Et suite à $up->Upload(); tu peux appeler une fonction qui récupère le tableau des résultats avec Get_Tab_upload(), soit $tab_transfert = $up->Get_Tab_upload();

    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
    //...
    $up = new Telechargement('debug/upload','form1','doc');
     
    $extensions = array('png', 'jpg', 'jpeg', 'gif');
     
    $up->Set_Extensions_accepte($extensions);
     
    $up->Set_Redim ('100','100');
     
    $up->Set_Nomme_fichier($pseudo,'extension');
     
    $up->Upload();
     
    $tab_transfert = $up->Get_Tab_upload();
     
    // pendant la phase de développement pour bien visualiser comment récupérer le résultat tu peux faire :
    echo '<pre>';
    print_r($tab_transfert);
    echo '</pre>';
     
    //...
    Remarque qu'il n'y a pas besoin de mettre tes extensions à la fois en majuscules et en minuscules, l'un ou l'autre suffit et la classe sait interpréter le reste.

    EDIT Je viens de corriger

  11. #11
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 422
    Par défaut
    J'ai corrigé une autre erreur dans mon exemple plus haut car pour imposer un nom de fichier il faut utiliser "Set_Nomme_fichier", et pour garder l'extension originale il faut simplement indiquer un second paramètre non vide (j'ai choisi 'extension'). Et donc si le pseudo est "toto" et que toto envoie une image nommée "mon_image.jpg" l'image finale se nommera toto.jpg (c'est bien ça que tu veux ?)

    "Set_Nomme_fichier" impose un nom de destination, alors que Set_Renomme_fichier() renomme le fichier si un fichier de même nom se trouve déjà sur le serveur.

  12. #12
    Membre averti
    Profil pro
    Lycéen
    Inscrit en
    Octobre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2011
    Messages : 14
    Par défaut
    Niquel, tout marche bien, juste deux petites questions encore :
    • Pour l'insertion dans la BDD, comment j'ajoute la bonne extension au chemin ?
    • Certaines photos ne s'uploadent toujours pas (les mêmes d'ailleurs), mais aucune erreur

  13. #13
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 422
    Par défaut
    Et l'affichage du tableau de résultat ne t'a pas permis de voir comment récupérer le fichier ?

    Comme il peut y avoir plusieurs upload et éventuellement plusieurs redimensionnements par upload dans des dossiers différents, le tableau de résultat est multi dimensionnel.

    Si tu n'as qu'un fichier à uploader dans un seul répertoire tu peux récupérer le fichier comme ceci :

    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
    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
    <?php
    session_start();
    $dossier = 'upload/';
    $pseudo = $_SESSION['pseudo'];
     
    // fichier contenant la classe d'upload
    require("fxphoto.php");
     
    $up = new Telechargement('debug/upload','form1','doc');
     
    $extensions = array('png', 'jpg', 'jpeg', 'gif');
     
    $up->Set_Extensions_accepte($extensions);
     
    $up->Set_Redim ('100','100');
     
    $up->Set_Nomme_fichier($pseudo,'extension','v');
     
    $up->Upload();
     
     
    // Récupération du tableau de transfert de fichiers
    $transfert = $up->Get_Tab_upload();//tableau à plusieurs dimensions 
     
    // définition d'une variable par défaut
    $fichier = null;
     
    // Exemple de récupération du nom du fichier pour un upload unique
    if (isset($transfert['resultat']))
    {
        foreach ($transfert['resultat'] as $num => $rep)
        {
            foreach ($rep as $key => $value)
            {
                if(!empty($value['nom'])) $fichier =  $value['nom'];// Nom du fichier transféré
            }                     
        }    
    }
     
     
    if(isset($fichier))
    {
        // si on est dans cette condition on est certain qu'un fichier à été téléchargé
        $chemin = 'upload/' . $fichier;
     
        include("connexion.php");
        try
        {	
    	$req = $bdd->prepare('UPDATE inscription SET photo = :photo WHERE pseudo = :pseudo');
     
    	$req->execute(array(
    	':pseudo' => $pseudo,
    	':photo' => $chemin    
    	));			
        }
        catch (PDOException $e)
        {
            echo $e->getMessage();
        }	
     
        // En fin de code : rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page	
        $up->Get_Reload_page();
    }
    ?>

  14. #14
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 422
    Par défaut
    Au fait quand tu dis qu'aucun message ne s'affiche en cas d'erreur de fichier, as-tu utilisé la fonction Get_Tab_message() qui permet de faire afficher les messages ?

Discussions similaires

  1. [RegEx] REGEX qui ne marche que dans certains cas
    Par Galdon dans le forum Langage
    Réponses: 4
    Dernier message: 14/01/2010, 09h15
  2. lien PHP avec arret sur image qui ne marche pas
    Par MYBEE DESIGN dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 12/09/2009, 19h17
  3. CSS input qui ne marche que sur Firefox
    Par DJ Caësar 9114 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/04/2009, 09h41
  4. input type=image qui ne marche pas toujours
    Par lenissart dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 26/11/2008, 14h35
  5. [Eclipse 3.0.1] Image qui n'affiche que son path
    Par thehpman dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/03/2005, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo