<?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.
Merci, mon objectif était effectivement d'avoir beaucoup de possibilités avec un paramétrage le plus simple possibleCool. 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.
La taille maximale n'est donc pas définie par la classe mais par PHP.- 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.
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,2MoLa taille maximale n'est donc pas définie par la classe mais par PHP.- 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.
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 pour ton aideBonjour,
Montres-nous plutôt le code que tu as fait (uniquement le code php de l'upload et le formulaire).
<?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'?>. 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>
<?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'?>. 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.Code : Tout sélectionner
upload_max_filesize = 20M
memory_limit = 32M
post_max_size = 10M