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 et redimensionnement de photos


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut Upload et redimensionnement de photos
    Bonjour j'utilise le code suivant pour uploader et redimensionner max 11 photos sur un site . Le code fonctionne parfaitement
    lorsque les photos font environ 500ko mais lorsqu'elles sont trop lourdes ça ne fonctionne pas ( sans message d'erreur).
    J'aurais besoin de votre aide svp.
    merci

    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
    $dossier = $_GET['rep'];
    $ListeExtension = array('jpg' => 'image/jpeg', 'jpeg'=>'image/jpeg');
    $ListeExtensionIE = array('jpg' => 'image/pjpeg', 'jpeg'=>'image/pjpeg');
    // upload et redimensionnement miniature
      if ($_FILES['mini']['error'] <= 0){
          if ($_FILES['mini']['size'] <= 5242880){
                $ImageNews = $_FILES['mini']['name'];
                 $ExtensionPresumee = explode('.', $ImageNews);
                 $ExtensionPresumee = strtolower($ExtensionPresumee[count($ExtensionPresumee)-1]);
                     if ($ExtensionPresumee == 'jpg' || $ExtensionPresumee == 'jpeg'){
                       $ImageNews = getimagesize($_FILES['mini']['tmp_name']);
                             if($ImageNews['mime'] == $ListeExtension[$ExtensionPresumee]  || $ImageNews['mime'] == $ListeExtensionIE[$ExtensionPresumee]){
                                 $ImageChoisie = imagecreatefromjpeg($_FILES['mini']['tmp_name']);
                                 $TailleImageChoisie = getimagesize($_FILES['mini']['tmp_name']);
                                 $NouvelleLargeur = 150; 
    				$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);
                                 imagejpeg($NouvelleImage , '../vehicules/'.$dossier.'/mini.'.$ExtensionPresumee, 100);
    				echo "Miniature : Transfert réussi <br>";
                            }
    		}
    	}
     }
    // upload et redimensionnement photo 1 à 10
    for ($i = 1; $i <= 10 ;  $i++) {
    	if ($_FILES[$i]['error'] <= 0){
    		if ($_FILES[$i]['size'] <= 5242880){
                		$ImageNews = $_FILES[$i]['name'];
      			$ExtensionPresumee = explode('.', $ImageNews);
                		$ExtensionPresumee = strtolower($ExtensionPresumee[count($ExtensionPresumee)-1]);
                     	if ($ExtensionPresumee == 'jpg' || $ExtensionPresumee == 'jpeg'){
                      		$ImageNews = getimagesize($_FILES[$i]['tmp_name']);
                            	if($ImageNews['mime'] == $ListeExtension[$ExtensionPresumee]  || $ImageNews['mime'] == $ListeExtensionIE[$ExtensionPresumee]){
                                         $ImageChoisie = imagecreatefromjpeg($_FILES[$i]['tmp_name']);
                                         $TailleImageChoisie = getimagesize($_FILES[$i]['tmp_name']);
                                         $NouvelleLargeur = 760;
                                         $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);
    					imagejpeg($NouvelleImage , '../vehicules/'.$dossier.'/'.$i.'.'.$ExtensionPresumee, 100);
                                            echo 'Photo '.$i.' : Transfert réussi <br>';
                                    }
    			}	
    		}
    	}
    }
    ?>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il est probable que tu tombes dans le cas $_FILES['mini']['error'] != 0
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    meme en supprimant ce test ca ne change rien

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Heu... tu ne crois quand même pas qu'il suffit de supprimer le test pour supprimer l'erreur ?

    Sinon, je te conseille le script d'upload d'ABCIWEB.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Tu dois dépasser la configuration serveur "post_max_size" et dans ce cas les variables $_POST et $_FILES sont nulles. Tu pourrais gérer l'erreur en testant l'existence d'une variable $_GET jointe au formulaire et l'absence de variable $_POST pour envoyer un message d'erreur adéquat. Mais si cela évite la page blanche cela ne résout pas le problème.

    Le lien ci-dessus donné par Bovino permet de surpasser les configurations serveur (taille et nombre de fichiers uploadés). En prime tu peux faire afficher des retours d'information en temps réel, prévisualiser les images avant l'upload, arrêter le téléchargement de certains fichiers etc. Et pour les gros fichiers on dispose automatiquement d'une sauvegarde qui permet une reprise d'upload en cas d'arrêt volontaire ou panne internet. Il y a aussi un exemple pour les redimensionnements d'images donc cela correspond bien à tes besoins

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    merci j'utilise ton script il est vraiment très bien.

    juste une dernière question comment faire passer une variable contenant le nom du dossier de destination de la page d'upload a la page de traitement.

    merci

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Tu peux rajouter des champs input dans le formulaire, il seront retransmis automatiquement vers le script php. A réception en php il te suffira de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $champ = urldecode($_POST['champ ']) ;
    Cela dit s'il s'agit de transmettre le dossier de destination des fichiers, il faut être prudent car il peut être modifié par un pirate. A réception en php il faudra contrôler que la valeur de cette variable est un dossier permis

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    merci , ton script fonctionne bien mais malheureusement j'ai toujours le même problème
    avec des images de plus de 600ko il me renvoie l'erreur : Echec du téléchargement. SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Tu disais que ça fonctionnait bien plus haut...

    Bah je sais pas ce que tu as fais, il semble bien que le script php d'upload ne construise plus correctement le json de réponse ajax. Refais des essais avec le script original et fais des tests quand tu le modifie pour voir si c'est ok ou si ça bloque. J'ai testé des fichiers de plusieurs giga octect alors 600 Ko...

    Ou peut être ton fichier est corrompu, essaies avec d'autres pour voir. Eventuellement cela pourrait être un problème lors du redimensionnement de l'image, teste sans le redimensionnement pour voir. Et tu teste comment, en local ou sur un serveur distant ? Lequel ? ... Donne des précisions.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    le probleme vient du redimensionnement "Echec du téléchargement. Erreur dans le redimentionnement du fichier."
    mais je ne vois pas ma faute :
    merci pour ton aide
    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
     
    <?php
    $dossier = urldecode($_POST['dossier']) ;
     
    $dossier_destination = '../../vehicules/'.$dossier.'/';
    $dossier_temporaire = '../Upload_Temp/';
     
    session_start();
     
    ignore_user_abort(true);
     
    header('Content-type: text/html; charset=UTF-8');
     
    require 'UploadAjaxABCIServeur.php';
    require 'fctredimimage.php';
    $up = new UploadAjaxABCIServeur($dossier_destination, $dossier_temporaire);
     
    $unidid_form = $up->getUniqidForm();
     
    if(!(isset($unidid_form,$_SESSION['UploadAjaxABCI'][$unidid_form]))) $up->exitErreurFichier('Identifiant de formulaire non valide. Rafraîchissez la page'); 
     
    $up->Upload();
     
    $fichier_complet = $up->getFichierComplet();
     
     
    		$basename = basename($fichier_complet);
    		$dirname = dirname($fichier_complet).'/';
     
    		$extension_fichier = strtolower(pathinfo($destination_fichier, PATHINFO_EXTENSION));
     
    		$redim = fctredimimage(200, 200, '', '', $dirname, $basename,$extension_fichier);
     
    		if(!$redim) 
    		{
    			$up->exitErreurFichier("Erreur dans le redimentionnement du fichier.");
    		}
     
     
    $up->Transfert();
     
    $up->exitReponseAjax();
    ?>

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Tu étais sur la bonne voie mais tu utilises une variable "$destination_fichier" que tu n'as pas définie. Et puis il faut tester que le fichier est complet avant de faire le redimensionnement. Ce qui donne :

    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
    <?php
    // ... code plus haut inchangé 
     
    $fichier_complet = $up->getFichierComplet();
     
    if($fichier_complet != false)
    {
            $destination_fichier = $up->getFichierDestination();
     
    	$basename = basename($fichier_complet);
    	$dirname = dirname($fichier_complet).'/';
     
    	$extension_fichier = strtolower(pathinfo($destination_fichier, PATHINFO_EXTENSION));
     
    	$redim = fctredimimage(200, 200, '', '', $dirname, $basename,$extension_fichier);
     
    	if(!$redim) 
    	{
    		$up->exitErreurFichier("Erreur dans le redimentionnement du fichier.");
    	}
    }
     
    $up->Transfert();
     
    $up->exitReponseAjax();
    ?>

    Attention dans cette configuration les nouveaux fichiers écraseront les anciens de même nom.
    Si tu veux éviter cela, soit tu peux faire un test avant et sortir du script (comme montré dans les commentaires de l'exemple général), soit tu peux utiliser la fonction RenommeDoublon pour renommer les nouveaux fichiers à la volée. Dans ce cas comme on redéfini (éventuellement en cas de doublon) la variable "$destination_fichier" qui contient le nom final du fichier, il faut passer cette variable dans la fonction "Transfert()".
    Et pour éviter de se heurter une nouvelle fois au problème de variable indéfinie, on mettra la fonction "Transfert()" à l'intérieur de la condition "if($fichier_complet != false)" puisque c'est dans cette condition que l'on défini $destination_fichier. Ce qui donnerait :

    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
    // ... code plus haut inchangé 
    if($fichier_complet != false)
    {
    	$destination_fichier = $up->getFichierDestination();
            //RenommeDoublon peut être configurée pour ajouter un suffixe incrémenté. Par défaut un suffixe aléatoire est ajouté en cas de doublon (cf doc)
    	$destination_fichier = $up->RenommeDoublon($destination_fichier);
     
    	$basename = basename($fichier_complet);
    	$dirname = dirname($fichier_complet).'/';
     
    	$extension_fichier = strtolower(pathinfo($destination_fichier, PATHINFO_EXTENSION));
     
    	$redim = fctredimimage(200, 200, '', '', $dirname, $basename,$extension_fichier);
     
    	if(!$redim) 
    	{
    		$up->exitErreurFichier("Erreur dans le redimentionnement du fichier.");
    	}
     
    	$up->Transfert($destination_fichier);
    }
     
    $up->exitReponseAjax();
    Sinon, pour la sécurité tu devrais aussi compléter par un contrôle sur les extensions. Cela éviterait aussi un bug si l'on tentait de redimensionner un fichier qui n'est pas une image, au cas où le contrôle des extensions côté javascript serait contourné. Les contrôles javascript permettent une meilleure expérience utilisateur (pour avoir une information immédiate) mais on ne peut pas leur faire confiance car ils pourraient être piratés, donc on refait le contrôle côté serveur.
    On rajouterait donc normalement ce bout de code juste avant l'utilisation de la fonction $up->Upload() et juste après la vérification de la variable de session, soit :

    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
     
    // ... code plus haut inchangé 
     
    if(!(isset($unidid_form,$_SESSION['UploadAjaxABCI'][$unidid_form]))) $up->exitErreurFichier('Identifiant de formulaire non valide. Rafraîchissez la page'); 
     
    if($up->getFragment())
    {
    	$extensions_autorisees = array('jpg','jpeg','png');
     
    	$nom_fichier_nettoye = $up->getFichierNomNettoye();// on pourrait utiliser le nom original avec la fonction adéquate mais un nom de fichier nettoyé offre une meilleure compatibilité avec tous les serveurs. A noter que la fonction "getFichierDestination()" utilisée plus bas dans le code utilise par défaut un nom nettoyé. Voir dans les commentaires du code si besoin pour faire autrement
     
    	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$extensions_autorisees);
    	if($verif_extension == false) 
    	{
    		$up->exitErreurFichier('Extension du fichier non valide.');
    	}	
    }
     
    $up->Upload();
    // ... code plus bas inchangé
    On met ce code avant l'upload car inutile d'aller plus loin si l'extension n'est pas correcte. Et on teste avec if($up->getFragment()) pour éviter une erreur si l'on envoyait l'upload sans fichier joint.

    C'est pas vraiment très compliqué mais c'est vrai qu'il faudrait que je trouve un moyen plus simple pour renvoyer les erreurs lors de la modification/configuration du code php, ce serait plus cool pour les débutants. En attendant tu peux retrouver ces erreurs php dans le retour de console des outils de développement des navigateurs (F12 pour Chrome ou FF).

    Dis-moi si ça fonctionne ou pas, j'ai testé ces exemples et c'est ok chez moi

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    salut
    merci pour ton aide . Après de nombreux tests j'arrive à faire fonctionner ton script quelque soit la taille du fichier (test jusqu’à 5Mo) la seule chose que j'ai remarquer c'est que la fonction de redimensionnement plante pour des images de plus de 4000px de large . je ne sais pas si tu as rencontré ce problème. ou si ça vient de mon serveur distant.
    dernière petite chose après avoir modifier le script à ma sauce il fonctionne bien mais il me garde une copie original (nom d'origine et taille ) du fichier téléchargé dans le dossier de destination en plus des fichiers redimensionnés et renommés.

    mon code :

    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
    <?php
    $dossier = urldecode($_POST['dossier']) ;
     
    $dossier_destination = '../../vehicules/'.$dossier.'/';
    $dossier_temporaire = '../Upload_Temp/';
     
    session_start();
     
    ignore_user_abort(true);
     
    header('Content-type: text/html; charset=UTF-8');
     
    require 'UploadAjaxABCIServeur.php';
    require 'fctredimimage.php';
    $up = new UploadAjaxABCIServeur($dossier_destination, $dossier_temporaire);
     
    $unidid_form = $up->getUniqidForm();
     
    if(!(isset($unidid_form,$_SESSION['UploadAjaxABCI'][$unidid_form]))) $up->exitErreurFichier('Identifiant de formulaire non valide. Rafraîchissez la page'); 
     
    if($up->getFragment())
    {
    	$extensions_autorisees = array('jpg','jpeg','png');
     
    	$nom_fichier_nettoye = $up->getFichierNomNettoye();// on pourrait utiliser le nom original avec la fonction adéquate mais un nom de fichier nettoyé offre une meilleure compatibilité avec tous les serveurs. A noter que la fonction "getFichierDestination()" utilisée plus bas dans le code utilise par défaut un nom nettoyé. Voir dans les commentaires du code si besoin pour faire autrement
     
    	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$extensions_autorisees);
    	if($verif_extension == false) 
    	{
    		$up->exitErreurFichier('Extension du fichier non valide.');
    	}	
    }
     
     
    $up->Upload();
     
    $fichier_complet = $up->getFichierComplet();
    $nom_input = $up->getInputName();
     
    if($fichier_complet != false)
    {
        $destination_fichier = $up->getFichierDestination();
    	$destination_fichier = $up->RenommeDoublon($destination_fichier);
     
    	$basename = basename($fichier_complet);
    	$dirname = dirname($fichier_complet).'/';
     
    	$extension_fichier = strtolower(pathinfo($destination_fichier, PATHINFO_EXTENSION));
     
    	if($nom_input == 'mini' ) 
    	     {		
    		$redim = fctredimimage(150,0, '../../vehicules/'.$dossier.'/', 'mini.jpg', $dirname,$basename,$extension_fichier);
    	     }
    	    else
    	    {
    		$nomfichier = substr($nom_input, 6, 7);	
    		$redim = fctredimimage(750,0, '../../vehicules/'.$dossier.'/', $nomfichier.'.jpg', $dirname, $basename,$extension_fichier);
    	    }
     
    	if(!$redim) 
    	{
    		$up->exitErreurFichier("Erreur dans le redimentionnement du fichier.");
    	}
    }
     
    $up->Transfert();
     
    $up->exitReponseAjax();
    ?>
    merci encore

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Le script permet de surpasser les configurations serveur "post_max_size", "upload_max_filesize" et "max_file_upload", soit les valeurs qui limitent l'upload des fichiers, mais elle ne change pas la valeur de "memory_limit".
    Les fonctions de redimensionnement sont gourmandes en mémoire et tu dois certainement dépasser la valeur de "memory_limit". Dans une page séparée tu peux faire "echo ini_get("memory_limit");" pour voir combien le serveur t'accorde de mémoire (c'est combien ?)

    Pour la sauvegarde de l'image originale en plus de l'image redimensionnée, c'est normal vu que tu as renseigné les troisième et quatrième paramètres de la fonction "fctredimimage()" et donc elle fait une copie vers cette destination, et la fonction Transfert() sans paramètre copie automatiquement le fichier original nettoyé vers la valeur de $dossier_destination. Pour un seul redimensionnement (sans sauvegarde de l'original) il faut mettre la nouvelle destination dans la fonction "Transfert()" et ne pas renseigner le troisième et quatrième paramètre de la fonction "fctredimimage()".

    Fais attention de bien remettre la fonction "Transfert()" à l'intérieur de la condition if($fichier_complet != false). De toute façon tu peux la laisser dans cette condition dans tous les cas de figure.

    Je te donnerai un exemple demain si tu veux mais avant je vois que tu laisse le choix entre deux redimensionnements ? On pourrait faire les deux redimensionnements en une seule fois si tu préfère...

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    merci pour ces explications , ce qui me gène c'est que j'ai besoin d'un renommage des fichiers or si je ne renseigne pas le 4eme paramètre de "fctredimimage()" il va me garder le nom d'origine.

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Re,

    Tu n'as pas compris le principe. Sans paramètre renseigné, la fonction "Transfert()", transfert le fichier avec le nom d'origine nettoyé (par facilité c'est le réglage par défaut si l'on veut simplement utiliser le nom du fichier nettoyé).

    Mais si tu lui donne un paramètre, elle l'utilise. Il te suffit donc de redéfinir toi-même la variable "$destination_fichier" - qui est le chemin complet de destination avec un nom de fichier que tu peux bien modifier comme tu veux) et de la passer en paramètre à la fonction "Transfert()", soit "Transfert($destination_fichier)".

    C'est le même principe que dans mon exemple plus haut où je redéfini $destination_fichier en cas de doublon sur le serveur.

    Tu n'as pas répondu à mes questions :
    - Quelle valeur obtiens-tu en faisant "echo ini_get("memory_limit");" sur ton serveur distant (test à faire dans une page séparée) ?
    - Ne souhaiterais-tu pas que l'on puisse faire les deux redimensionnements en une seule fois ?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    OK merci bon j'ai les fichiers avec le bon nom et dans le dossier correct mais maintenant j'ai un nouveau problème jamais survenu les fichier ne peuvent être lu (CHMOD : 600).
    Je l'ai resolus en changer les attribues après le transfert mais c'est bizarre
    Pour répondre a ta question pour la mémoire j’obtiens memory_limit=120M

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Pour le chmod peut-être as-tu fais des manip qui ont changé les droits... Pour être certain d'avoir les bons droits il vaut mieux les définir.

    Ci-dessous un exemple avec 3 redimensionnements en une seule passe (avec ou sans sauvegarde du fichier original) et définition des chmod :

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    <?php
    $dossier_destination = '../Destination_Upload/';
     
    $dossier_temporaire = '../Upload_Temp/';
     
    session_start();
     
    ignore_user_abort(true);
     
    header('Content-type: text/html; charset=UTF-8');
     
    require 'UploadAjaxABCIServeur.php';
    require 'fctredimimage.php';
     
    $up = new UploadAjaxABCIServeur($dossier_destination, $dossier_temporaire);
     
    $unidid_form = $up->getUniqidForm();
     
    if(!(isset($unidid_form,$_SESSION['UploadAjaxABCI'][$unidid_form]))) $up->exitErreurFichier('Identifiant de formulaire non valide. Rafraîchissez la page'); 
     
    // S'assure qu'un fichier ou un fragment de fichier est en téléchargement
    if($up->getFragment())
    {
    	$extensions_autorisees = array('jpg','jpeg','png');
     
    	$nom_fichier_nettoye = $up->getFichierNomNettoye();// on pourrait utiliser le nom original avec la fonction adéquate mais un nom de fichier nettoyé offre une meilleure compatibilité avec tous les serveurs.
     
    	$verif_extension = $up->VerifExtensions($nom_fichier_nettoye,$extensions_autorisees);
    	if($verif_extension == false) 
    	{
    		$up->exitErreurFichier('Extension du fichier non valide.');
    	}	
     
    	// Upload dans le dossier temporaire
    	$up->Upload();
     
    	// Retourne l'adresse du fichier temporaire quand il est complet, sinon false
    	$fichier_complet = $up->getFichierComplet();
    	if($fichier_complet != false)
    	{
    		/*Si plusieurs redimensionnements on utilise les troisième et quatrième paramètre de la fonction "fctredimimage()"
    		qui vont copier le fichier redimensionné dans le répertoire de destination et laisser intact le fichier original.
    		Ci-dessous je crée une fonction qui réalise la redimension et impose le chmod au fichier de destination*/
    		function Redim($L, $H, $dossier_dest=null, $nom_fichier=null, $dirname, $basename, $extension_fichier)
    		{
    			$redim = fctredimimage($L, $H, $dossier_dest, $nom_fichier, $dirname, $basename, $extension_fichier);
     
    			if(!$redim) 
    			{			
    				$up->exitErreurFichier("Erreur dans le redimensionnement du fichier.");
    			}
     
    			// On met le chmod si besoin (mini 604 pour une lecture depuis une url externe) au cas où le serveur mette un 600
    			$destination_fichier = $dossier_dest.$nom_fichier;
    			if(trim($destination_fichier) != '' && !@chmod($destination_fichier,0604))
    			{
    				$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier.");
    			}
    		}
     
    		// Informations sur le fichier
    		$pathinfo = pathinfo($nom_fichier_nettoye);
     
    		$extension_fichier = strtolower($pathinfo['extension']);
     
    		// rtrim supprime les caractères '-' et '_' qui peuvent avoir éte insérés en fin de nom par la fonction de nettoyage (pour remplacer un espace vide par exemple)
    		$non_fichier = rtrim($pathinfo['filename'],'-_');
     
    		// On utilise l'adresse du fichier temporaire (fichier de travail) pour le passer en paramètre à la fonction de redimensionnement
    		$basename = basename($fichier_complet);
    		$dirname = dirname($fichier_complet).'/';
     
    		// On défini l'adresse du dossier de destination par rapport au serveur (recommandé)
    		$dossier_dest_serveur = $up->getAdresseRelative().$dossier_destination;
     
    		// nouveau nom du fichier final vignette _mini max L 200 H 200
    		$nom_fichier_mini = $non_fichier.'_mini.'.$extension_fichier;
     
    		// Utilisation de la fonction créée plus haut (redimensionnement + définition du chmod)
    		Redim(200, 200, $dossier_dest_serveur, $nom_fichier_mini, $dirname, $basename, $extension_fichier);
     
     
    		// On peut faire d'autres redimensionnements sur le même principe excepté pour le dernier redimensionnement
    		// nouveau nom du fichier final vignette _moyen max L 500 H 400
    		$nom_fichier_moyen = $non_fichier.'_moyen.'.$extension_fichier;
    		Redim(500, 400, $dossier_dest_serveur, $nom_fichier_moyen, $dirname, $basename, $extension_fichier);
     
    		/* Pour le dernier redimensionnement on utilise le répertoire temporaire comme dossier de destination (si l'on ne souhaite pas sauvegarder le fichier original), ce qui écrase le fichier original et le remplace par le fichier redimensionné. Pour ce faire il suffit de ne pas renseigner les troisième et quatrième paramètres de la fonction "fctredimimage()". */
     
    		Redim(1000, 800, '', '', $dirname, $basename, $extension_fichier);
     
    		$nom_fichier_max = $non_fichier.'_max.'.$extension_fichier;
    		// On construit l'adresse du dernier fichier redimensionné pour le passer en paramètre à la fonction "Transfert()"
    		$destination_fichier = $dossier_dest_serveur.$nom_fichier_max;
     
    		// La fonction transfert le fichier temporaire vers son emplacement définitif (retourne true si ok)
    		$transfert = $up->Transfert($destination_fichier);
     
    		// On défini le chmod (si besoin)
    		if($transfert && !@chmod($destination_fichier,0604))
    		{
    			$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier");
    		}
     
    		//  Variante : dernier redimensionnement idem précédent + sauvegarde de l'image originale
    		/*
    		$nom_fichier_max = $non_fichier.'_max.'.$extension_fichier;
    		Redim(1000, 800, $dossier_dest_serveur, $nom_fichier_max, $dirname, $basename, $extension_fichier);
    		// Sauvegarde du fichier original
    		$destination_fichier = $dossier_dest_serveur.$non_fichier.'.'.$extension_fichier;
    		$transfert = $up->Transfert($destination_fichier);
    		if($transfert && !@chmod($destination_fichier,0604))
    		{
    			$up->exitErreurFichier("Echec de la configuration des droits d'accès du fichier");
    		}
    		*/
    	}
    }
     
    $up->exitReponseAjax();
    ?>
    A noter que dans tous les cas j'utilise la fonction "Transfert()" en fin de traitement car elle transfère le fichier temporaire et permet ainsi de nettoyer le dossier temporaire. Par ailleurs elle définit un status ok qui sera transmis à la fonction ajax pour la bonne continuation du script et enfin elle efface le cookie identifiant du fichier. Son emploi est donc impératif, à moins de coder les instructions équivalentes (ou vous pouvez la surcharger si besoin).

    Oui sinon pour le reste avec 120Mo tu devrais pouvoir redimensionner des fichiers assez gros. En local j'arrive à redimensionner des fichiers de 12 Mega pixels (j'ai pas plus gros). Remarque que tu pourrais faire un contrôle de résolution qui permettrait une meilleur gestion de d'erreur, bien que ce type de contrôle soit approximatif.
    Le code ci-dessous contrôle que l'image ne dépasse pas 12 millions de pixels. A ajuster en fonction des capacités mémoire de votre serveur. Si vous ne faites pas ce contrôle et que la mémoire est insuffisante php renverra une erreur 500 puis le script ajax renverra "Echec du téléchargement". Ce contrôle est donc facultatif mais il permet d'intercepter le problème plus vite, de fournir un message d'erreur plus explicite, de supprimer le fichier temporaire devenu inutile ainsi que le cookie d'identification du fichier. Cependant il n'est pas très précis car la mémoire nécessaire pour un redimensionnement ne dépend pas uniquement de la résolution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php // A mettre dans la condition "if($fichier_complet != false){...}" et avant le premier redimensionnement.
    list ($x, $y) = @getimagesize ($fichier_complet); 
    if(($x*$y) > 12000000)
    {
    	unlink($fichier_complet);
    	setcookie($up->getCookieName(),"",time()-3600,'/');
    	$up->exitErreurFichier("L'image ne doit pas dépasser 12 millions de pixels");
    }?>

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Finalement pour la deuxième partie de mon précédent message concernant le dépassement mémoire, je vais utiliser une fonction "register_shutdown_function()" et l'intégrer directement à la classe php d'upload. Cela sera transparent, évitera les approximations et permettra aussi de renvoyer des erreurs vers le script ajax pour un débuggage plus facile du script php. Faudra que je modifie un peu la classe javascript pour ajouter les options correspondantes. Ce sera fait d'ici quelques jours avec une nouvelle version 2.5

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 55
    Points
    55
    Par défaut
    merci pour ton aide précieuse , je met résolu .

  20. #20
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    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 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Voilà c'est fait, la version 2.5 est en ligne.

    La classe d'upload php dispose maintenant d'une fonction "cathErreurServeur()" qui permet d'intercepter distinctement les erreurs fatales pour personnaliser le message de retour d'information vers le formulaire **.

    Les messages seront concaténés au status "info.status.erreur" configuré côté javascript et qui vaut par défaut "Echec du téléchargement. "

    Pour une erreur mémoire interceptée par "cathErreurServeur()" et définie avec "Mémoire insuffisante pour le redimensionnement.", le message de retour affiché finalement dans l'élément html du formulaire (ayant la classe ".UpAbci_status") sera donc : "Echec du téléchargement. Mémoire insuffisante pour le redimensionnement."

    Les erreurs fatales non passées en paramètre à la fonction "cathErreurServeur()" seront interceptées mais elles ne renverront rien de sorte que seul le message configuré côté javascript sera affiché.

    Une autre fonction "setModeDebug()" permet de renvoyer les erreurs fatales non gérées par "cathErreurServeur()" pour facilité le debug durant la phase de développement (déconseillé en mode production).

    Attention la classe javascript a également été mise à jour pour reporter ces nouvelles fonctionnalités.

    Un exemple spécial "Redimension d'images" est maintenant proposé avec le fichier "UploadAjaxABCI_Redimensions.php" inclus dans le dossier de téléchargement.


    **A noter que la fonction "cathErreurServeur()" est principalement utile si vous faites des traitements (ici des redimensionnements) sur les fichiers en complément de l'upload puisque les limitations concernant l'upload sont surpassées (-> inutile de tenter de gérer des erreurs de type "upload_max_filesize" ou "post_max_size" puisqu'elles ne se produiront jamais).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/06/2008, 17h03
  2. Réponses: 6
    Dernier message: 05/06/2008, 16h06
  3. Réponses: 1
    Dernier message: 18/01/2008, 17h18
  4. redimensionner une photo dans office picture manager
    Par Tierisa dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/11/2007, 00h38
  5. redimensionner une photo
    Par Tierisa dans le forum Access
    Réponses: 2
    Dernier message: 12/01/2006, 15h57

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