Upload de fichiers vérification renommage redimensionnements

ViPHP
AB
ViPHP | 5818 Messages

08 juil. 2010, 13:26

Version 1.3 :

- ajout de la fonction "Set_Nomme_fichier" qui permet d'imposer un nom pour le fichier téléchargé
- ajout de la fonction "Set_Tab_messages" qui permet d'envoyer un tableau de traduction pour les messages d'information

- modification de la fonction interne "Nettoie_nom_fichier" pour un maximum de compatibilité avec différents serveurs et permet par la même occasion plus de remplacement de caractères accentués pour les langues étrangères.
- modification de la fonction interne "Rename_fich" qui donnait parfois des résultats inattendus dans certains cas particuliers avec l'option incrémentielle.

Version 1.4 en ligne : correction d'un bug en cas d'utilisation conjointe des fonctions "Set_Nomme_fichier" et "Set_Renomme_fichier" sur un tableau de fichiers.

ViPHP
AB
ViPHP | 5818 Messages

22 oct. 2010, 03:08

Version 1.5 en ligne.

Meilleure gestion/personnalisation des messages d'informations de résultats. Le code et le mode d'emploi ont été mis à jour. Pour plus d'info sur ces modifs voir la fin du paragraphe A/ et le paragraphe H/ du mode d'emploi dans le premier message.

ViPHP
AB
ViPHP | 5818 Messages

08 nov. 2010, 22:35

Pour compléter mon second message concernant les exemples d'utilisation, un autre exemple qui permet de choisir un dossier de destination depuis le formulaire, tout en permettant la gestion complète des erreurs, notamment le dépassement du post maximum autorisé par le serveur (post_max_size).
<?php 
//Si on travaille en utf-8
header('Content-type: text/html; charset=UTF-8');

require('class_upload.php');


//Liste des dossiers autorisés (sans caractères spéciaux ni accents, ni espaces)
$dossiers_autorise = array('nature','sport','portraits','autres');

$dossier = $dossiers_autorise[0];

$erreur_dossier = null;

// Si le formulaire est envoyé on regarde si $_POST['categorie'] fait partie du tableau de dossiers autorisés
if(isset($_POST['form_envoi'],$_POST['categorie']))
{
        if (in_array($_POST['categorie'],$dossiers_autorise))
       
        $dossier = $_POST['categorie'];
       
        else
       
        $erreur_dossier = 'Vous devez choisir la catégorie';
}


if (empty($erreur_dossier))

        {
                //Utilisation de la classe de téléchargement (cf la doc pour plus de précisions)
                $up = new Telechargement($dossier,'form_envoi','fich_upload','get_form');

                //Extensions autorisées
                $extensions = array("jpeg", "jpg");
                $up->Set_Extensions_accepte ($extensions);
                       
                 // Redimensionnement des images en maximum 1000px de largeur et 800px de hauteur (tout en conservant les proportions)
                $up->Set_Redim ('1000','800');
                       
                // En cas de doublon sur le serveur, les fichiers seront renommés  avec une méthode incrémentale (pour changer la méthode d'incrémentation cf la doc).
                $up->Set_Renomme_fichier('incr');
                       
                // Envoi des données et traitement de l'upload avec rechargement de la page pour éviter un multi upload en cas de rafraichissement de la page.
                $up->Upload('reload');
                       
                // Récupération des messages d'information
                $resultat = $up->Get_Tab_message();
       }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans nom</title>
</head>

<body>
<div>

<form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_form=1'?>" method = "post">  
<p>  
Catégorie : <select name="categorie" >
<option value="">Choisissez...</option>
<?php foreach ($dossiers_autorise as $value) echo '<option value="'.$value.'">'.$value.'</option>';?>

</select>

<br /> <br />
     
<input name = "fich_upload[]" type = "file" size = "70" />
                       
<input type = "submit" name = "form_envoi" value = "Envoyez"  />  
</p>  
</form>
    <div style="margin-top:20px;">
               
        <?php if (!empty($resultat))
       
        foreach ($resultat as $num)
            {
                foreach ($num as $value)
                 echo htmlspecialchars($value).'<br />';
            }

        if(isset($erreur_dossier)) echo $erreur_dossier;

        ?>
    </div>
</div>
</body>
</html>
Cette construction sert à éviter de mettre l'initialisation de la classe à l'intérieur de la condition if (isset($_POS['index'])) {//initialisation de la classe... } car la classe ne pourrait pas envoyer de message d'erreur en cas du dépassement du post_max_size puisque dans ce cas aucun post ne serait renvoyé et donc la classe ne serait pas instanciée.
Dernière édition par AB le 06 déc. 2011, 19:09, édité 5 fois.

Eléphant du PHP | 185 Messages

10 nov. 2010, 01:07

Cool. J'aime bien le set_Redim() avec 3e paramètre qu'on peut appeler plusieurs fois. Très pratique.

Par contre j'aime moins le nom des méthodes, mais c'est un autre problème. ^^

Merci pour le partage. ;)

ViPHP
AB
ViPHP | 5818 Messages

11 nov. 2010, 17:08

Cool. J'aime bien le set_Redim() avec 3e paramètre qu'on peut appeler plusieurs fois. Très pratique.

Par contre j'aime moins le nom des méthodes, mais c'est un autre problème. ^^

Merci pour le partage. ;)
Merci, mon objectif était effectivement d'avoir beaucoup de possibilités avec un paramétrage le plus simple possible :)

Pour le nommage des méthodes, je suis aussi d'accord avec toi, ce n'est pas le plus réussi. Je comptais donner des noms plus standards à la fin du développement puis j'ai oublié avant le premier post, et ensuite pour que les maj soient compatibles avec le code initial c'était impossible :|
Enfin bon, ce n'est pas un code qu'on met en place tous les jours... et puis pour ceux qui veulent absolument appeler les méthodes par un autre nom, un petit "rechercher/remplacer" fera l'affaire :)

ViPHP
AB
ViPHP | 5818 Messages

22 nov. 2010, 06:23

Version 1.6 :
Correction d'un bug de la fonction "Set_Renomme_fichier" en mode incrémental sur certaines configurations (pour les cas où la fonction "glob" renvoie "false" plutôt qu'un tableau vide quand elle ne matche pas).

Version 1.7 en ligne : La fonction "Set_Renomme_fichier" est désormais compatible php5 >= 5.1 (contre php5 >= 5.2 auparavant) à la demande de certains utilisateurs de free.

ViPHP
AB
ViPHP | 5818 Messages

23 nov. 2010, 20:39

Version 1.8 :
Refonte de la fonction "Set_Renomme_fichier" (toujours compatible php5 >= 5.1).

Version 1.9 en ligne : Fonction "Set_Renomme_fichier" optimisée pour php5 > 5.1 tout en restant compatible avec php5 >= 5.1 (compatible free)

Petit nouveau ! | 8 Messages

28 déc. 2010, 15:43

Salut, super classe.
Par contre j'ai un petit pb peux tu me dire comment supprimer la taille pour un upload d'image.
quand j'upload une image type jpg de 111ko de 650x450 tout est ok mais quand je veux faire un upload d'une image du même type mais avec une taille de 3264x2448 de 1,2Mo l'upload ne fonctionne pas.
Comment puis je faire pour permettre un upload d'image lourde.

merci beaucoup

Avatar de l’utilisateur
ViPHP
xTG
ViPHP | 7330 Messages

28 déc. 2010, 16:04

- Si le quatrième paramètre n'est pas renseigné ou erroné il n'y aura pas de message pour indiquer un éventuel dépassement de la taille maximum du $_POST autorisée par le serveur. Il est donc recommandé de le renseigner pour une gestion complète des erreurs.
La taille maximale n'est donc pas définie par la classe mais par PHP.
Regardes donc ton php.ini pour modifier la taille max, en respectant les paramètres à donner à la classe tu as sans doute un message indiquant que la taille maximum autorisée par PHP est dépassée.

Petit nouveau ! | 8 Messages

28 déc. 2010, 16:38

- Si le quatrième paramètre n'est pas renseigné ou erroné il n'y aura pas de message pour indiquer un éventuel dépassement de la taille maximum du $_POST autorisée par le serveur. Il est donc recommandé de le renseigner pour une gestion complète des erreurs.
La taille maximale n'est donc pas définie par la classe mais par PHP.
Regardes donc ton php.ini pour modifier la taille max, en respectant les paramètres à donner à la classe tu as sans doute un message indiquant que la taille maximum autorisée par PHP est dépassée.
Merci beaucoup xTG pour ta réponse je viens de faire une recherche car je suis sur 1and1 et la taille max par défaut est de 8M. J'ai bien le message d'erreur de la classe qui me dit "Le poids total maximum du formulaire autorisée par le serveur est dépassé ". Mais je vois pas pourquoi ? car ma photo est de 1,2Mo :shock:

Penses tu que je dois mettre le php.ini à 20Mo ?

Peut être que le pb viens de la fonction resize???

Merci pour ton aide

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2010, 20:05

Bonjour,

Montres-nous plutôt le code que tu as fait (uniquement le code php de l'upload et le formulaire).

Petit nouveau ! | 8 Messages

28 déc. 2010, 20:19

Bonjour,

Montres-nous plutôt le code que tu as fait (uniquement le code php de l'upload et le formulaire).
Merci pour ton aide :priere:

en fait j'ai repris ton exemple de code mais je pense que j'ai raté un truc.
<?php
require('class_upload.php');
require('class_connexion.php');
require('class_cars.php');
session_start();
$list = new class_cars('','','','');


// FORMULAIRE 2

// Téléchargements de fichiers de nature différentes (photos et pdf) dans des répertoires différents avec si besoin renommage des fichiers, puis redimentionnement des images et traitement php.

$form2_photo = new class_upload('image','formulaire_2','photo','get_formulaire_2');


// Tableau des extensions autorisées (en minuscules). Dans cet exemple, seules les extensions "jpg" et "jpeg" sont autorisées
$tab_extensions_autorisees = array('jpg','jpeg','png','gif');
// Envoi du tableau des extensions autorisées
$form2_photo->Set_Extensions_accepte($tab_extensions_autorisees);

// Images originales téléchargées dans le répertoire "PHOTO" + mêmes images redimentionnées en max 950 x 800 téléchargées dans le répertoire "PHOTO_GF" + mêmes images redimentionnées en max 200 x 200 téléchargées dans le répertoire "PHOTO_PF"

$form2_photo->Set_Redim ('600','325','image');
$form2_photo->Set_Redim ('156','94','image/thb_image');

// Contrôle de l'existence d'un fichier de nom identique dans le répertoire de destination et si oui renommage  du fichier téléchargé avec un suffixe aléatoire unique.
$form2_photo->Set_Renomme_fichier ();


// Téléchargement sans reload de la page
$form2_photo->Upload ();



// Le reload de la page sera effectué à la fin du traitement php en utilisant la fonction "Get_Reload_page()"
if (isset($_POST['formulaire_2']))
        {

                //Récupération des résultats
                $transfert_form2_photo = $form2_photo->Get_Tab_upload ();
                //$transfert_form2_pdf = $form2_pdf->Get_Tab_upload ();
                
                // Voir la structure du tableau de résultat, et un exemple de récupération en fin de script
                
                
                //enregistrement des données en bdd etc.
                $resultat = $transfert_form2_photo['resultat'];//tableau à trois dimensions
          foreach ($resultat as $num => $rep)
                                        {
                                                foreach ($rep as $key => $value)
                                                        {                                                      
                                                                if(!empty($value['nom']))                                  
                                                              	$list->insertPhoto($value['nom'],$_SESSION['id']); 
                                                        }    
                                        }
                
               
                // Rechargement de la page pour éviter un multiple post en cas de rafraichissement de la page par le visiteur
                $form2_photo->Get_Reload_page();
                
        }


// A noter que l'appel à la fonction Get_Tab_message() doit se faire APRES la condition "if (isset($_POST..."

$messages_form2_photo = $form2_photo->Get_Tab_message ();


// Les deux lignes ci-dessous doivent logiquement se trouver à l'intérieur la condition "if (isset($_POST...)" pour servir par exemple à alimenter une bdd. Elles sont ici uniquement pour démonstration et afficher la structure du taleau de résultat en bas de page.
//$transfert_form2_photo = $form2_photo->Get_Tab_upload ();


// Vous pouvez éventuellement mettre la déclaration de la classe (et l'appel de ses fonctions) à l'intérieur de la condition "if (isset($_POST...)", cependant vous devrez alors enregistrer le tableau des messages dans une variable de session pour pouvoir y accéder après le reload de la page, et d'autre part le message indiquant un dépassement du $_POST maximum total autorisé par le serveur ne sera plus fonctionnel.




/* Debug

- Si aucun message ne s'affiche après l'envoi d'un fichier, un ou plusieurs paramètres passés dans la déclaration de la classe sont erronés ou les variables de session ne fonctionnent pas sur votre serveur.

- Si le message "Le total maximum du post autorisé par le serveur est dépassé" s'affiche même pour un fichier de petite taille, le nom de l'input d'identification du formulaire passé en deuxième paramètre lors de l'initialisation de la classe est erroné.

*/


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Back Connect</title>

<link rel="stylesheet" type="text/css" href="style_back.css" />
<script src="jquery.js" type="text/javascript"></script>
<script src="jquery.easing.1.3.js" type="text/javascript"></script>
<script src="check.js" type="text/javascript"></script>

<script type="text/javascript">

$(document).ready(function(){
	
	var effet = 'easeOutElastic';
	var default_left = 15;
	var default_width = $('#menu li.selected').width();

	$('#box').css({left: default_left});
	$('#box .rectangle').css({width: default_width});

	$('#menu li').hover(function(){
		
		left = Math.round($(this).offset().left - 8);
		width = $(this).width();

		$('#box').stop().animate({left: left},{duration:1000, easing:effet});
		$('#box .rectangle').stop().animate({width: width},{duration:1000, easing:effet});
		
	});
	
	$('#menu li').mouseleave(function(){
		
		default_left =15;
		default_width = $('#menu li.selected').width();

		$('#box').stop().animate({left: default_left},{duration:1000, easing:effet});
		$('#box .rectangle').stop().animate({width: default_width},{duration:1000, easing:effet});
		
	});
});

</script>
<script type="text/javascript">
<!--
function Verif_attente(id_attente)
    {              
        var id_attente = document.getElementById(id_attente);
       
        if (typeof id_attente != 'undefined')
        {
            // Nettoyage de l'élément cible
            var nb_noeuds = id_attente.childNodes.length;
                       
            for (var i = 0; i < nb_noeuds; i++)        
                                {                                  
                                        id_attente.removeChild(id_attente.firstChild);
                                }
            
            id_attente.style.fontWeight="bold";
            id_attente.style.fontSize="1.5em";
            
            var texte = 'Patientez...';
            // Création du noeud texte
            var noeud_texte = document.createTextNode(texte);
            // Insertion du noeud texte
            id_attente.appendChild(noeud_texte);
        }
    }
-->
</script>
<style type="text/css">
body {
font-family: Arial, Helvetica, sans-serif;
font-size:12px;
}

input, form {
margin:0;
padding:0;
}
</style>
</head>

<body>
	<div id="menu">
		<ul>
			<li class="selected"><a href="home.php">Home</a></li>
			<li ><a href="home.php?list=ok">List Car</a></li>
			<li ><a href="home.php?add=ok">Add Car</a></li>
		</ul>
	
		<div id="box" >
			<div id="rectangle"  class="rectangle"></div>
		</div>
	</div>

<div style="width:650px;margin:auto;margin-top:80px;">
                       
        <form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_formulaire_2=1'?>" method = "post" onsubmit = "Verif_attente('message_tele2')" id = "formulaire_2">
      
               
                <!-- input d'identification du formulaire qui doit être passé en paramètre dans l'initialisation de la classe-->
                <input type = "hidden" name = "formulaire_2" value = "1" />
               
            <!-- Par défaut MAX_FILE_SIZE = Return_Octets(ini_get('upload_max_filesize') donc ne sert à rien en l'état. Pour limiter l'upload à une taille inférieure vous pouvez rentrez une valeur suivie de son unité, exemple $form2_pdf->Return_Octets('500K') pour 500 kilos octets, $form2_pdf->Return_Octets('1M') pour 1 méga octets etc. La fonction "Return_Octets" est employée pour la conversion en octets car le champ MAX_FILE_SIZE demande une valeur en octets. -->

                <input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo isset($form2_photo) ? $form2_photo->Return_Octets(ini_get('20M')) : '' ?>" />  
                       
           
               
            <span>Fichiers photos (png, jpg, jpeg, gif)</span><br/>
            	<table style="margin:5px;" border="0" cellpadding="0" cellspacing="0" height="100%"><tr valign="top">
				<td height="100%" width="5" bgcolor="#666666"></td><td valign="top"><div style="height:100%; margin-left:7px;">
				<table width="400" cellpadding="0" cellspacing="0" border="0"><tr>
				<td><span id="itemNumber">01</span></td>
				</tr></table><input name="photo[]" type="file" size="28" />
				</td></tr></table>
				<table style="margin:5px;" border="0" cellpadding="0" cellspacing="0" height="100%"><tr valign="top">
				<td height="100%" width="5" bgcolor="#666666"></td><td valign="top"><div style="height:100%; margin-left:7px;">
				<table width="400" cellpadding="0" cellspacing="0" border="0"><tr>
				<td><span id="itemNumber">02</span></td>
				</tr></table><input name="photo[]" type="file" size="28" />
				</td></tr></table>
				<table style="margin:5px;" border="0" cellpadding="0" cellspacing="0" height="100%"><tr valign="top">
				<td height="100%" width="5" bgcolor="#666666"></td><td valign="top"><div style="height:100%; margin-left:7px;">
				<table width="400" cellpadding="0" cellspacing="0" border="0"><tr>
				<td><span id="itemNumber">03</span></td>
				</tr></table><input name="photo[]" type="file" size="28" />
				</td></tr></table>
				<table style="margin:5px;" border="0" cellpadding="0" cellspacing="0" height="100%"><tr valign="top">
				<td height="100%" width="5" bgcolor="#666666"></td><td valign="top"><div style="height:100%; margin-left:7px;">
				<table width="400" cellpadding="0" cellspacing="0" border="0"><tr>
				<td><span id="itemNumber">04</span></td>
				</tr></table><input name="photo[]" type="file" size="28" />
				</td></tr></table>
                <table style="margin:5px;" border="0" cellpadding="0" cellspacing="0" height="100%"><tr valign="top">
				<td height="100%" width="5" bgcolor="#666666"></td><td valign="top"><div style="height:100%; margin-left:7px;">
				<table width="400" cellpadding="0" cellspacing="0" border="0"><tr>
				<td><span id="itemNumber">05</span></td>
				</tr></table><input name="photo[]" type="file" size="28" />
				</td></tr></table>
       
               
                <input type = "submit" value = "Envoyez"  style = "margin-left:5px" />
       
        </form>
                   
    <p>    
                <br />Taille maximum de fichier autorisée par le serveur = <?php echo ini_get('upload_max_filesize').'o'?>.&nbsp;&nbsp;Total maximum pour l'ensemble <?php echo ini_get('post_max_size').'o'?>.
        </p>
               
        <div id = "message_tele2" style="margin-top:20px;">
        <?php
        if (!empty($messages_form2_photo))
                        {
                                echo '<p>';
                                        foreach ($messages_form2_photo as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
                                                   
   
        ?>
        </div>
</div>  

   
<div style="margin-top:100px">
        <p>
                <?php
                // Lecture du tableau des résultats (se trouve ici uniquement pour la démonstration et visualiser la structue des tableaux de résultat)
                if (!empty ($transfert_form2_photo))
                        {
                                $identifant = $transfert_form2_photo['identifiant'];
                                $champ = $transfert_form2_photo['champ'];      
                                $resultat = $transfert_form2_photo['resultat'];//tableau à trois dimensions  
                                                                   
                                echo $identifant.' :<br /><br />';
                           
                                foreach ($resultat as $num => $rep)
                                        {
                                                foreach ($rep as $key => $value)
                                                        {                                                      
                                                                if(!empty($value['nom']))                                  
                                                                echo 'champ '.$champ.' n° '.$num.' = '.$value['nom'].' '. $value['dim'].', téléchargé dans "'.$key.'"<br />';
                                                        }    
                                        }
                        } ?>
                <br />
        </p>

</div>

</body>
</html>


Il me dit d'attendre quand il s'agit de fichier de 1Mo et plus pour ensuite afficher une page blanche.
Et si je fais un refresh avant il m'affiche le message d'erreur de la classe.

ViPHP
AB
ViPHP | 5818 Messages

28 déc. 2010, 21:59

Bon on va essayer de se concentrer sur l'essentiel. Essaies ça :
<?php
require('class_upload.php');
session_start();

$form_photo = new class_upload('image','formulaire','photo','get_formulaire');


// Tableau des extensions autorisées (en minuscules). Dans cet exemple, seules les extensions "jpg" et "jpeg" sont autorisées
$tab_extensions_autorisees = array('jpg','jpeg');

// Envoi du tableau des extensions autorisées
$form_photo->Set_Extensions_accepte($tab_extensions_autorisees);

// Images redimentionnées en max 600 x 325 téléchargées dans le répertoire "image" + mêmes images redimentionnées en max 156 x 94 téléchargées dans le répertoire "image/thb_image"

$form_photo->Set_Redim ('600','325');
$form_photo->Set_Redim ('156','94','image/thb_image');

// Contrôle de l'existence d'un fichier de nom identique dans le répertoire de destination et si oui renommage  du fichier téléchargé avec un suffixe aléatoire unique.
$form_photo->Set_Renomme_fichier ();


// Téléchargement sans reload de la page
$form_photo->Upload ();



// Le reload de la page sera effectué à la fin du traitement php en utilisant la fonction "Get_Reload_page()"
if (isset($_POST['formulaire']))
        {
                //Récupération des résultats
                $transfert_photo = $form_photo->Get_Tab_upload ();
               
                //enregistrement des données en bdd etc.
                $resultat = $transfert_photo['resultat'];//tableau à trois dimensions
          		foreach ($resultat as $num => $rep)
                                        {
                                                foreach ($rep as $key => $value)
                                                        {                                                     
                                                                if(!empty($value['nom']))                                 
                                                                 {
									//							 
								 }
                                                        }   
                                        }          
               
                // Rechargement de la page pour éviter un multiple post en cas de rafraichissement de la page par le visiteur
                $form_photo->Get_Reload_page(); 
        }


// A noter que l'appel à la fonction Get_Tab_message() doit se faire APRES la condition "if (isset($_POST..."

$messages_form_photo = $form_photo->Get_Tab_message ();


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Back Connect</title>

<script type="text/javascript">
<!--
function Verif_attente(id_attente)
    {             
        var id_attente = document.getElementById(id_attente);
       
        if (typeof id_attente != 'undefined')
        {
            // Nettoyage de l'élément cible
            var nb_noeuds = id_attente.childNodes.length;
                       
            for (var i = 0; i < nb_noeuds; i++)       
                                {                                 
                                        id_attente.removeChild(id_attente.firstChild);
                                }
           
            id_attente.style.fontWeight="bold";
            id_attente.style.fontSize="1.5em";
           
            var texte = 'Patientez...';
            // Création du noeud texte
            var noeud_texte = document.createTextNode(texte);
            // Insertion du noeud texte
            id_attente.appendChild(noeud_texte);
        }
    }
-->
</script>
<style type="text/css">
body {
font-family: Arial, Helvetica, sans-serif;
font-size:12px;
}

input, form {
margin:0;
padding:0;
}
</style>
</head>

<body>
<div style="width:650px;margin:auto;margin-top:80px;">
                       
        <form enctype = "multipart/form-data" action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']).'?get_formulaire=1'?>" method = "post" onsubmit = "Verif_attente('message_tele')" id = "formulaire">
     
            <!-- input d'identification du formulaire qui doit être passé en paramètre dans l'initialisation de la classe-->
            <input type = "hidden" name = "formulaire" value = "1" />
               
            <input type = "hidden" name = "MAX_FILE_SIZE"  value = "<?php echo isset($form_photo) ? $form_photo->Return_Octets('20M') : '' ?>" /> 
               
            <span>Fichiers photos (png, jpg, jpeg, gif)</span><br/>
         	<input name="photo[]" type="file" size="28" />
           
            <input type = "submit" value = "Envoyez"  style = "margin-left:5px" />
       
        </form>
                   
    <p>   
               
Taille maximum de fichier autorisée par le serveur = <?php echo ini_get('upload_max_filesize').'o'?>.&nbsp;&nbsp;Total maximum pour l'ensemble <?php echo ini_get('post_max_size').'o'?>.
        </p>
               
        <div id = "message_tele" style="margin-top:20px;">
        <?php
        if (!empty($messages_form_photo))
                        {
                                echo '<p>';
                                        foreach ($messages_form_photo as $num)
                                                {
                                                        foreach ($num as $value)
                                                        echo htmlspecialchars($value).'<br />';
                                                }
                                echo '</p>';
                        }
                                                   
   
        ?>
        </div>
</div> 
</body>
</html>
La taille maximum de fichier autorisée par le serveur est indiquée en bas du formulaire... mais il y a des réglages internes du serveur qui peuvent prendre le pas sur ces valeurs.

Si tes photos ont une résolution trop importante, indépendamment de leur poids, le redimensionnement ne sera pas possible (dû à une mémoire insuffisante allouée par le serveur pour tes scripts) mais la classe devrait t'envoyer un message approprié.

A noter que la classe renvoie le message "Le poids total maximum du formulaire autorisée par le serveur est dépassé" quand l'ensemble du post n'est pas chargé sur le serveur. C'est la cause la plus probable, mais le post peut ne pas avoir été chargé pour d'autres raisons qu'un dépassement du poids total ex : délais de téléchargement trop long etc...
Eventuellement tu peux modifier ce message d'erreur en "Le poids total maximum du formulaire autorisée par le serveur est dépassé ou erreur du serveur" en modifiant le premier élément de $tab_mes dans la classe ou en envoyant un tableau de message personnalisé comme indiqué dans le mode d'emploi.

Petit nouveau ! | 8 Messages

07 janv. 2011, 11:38

Salut AB, dsl pour la réponse tardive.

Merci encore pour ton aide. Mais le script ne fonctionne tjrs pas avec des images à grande dimensions (ex: 3264x2448 / j'ai ou une page blanche ou bien le patientez pendant dix muntes).
J'ai donc modifié le php.ini (pour rappel je suis chez 1and1 et la valeur max de memory_limit est 32M).

Code : Tout sélectionner

upload_max_filesize = 20M memory_limit = 32M post_max_size = 10M


Je pense qu'il faut augmenter la capacité de redimensionnement de la fonction Set_Redim afin de pouvoir faire un redim de toutes les tailles.
SI c'est déjà le cas je ne comprends pas d'où vient le pb. :?

Comment faire sauter la limite pour les dimensions ? Comment faire pour que peu importe la dimension le fichier soit uploader ?

ViPHP
AB
ViPHP | 5818 Messages

07 janv. 2011, 16:37

Encore une fois, la capacité de la classe pour charger de gros fichiers ou redimensionner des images de grandes dimensions est uniquement dépendante de la configuration du serveur et n'a rien à voir avec d'éventuelles limitations - il n'y en a aucune - inclues dans le code de la classe.

Pour info

1/ Concernant le poids du fichier

Un fichier de 10 Mo devrait être téléchargé en moins de trois minutes. Si tu attends 10 minutes, soit tu as un fichier de plusieurs dizaines de Mo, soit ta connexion internet rame grave, soit tu as un pb sur le serveur... Quand la durée dépasse un certain temps défini entre autre par "max_input_time" le serveur peut renvoyer (ou non, dépend également de réglages internes du serveur) une page blanche ou un message d'erreur interne du serveur. C'est donc le serveur qui gère ce genre de problème et non la classe (qui ne peut rien faire si le serveur ne lui renvoie rien).

Si la connexion serveur n'est pas perdue et donc que l'on a franchi cette première étape, la classe peut renvoyer un message d'erreur concernant le dépassement des paramètres "upload_max_filesize" et "post_max_size". Mais pas toujours car certains serveurs sont parfois configurés pour renvoyer un message d'erreur interne (notamment pour un dépassement du "post_max_size") plutôt que de se rediriger vers le script en cours (et encore une fois, la classe ne peut rien faire si le serveur ne lui renvoie rien).


2/ Concernant le redimensionnement

La capacité de redimensionnement est indépendante du poids du fichier et dépend uniquement de la résolution de l'image. C'est à dire qu'un fichier de 500ko pourra ne pas être redimensionné s'il a une très grande résolution. Cette limitation vient du paramètre serveur "memory_limit" car le redimensionnement utilise d'autant plus de mémoire que la résolution du fichier est importante.
La classe génère normalement un message d'erreur dans ce cas pour les fichiers de type "jpg" ou "jpeg" car elle calcule la mémoire nécessaire pour le redimensionnement, la compare avec la mémoire disponible sur le serveur pour le script en cours et abandonne le redimensionnement en renvoyant un message en cas de mémoire insuffisante. Les valeurs serveur sont récupérées avec les fonctions memory_get_usage() et ini_get('memory_limit'), ce ne sont donc pas des valeurs fixes définies dans la classe mais les valeurs réelles du serveur.

Cela dit pour faire ce contrôle et renvoyer éventuellement ce message d'erreur encore faut-il que le fichier ait passé l'étape du téléchargement.



Voilà pour les précisions, donc ton problème est un pb de configuration serveur et ne vient pas de la classe elle-même.

Essaies de mettre "memory_limit" sur 128 Mo pour le redimensionnement des images de grandes dimensions et pour le téléchargement regardes du côté de "upload_max_filesize", "post_max_size", "max_input_time" etc.

Si tu ne peux pas modifier ces valeurs (souvent fixes sur un mutualisé), soit tu prends un serveur dédié que tu pourras régler comme tu veux soit il faut te diriger vers d'autres solutions qui utilisent par exemple Java etc. (regardes sur google).

Si tu as des questions sur la gestion serveur, ouvres un nouveau sujet dans le forum approprié :wink:
Dernière édition par AB le 08 janv. 2011, 12:53, édité 2 fois.