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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
| <?php
/*
require 'UploadAjaxABCIServeur.php' et 'fctredimimage.php';
(Gardez bien à l'esprit que ce script sera appelé plusieurs fois pour le traitement du même post, excepté en cas d'upload simple si la taille du fichier est inférieure à la taille d'un fragment ou si aucun fichier n'est joint)
// Exemple de script php d'upload avec redimensionnement d'images
/* Les deux lignes ci-dessous permettent de provoquer des erreurs serveur (uniquement pour test)
- memory_limit 40M devrait provoquer des erreurs mémoire pour les redimensionnements de fichier supérieur à environ 4-5 mega pixels
- max_execution_time 2 devrait provoquer des erreurs max execution time pour les redimensionnements d'images de plus de 3-4 mega pixel mais cette valeur devrait être néanmoins suffisante pour charger ces "petits" fichiers.
*/
//ini_set("memory_limit","40M");
//ini_set('max_execution_time','2');
session_start();
// Vous devez vérifier l'existence de ces dossiers ou changer ces adresses
/*------------------------------------------------------*/
$dossier_destination1 = "../../".$_SESSION['arbo']."/";
$dossier_temporaire = "../Upload_Temp/";
/*------------------------------------------------------*/
$dir = $_SESSION['arbo']."/";
$count = 0;
$here = explode("/", $dir);
$num = (count($here) - 2);
$bli = explode("/", $dir);
$blo = (count($bli));
$poi = "1";
$dir_thumbs = "../../thumbs";
while($poi < $blo)
{
$dir_thumbs = $dir_thumbs."/".$bli[$poi];
if(!file_exists($dir_thumbs))
{
mkdir($dir_thumbs, 0777);
}
$poi++;
}
header('Content-type: text/html; charset=UTF-8');
require 'UploadAjaxABCIServeur.php';
$up = new UploadAjaxABCIServeur($dossier_destination1, $dossier_temporaire);
// - "setModeDebug()" affiche les erreurs fatales non catchées par la fonction "cathErrorServeur()". A n'utiliser qu'en phase de développement
// Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
/*
$up->setModeDebug ();
*/
/* - La fonction "cathErrorServeur($tableau)" demande un tableau en paramètre et permet de personnaliser le retour des erreurs fatales. L'index des valeurs est constitué par une suite de mots génériques renvoyés par l'erreur du serveur, et les valeurs sont constituées soit du message personnalisé à afficher, soit d'un tableau constitué du message personnalisé comme premier élément et de la valeur "true" (ou d'une valeur non nulle et différente de false) comme second élément pour indiquer de supprimer le fichier temporaire et l'éventuel cookie identifiant ce fichier. Voir le mode d'emploi de la classe pour plus d'explications.
- Les messages d'erreurs seront concaténés au message défini dans la classe javascript avec "info.status.erreur".
- Si aucune des deux fonctions "cathErrorServeur()" ou "setModeDebug()" n'est utilisée, les erreurs fatales ne seront pas transmises et seul le message javascript s'affichera.
*/
// Exemple
$tab_erreurs = array();
$tab_erreurs['Allowed memory size'] = array("Mémoire insuffisante, le fichier est trop gros pour être redimensionné.",true);
$tab_erreurs['Maximum execution time'] = "Le temps d'exécution maximum du script est dépassé, rechargez votre image et réessayez !";
$up->cathErrorServeur($tab_erreurs);
// Vous pouvez bien entendu compléter le tableau par autant de lignes que vous voulez.
/* Pour l'exemple ci-dessus je fais l'hypothèse que si une erreur mémoire se produit lors du redimensionnement, il est inutile de réessayer donc je peux effacer le fichier temporaire et l'éventuel cookie enregistrant les coordonnées de la sauvegarde. Cela permet si besoin d'optimiser le nettoyage du dossier temporaire.
Par contre le dépassement de "Maximum execution time" peut être dû à un serveur momentanément surchargé. On a donc peut-être intérêt de conserver le fichier éventuellement sauvegardé - disponible pour les fichiers excédant "$UpAbci_fragmentSize" défini dans "UploadAjaxABCI_Redimensions.php" - pour une nouvelle tentative. Cela permettra de le réutiliser directement lors du prochain chargement du fichier sans avoir besoin d'attendre pour son téléchargement.
*/
$uniqid_form = $up->getParam("uniqid_form");
// Il est conseillé de ne pas supprimer cette ligne car c'est le token qui assure que ce script est appelé depuis le formulaire. Permet également de renvoyer un message en cas de timeout du serveur, connexion perdue ou non valide.
if(!(isset($uniqid_form,$_SESSION['UploadAjaxABCI'][$uniqid_form]))) $up->exitStatusErreur("Connexion non valide ou perdue. Rafraîchissez la page et recharger votre fichier, si celui-ci dispose d'une sauvegarde automatique elle sera utilisée.");
// S'assure qu'un fichier ou un fragment de fichier est en téléchargement
if($up->getFragment())
{
$filesExtensions = array('jpg','jpeg','png');
$nom_fichier_nettoye = $up->getCleanFileName();// 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,$filesExtensions);
if($verif_extension == false)
{
$up->exitStatusErreur('Extension du fichier non valide.');
}
// Pour vérification des doublons sur le serveur, on récupère la destination du fichier avec "getFileDestination()" qui retourne "$adresse_relative.$dossier_destination.$fichier nettoyé"
$destination_fichier = $up->getFileDestination();
// Plutôt que de renommer le fichier en cas de doublon comme je le fais plus loin avec la fonction "RenameIdenticName()", on pourrait sortir du script avant d'employer la fonction "Upload()" et envoyer un message d'erreur en faisant :
if(is_file($destination_fichier))
{
$up->exitStatusErreur('Ce fichier existe déjà.');
}
// Upload dans le dossier temporaire
$up->Upload();
// Retourne l'adresse du fichier temporaire quand il est complet, sinon false
$fichier_complet = $up->getTempAdressFileComplete();
if($fichier_complet != false)
{
require 'fctredimimage.php';
/*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, $up)
{
$redim = fctredimimage($L, $H, $dossier_dest, $nom_fichier, $dirname, $basename, $extension_fichier);
if(!$redim)
{
$up->exitStatusErreur("Erreur dans le redimensionnement du fichier.");
}
// On met le chmod si besoin (mini 0604 pour une lecture depuis une url externe) au cas où le serveur mette un 0600
$destination_fichier = $dossier_dest.$nom_fichier;
if(trim($destination_fichier) != '' && !@chmod($destination_fichier,0604))
{
$up->exitStatusErreur("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']);
$non_fichier = $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->getRelativeAddress().$dossier_destination1;
// 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, $up);
// 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, $up);
/* Pour le dernier redimensionnemnet 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, $up);
// $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() transfère le fichier temporaire vers son emplacement définitif (retourne true si ok). L'utilisation de cette fonction est indispensable pour terminer l'upload (supprime le cookie et envoie les informations nécessaires au script ajax pour terminer la requête).
// $transfert = $up->Transfert($destination_fichier);
// On défini le chmod (si besoin)
// if($transfert && !@chmod($destination_fichier,0604))
// {
// $up->exitStatusErreur("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 = 'thumb_'.$non_fichier.'.'.$extension_fichier;
Redim(300, 300, $dir_thumbs, $nom_fichier_max, $dirname, $basename, $extension_fichier, $up);
// 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->exitStatusErreur("Echec de la configuration des droits d'accès du fichier");
}
////////////////////////
//AJOUT FICHIER AU ZIP//
////////////////////////
$zip = new ZipArchive();
$zip->open("../../".$dir.$here[$num].'.zip' , ZipArchive::CREATE);
$zip->addFile("../../".$dir.$non_fichier.'.'.$extension_fichier, $here[$num].'/'.$non_fichier.'.'.$extension_fichier);
$zip->close();
}
}
// Voir le fichier "UploadAjaxABCI_Php_Load.php" pour des possibilités supplémentaires...
$up->exitReponseAjax();
?> |
Partager