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 18/03/2011, 16h36   #1
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
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 :
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 !
chuckichucki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 11h53   #2
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : 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 : 545
Points : 545
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 ?
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 15h55   #3
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
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.
chuckichucki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 22h32   #4
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
Re,

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

Code :
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 ?
chuckichucki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 22h54   #5
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : 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 : 545
Points : 545
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.
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 14h18   #6
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
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
chuckichucki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2011, 19h08   #7
Membre expérimenté
 
Avatar de nadox
 
Homme
Développeur
Inscription : 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 : 545
Points : 545
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
nadox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 17h19   #8
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
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 :
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
chuckichucki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 12h00   #9
Candidat au titre de Membre du Club
 
Inscription : mai 2010
Messages : 43
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 43
Points : 10
Points : 10
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
chuckichucki 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 22h34.


 
 
 
 
Partenaires

Hébergement Web