upload + redimensionnement d'image

Eléphant du PHP | 299 Messages

16 oct. 2014, 15:58

Bonjour a tous!

Je me permet de vous deranger sur un truc que je n'ai jamais fait et qui du coup me chagrine un peu, le redimensionnement d'image. Je suis en train de faire un petit systeme simple de gestion de bibliotheque (livres) pour ma femme.

J'ai un formulaire qui fonctionne tres bien comme ceci : On rentre le titre, année, auteur, et un fichier qui est la couverture du livre. Ca fonctionne trés bien.

Seconde étape, la ou je bloque, c'est que j'aimerai créer une miniature de 200px de haut de cette couverture.

La photo originale se trouve dans le dossier /img/ tandis que j'aimerai redimensionner et uploader une copie de cette image dans /min/ qui se situe au meme niveau que /img/


Voici le formulaire qui fonctionne trés bien avant mon probleme et le second avec une tentative de copie, de redimensionnement et d'upload qui ne marche pas.
<?php 
session_start();
include ('config.php');
mysql_query("SET NAMES 'utf8'");
$titre = $_POST['titre'];
$auteur = $_POST['auteur'];
$annee = $_POST['annee'];
$resume = $_POST['resume'];
$photo = $_FILES['photo'];


$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	
	$photo = !empty($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
	

	$extension = strrchr($_FILES['photo']['name'], '.');
	$dossier = '/home/monsite/www/biblix/img/';
	


     //On formate le nom du fichier ici...
     $photo = strtr($photo, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo = preg_replace('/([^.a-z0-9]+)/i', '-', $photo);
	 move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $photo); //Si la fonction renvoie TRUE, c'est que ça a fonctionné...




mysql_query("INSERT INTO biblix VALUES('', '$titre', '$auteur', '$annee', '$photo', '$photo2')")or die(mysql_error()); 


mysql_close();
?>
<meta http-equiv="Refresh" content="0;URL=add.php" />


<?php 
session_start();
include ('config.php');
mysql_query("SET NAMES 'utf8'");
$titre = $_POST['titre'];
$auteur = $_POST['auteur'];
$annee = $_POST['annee'];
$resume = $_POST['resume'];
$photo = $_FILES['photo'];


$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	
	$photo = !empty($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
	

	$extension = strrchr($_FILES['photo']['name'], '.');
	$dossier = '/home/monsite/www/biblix/img/';
	


     //On formate le nom du fichier ici...
     $photo = strtr($photo, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo = preg_replace('/([^.a-z0-9]+)/i', '-', $photo);
	 move_uploaded_file($_FILES['photo']['tmp_name'], $dossier . $photo); //Si la fonction renvoie TRUE, c'est que ça a fonctionné...







$photo2 = $photo;
$new_value = "200";

function RedimensionnerImage($photo2, $type_value = "H", $new_value,  $compression = 70, $sortie = "/home/monsite/www/biblix/min/") {
  /*
    Récupération des dimensions de l'image afin de vérifier
    que ce fichier correspond bel et bien à un fichier image.
    Stockage dans deux variables le cas échéant.
  */
  if( !( list($source_largeur, $source_hauteur) = @getimagesize($source) ) ) {
    return false;
  }
  /*
    Calcul de la valeur dynamique en fonction des dimensions actuelles
    de l'image et de la dimension fixe que nous avons précisée en argument.
  */
  if( $type_value == "H" ) {
    $nouv_hauteur = $new_value;
    $nouv_largeur = ($new_value / $source_hauteur) * $source_largeur;
  } else {
    $nouv_largeur = $new_value;
    $nouv_hauteur = ($new_value / $source_largeur) * $source_hauteur;
  }
  /*
 Création du conteneur, c'est-à-dire l'image qui va contenir la version
  redimensionnée. Elle aura donc les nouvelles dimensions.
  */
  $image = imagecreatetruecolor($nouv_largeur, $nouv_hauteur);
  /*
    Importation de l'image source. Stockage dans une variable pour pouvoir
    effectuer certaines actions.
  */
  $source_image = imagecreatefromstring(file_get_contents($source));
  /*
    Copie de l'image dans le nouveau conteneur en la rééchantillonant. Ceci
    permet de ne pas perdre de qualité.
  */
  imagecopyresampled($image, $source_image, 0, 0, 0, 0, $nouv_largeur, $nouv_hauteur, $source_largeur, $source_hauteur);
  /*
    Si nous avons spécifié une sortie et qu'il s'agit d'un chemin valide (accessible
    par le script)
  */
  if(strlen($sortie) > 0 and @touch($sortie)) {
    /*
     Enregistrement de l'image et affichage d'une notification à l'utilisateur.
    */
    imagejpeg($image, $sortie, $compression);
    echo "Fichier sauvegardé.";
  /*
    Sinon...
  */
  } else {
    /*
     ...Nous indiquons au navigateur que nous affichons une image en définissant le
     header et nous affichons l'image.
    */
    header("Content-Type: image/jpeg");
    imagejpeg($image, NULL, $compression);
  }
}




mysql_query("INSERT INTO biblix VALUES('', '$titre', '$auteur', '$annee', '$photo', '$photo2')")or die(mysql_error()); 


mysql_close();
?>
<meta http-equiv="Refresh" content="0;URL=add.php" />

Le probleme est que je ne sais pas comment décéler les erreurs :/

Si vous aviez des conseils ca serait super!

Merci d'avance!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 oct. 2014, 22:02

salut,

que ce passe t'il quand tu utilise la fonction ?

utilise tu un IDE (genre eclipse) ?
si oui place un point de debug dans la fonction et suis le code pas à pas.

sinon vire les @ c'est plus simple pour debug d'avoir les messages d'erreurs (s'il y a) ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 299 Messages

16 oct. 2014, 22:30

Bonjour et merci de ta reponse!

Ben a vrai dire, tu parles chinois pour moi, je ne connais que les bases en php, tout est de moi sauf la partie "redimensionner" que j'ai un peu pomper comme point de départ pour essayer de comprendre.

Je ne sais pas ce qu'est un IDE ni une eclypse, desolé :)

Je teste ca demain et je te repond.


Merci encore!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 oct. 2014, 22:52

IDE : en français un environnement de développement intégré. c'est super pratique et permet le debug ;)
si tu veux bosser correctement sans te faire chier c'est un passage obligé (auto complétion des fonctions, colorisations de la syntaxe debug etc. etc.).
pour eclipse => eclipse.org
tu peux aussi tester netbeans ou phpstorm (evalutation limitée à 30j).

pour le reste utiliser la fonction => http://www.lephpfacile.com/cours/9-les- ... ilisateurs

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 299 Messages

21 oct. 2014, 23:03

Hello!

Bon j' ai essayé d'aller voir eclipse, je suis un peu perdu a vrai dire.

Je vais le telecharger mais il fait un peu peur le site en anglais.

Sinon concretement ca sert a quoi? Ca fait pas tout le boulot a notre place ca serait trop simple :p

Bon j'y pense, j'ai pas de @ dans mon code.

Du coup je sais toujours pas comment tester ce qui ne vas pas :/

ViPHP
AB
ViPHP | 5818 Messages

28 oct. 2014, 18:59

Salut,

Débuguer ce genre de script est souvent assez fastidieux. Pour cette raison j'ai fait deux classes d'upload et redimensionnement. Une version tout php est ici. La même version plus complète qui gère en plus les préfixes et suffixes et qui dispose d'un dossier de test pré configuré est là.
Ensuite un second système d'upload encore plus complet avec Ajax+Php qui permet des retours d'information en temps réel, de surpasser les configurations serveur "upload_max_filesize" et "post_max_size", de faire des sauvegardes partielles et reprises de téléchargement, mais aussi des redimensionnements, est disponible ici avec un dossier de tests prêt à l'emploi.

Eléphant du PHP | 299 Messages

04 nov. 2014, 21:14

Ha ouais quand meme!

Bon ben je vais aller voir ton travail aprés.

De mon côté, je suis reparti un peu de zero, ca ne fonctionne toçujours pas, je rapelle que j' upload sans soucis la photo originale mais pas la redimensionnée, avec deux erreur suivantes + fichier non uploadé:
Notice: Array to string conversion in /home/bernayin/www/includes/mpic.php on line 48

Notice: Array to string conversion in /home/bernayin/www/includes/mpic.php on line 60
<?php
session_start();
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
<?php
if(!isset($_SESSION['test']))
{
echo '<meta http-equiv="Refresh" content="0;URL=index.php">';
exit();
}
else
{

$photo = $_FILES['photo'];
$pseudoget = $_SESSION['test'];

$extensions = array('.png', '.gif', '.jpg', '.jpeg', '.PNG', '.GIF', '.JPG', '.JPEG');
	
	$photo4 = !empty($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
	
	$taille4 = filesize($_FILES['photo']['tmp_name']);
	$extension4 = strrchr($_FILES['photo']['name'], '.');
	$dossier4 = '/home/test/www/images/profils/';
	$taille_maxi = '50000000';
	
	
	if(!in_array($extension4, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...<br><br> Taille de la photo maxi : 500000 Ko';
}
if($taille4>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
	 
	 
	 
	 										
	 										  $ImageNews = getimagesize($_FILES['photo']['tmp_name']);
											  $ExtensionPresumee = explode('.', $ImageNews);
                            				$ExtensionPresumee = strtolower($ExtensionPresumee[count($ExtensionPresumee)-1]);
	  										  $ImageChoisie = imagecreatefromjpeg($_FILES['photo']['tmp_name']);
                                              $TailleImageChoisie = getimagesize($_FILES['photo']['tmp_name']);
                                              $NouvelleLargeur = 200; //Largeur choisie 
 
                                              $NouvelleHauteur = ( ($TailleImageChoisie[1] * (($NouvelleLargeur)/$TailleImageChoisie[0])) );
 
                                              $NouvelleImage = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
 
                                              imagecopyresampled($NouvelleImage , $ImageChoisie  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $TailleImageChoisie[0],$TailleImageChoisie[1]);
                                              imagedestroy($ImageChoisie);
                                              $NomImageChoisie = explode('.', $ImageNews);
                                              $NomImageExploitable = time();
                                              
                                              imagejpeg($NouvelleImage , '/home/test/www/images/profils/'.$NomImageExploitable.'.'.$ExtensionPresumee, 100);
                                              $LienImageNews = '/home/test/www/images/profils/'.$NomImageExploitable.'.'.$ExtensionPresumee;
											  
											  
	 move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4); //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
	 
							 				  
											  
											  
	 
	 
	 mysql_query("UPDATE test_users SET photo4 = '".$photo4."' WHERE pseudo = '".$pseudoget."'")or die(mysql_error());
	 
	 echo '<meta http-equiv="Refresh" content="0;URL=index.php?u=pfl&user=';
	 echo $_SESSION['test'];
	 echo '">';
	 
 

}
     

}

?>
Les lignes 48 et 60 sont:

$ExtensionPresumee = explode('.', $ImageNews);


$NomImageChoisie = explode('.', $ImageNews);


Merci pour l'aide!

ViPHP
AB
ViPHP | 5818 Messages

05 nov. 2014, 05:59

Salut,

Peut-être d'autres prendront du temps pour t'aider... mais je te conseille plutôt d'utiliser une des classes toutes faites car quand bien même tu résoudrais tes problèmes actuels il en reste d'autres auxquels tu n'as pas penser :
- Par exemple en cas de dépassement d'une configuration serveur (une image trop lourde par exemple) le visiteur va se retrouver devant une page blanche en guise de toute information et ton test sur la taille des fichiers ne servira à rien car dans ce cas les superglobales $_POST et $_FILES seront vides.
- Aussi je vois que tu utilise strtr() qui n'est pas compatible utf-8
- Si une image de même nom existe déjà sur le serveur tu l'écrase sans avertissement ?

Par ailleurs si tu veux ensuite autoriser l'upload multiple il faudra refaire ton script, etc.

En plus les upload et redimensionnements sont du code spécifique. Tu n'apprendras quasiment rien en php qui te resserviras ailleurs dans ton code.
Comme tu es débutant tu gagnerais sans doute à ne pas réinventer la roue sur ce sujet pour l'instant, ce qui te laisserais plus de temps pour travailler par exemple mysql (cette extension est dépréciée, il faudrait utiliser mysqli ou de préférence pdo...), ainsi que les redirections php qui se font avec un header de redirection et non pas avec des balises meta html...

Eléphant du PHP | 299 Messages

27 janv. 2015, 23:56

Hello, desolé pour le retard mais je ne vous ai pas abandonné.


Ben pdo je ne connais pas du tout et je sais bien que je ne suis pas du tout a jour dans mon language php.

Disons que c'est pour le plaisir et puis c'est pour une petite association.

Non, l'image ne sera pas écrasé si double nom, puisque je veux utilise la fonction time() dans le choix du nom avant upload.


Je recommence donc sur mon script de base, je cherche donc comme convenu avant upload a copier et redimensionner l'image, en tout cas voici mon code, je vais surement passer 3 ans à trouver mais bon mieux vaut tard que jamais, donc voici la base, dés que j'ai deux minutes je tente la copie-redimensionnement, donc si en attendant vous voulez me guider, n'hésitez pas.

 <?php
	$extensions = array('.png', '.gif', '.jpg', '.jpeg');
	
	$photo4 = !empty($_FILES['photo']['name']) ? time()."_".$_FILES['photo']['name'] : '';
	
	$taille4 = filesize($_FILES['photo']['tmp_name']);
	$extension4 = strrchr($_FILES['photo']['name'], '.');
	$dossier4 = '/home/test/www/images/profils/';
	$taille_maxi = '500000';
	
	
	if(!in_array($extension4, $extensions)) //Si l'extension n'est pas dans le tableau
{
     $erreur = 'Vous devez uploader un fichier de type png, gif, jpg, jpeg...<br><br> Taille de la photo maxi : 5000 Ko';
}
if($taille4>$taille_maxi)
{
     $erreur = 'Le fichier est trop gros...';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{
     //On formate le nom du fichier ici...
     $photo4 = strtr($photo4, 
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     $photo4 = preg_replace('/([^.a-z0-9]+)/i', '-', $photo4);
	 move_uploaded_file($_FILES['photo']['tmp_name'], $dossier4 . $photo4)or die(mysql_error()); //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
}