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'images


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut Upload d'images
    Bonjour

    J'ai un script d'import de flux XML. Il me permet d'importer des offres de sites marchands.

    Ce script insère les offres dans ma base MySQL et upload des images sur mon serveur.

    Pour une raison que je ne comprends pas, les images d'un des partenaires ne s'uploadent pas bien et font que le script s'arrête provoquant notamment une déconnexion à la base MySQL.

    Voici le script d'upload d'image qui est appelé

    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
    function upload_image($image_url, $id_annonceur, $id_offre_annonceur, $extension) {
     
    // On nomme l'image avec id_annonceur + id_offre_annonceur
    if ($extension == "") {$extension = ".jpg";}
    $img = '/homez.402/pourtoim/www/img_offres/'.$id_annonceur.'_'.$id_offre_annonceur.''.$extension.'';
    file_put_contents($img, file_get_contents($image_url));
    $image = new SimpleImage();
    $image->load($img);
    // 1er resize en 300 par 200
    $image->resize(300,200);
    $new_name = '/homez.402/pourtoim/www/img_offres/300-200_'.$id_annonceur.'_'.$id_offre_annonceur.''.$extension.'';
    $image->save($new_name);
    // 2e resize en 220 par 147
    $image->resize(220,147);
    $new_name = '/homez.402/pourtoim/www/img_offres/220-147_'.$id_annonceur.'_'.$id_offre_annonceur.''.$extension.'';
    $image->save($new_name);
    // 3e resize en 75 par 53 pour le widget
    $image->resize(75,53);
    $new_name = '/homez.402/pourtoim/www/img_offres/75-53_'.$id_annonceur.'_'.$id_offre_annonceur.''.$extension.'';
    $image->save($new_name);
     
    // Suppression du fichier original
    unlink("/homez.402/pourtoim/www/img_offres/".$id_annonceur."_".$id_offre_annonceur."".$extension."");
    }
    Les fonctions new SimpleImage, save etc. sont présentes , je ne les ai pas mises ici par souci de simplicité.

    Voici un exemple d'une image qui provoque le problème. J'ai l'impression que le problème vient du fait que l''image est corrompue, sans pouvoir en être sûr.

    http://kgbdeals-images.s3.amazonaws....36_1_thumb.jpg

    Dès lors que le script rencontre une image problématique, il se déconnecte du serveur MySQL avec un message d'erreur : "Mysql server has gone away" ce qui empêche l'insertion des offres suivantes.

    Donc plusieurs questions :
    - comment faire pour permettre au script de continuer même si l'image pose un problème ?
    - comment faire pour uploader l'image même si elle est corrompue ?

    Merci par avance de votre aide car je galère depuis pas mal de jours sur ce problème !

  2. #2
    Membre confirmé Avatar de nadox
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2010
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 360
    Points : 551
    Points
    551
    Par défaut
    Bonjour,

    Au hasard (à la louche) :

    - ne pas redimmensionner les images avant l'upload complet et effectif
    - redimmensionner une copie de l'image
    - try catch ça existe en php ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup, en effet cela me semble une bonne idée d'enregistrer avant de redimensionner, je vais tester cela ce soir et je te tiens au courant.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Re,

    En fait l'image est bien d'abord sauvegardée via le code appelé en début de fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($img, file_get_contents($image_url));
    Par ailleurs, j'ai sauvegardé l'image sur mon disque dur et j'ai retenter de l'uploader en la mettant dans un input type = image et cela fonctionne parfaitement. J'ai vraiment le sentiment que cela provient du format de l'image, sans pouvoir le prouver....

    Des idées ?

  5. #5
    Membre confirmé Avatar de nadox
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2010
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 360
    Points : 551
    Points
    551
    Par défaut
    Oui, effectivement. Le fichier est bien enregistré avec ce code.
    C'est bien le format de l'image qui pose problème.(un format non-valide arrive souvent, puisque les formats sont des normes plus ou moins respectées - cf html/css)

    En fait, ce que je proposais était de copier ce fichier pour ne pas l'abîmé(garder le fichier corrompu quand même) et faire le traitement(redimensionnement) sur cette copie.

    Enfin, et surtout, pour s'assurer que le script ne plantera pas, il faut utiliser un bloc try/catch autour des traitements de l'image pour que le script puisse continuer normalement même si il rencontre une erreur. De plus on peut afficher une erreur dans les logs au sein du catch.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Salut Nadox

    Merci pour ta réponse.

    Donc si je comprends bien ce que tu suggères c'est de tester le processus suivant :
    1. Upload du fichier, même corrompu
    2. Copie de ce fichier
    3. Resize et traitement de l'image sur la copie et non pas l'original

    Sur la copie du fichier, quelle est la fonction que tu recommandes ? Copy() tout simplement ?

    Merci

  7. #7
    Membre confirmé Avatar de nadox
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2010
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 360
    Points : 551
    Points
    551
    Par défaut
    En fait la copie n'était qu'une suggestion, afin de garder le fichier qui pose soucis et éventuellement le traiter manuellement.
    Une image corrompu pour l'utilitaire de redimensionnement n'est pas forcément illisible avec un logiciel comme gimp ou paint dot net.
    Le plus important est d'avoir une capture de l'erreur de redimmensionnement sans bloquer le reste du processus. Regarde du côté du bloc try/catch.
    Je suppose d'ailleurs que si ça provoque une déconnection de la base de données, et une perte d'accés, c'est qu'il manque probablement une capture des erreurs concernant l'utilisation de la connexion à la base de données. (un autre bloc "try catch finally")
    http://php.net/manual/fr/language.exceptions.php

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Ok merci

    J'ai l'URL d'origine de l'image donc pas besoin de copie je pense.

    Concernant les exceptions, je vais tester un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    try {
           if (upload_image($image_url, $id_annonceur, $id_offre_annonceur, $extension)) {
            throw new Exception('Impossible d'uploader l'image');
        }
    Je te tiens au courant

    Merci

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2010
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 54
    Points : 30
    Points
    30
    Par défaut
    Salut,

    Le try / catch fonctionne à merveille, merci beaucoup pour ton aide.

    En ervanche j'ai toujours ces images noires, je pense qu'elles sont corrompues.... pourtant des sites similaires au mien arrivent à bien uploader les images et utilisent les même sources de données que moi...

    Bon weekend

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/12/2005, 22h17
  2. Uploader une image à partir d'un formulaire ?
    Par netwebzone dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2005, 09h27
  3. [Upload] Upload d'image....
    Par tochbee dans le forum Langage
    Réponses: 3
    Dernier message: 21/11/2005, 11h44
  4. [Debutant] [JSP/Servlet] Upload d'image vers le serveur
    Par ShinJava dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 05/07/2005, 17h42
  5. Upload d'images sur le forum
    Par KibitO dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 09/10/2004, 23h18

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