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
| <?php
$dossier_destination1 = '../Upload1/';
session_start();
header('Content-type: text/html; charset=UTF-8');// Inutile depuis php 5.6
// Charge les classes php avec spl_autoload_register
spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
$up = new UploadAjaxABCIServeur($dossier_destination1);
// getParam("uniqid_form") renvoie l'identifiant unique (token) du formulaire.
$uniqid_form = $up->getParam("uniqid_form");
// Il est conseillé de ne pas supprimer cette ligne car c'est le jeton de sécurité (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]['token']))) $up->exitStatusErreur(SetMessages::get('UpAbVerifToken'));
// getFragment() retourne true si un fichier (ou un fragment de fichier) est joint au formulaire, sinon false
$fichier_en_cours = $up->getFragment();
if($fichier_en_cours)
{
// getParam("name") retourne le nom originel du fichier
$nom_fichier_originel = $up->getParam("name");
// getCleanFileName() retourne le nom du fichier nettoyé après suppression/remplacement des caractères spéciaux
$nom_fichier_nettoye = $up->getCleanFileName();
// getParam("id_form") retourne l'identifiant html du formulaire (#id ou .classe)
$id_form = $up->getParam("id_form");
// getParam("input_name") retourne le nom du champ de type file
$nom_input = $up->getParam("input_name");
// On vérifiera les extensions avec la méthode "verifExtensions" car ce script traite différents formulaires. Si le paramètre passé à la méthode est un tableau vide, la vérification ne sera pas faite.
$filesExtensions = ['avi','divx','mp4','mkv','mpg','jpg','jpeg','png','gif','xls','xlsx','doc','docx','odt','txt','zip','7zip','rar'];
// Vérifie si l'extension du fichier correspond à un élément du tableau. La méthode "verifExtensions" prend en parramètre le nom du fichier et le tableau d'extensions autorisées et retourne true ou false. Si false on sort du script en envoyant un message dans le status html du fichier.
$verifExtensions = $up->verifExtensions($nom_fichier_nettoye, $filesExtensions);
if($verifExtensions == false)
{
// Utilisez la fonction "exitStatusErreur ($value)" pour sortir du script en ajoutant un message qui sera concaténé au statut "info.status.erreur" de la classe javascript et envoyé dans le bloc html ayant la classe "UpAbci_status"
$up->exitStatusErreur(SetMessages::get('UpAbExtensionFichier'));
}
// Renommage des fichiers
// Plutôt que de renommer le fichier en cas de doublon sur le serveur comme je le fais plus bas avec la méthode "renameIdenticName()", on pourrait sortir du script avant d'employer la méthode "Upload()" et envoyer un message d'erreur en faisant :
/*
if(is_file($destination_fichier))
{
// J'ajoute le tableau de message nécessaire à l'affichage du message ayant l'index 'ficherExisteDeja' - voir le mode d'emploi "Configuration serveur -> Gestion des messages" - avec new SetMessages('verifFileExist'), car il n'est pas chargé par défaut par les classes php)
new SetMessages('verifFileExist');
$up->exitStatusErreur(SetMessages::get('ficherExisteDeja'));// "Ce fichier existe déjà"
}
*/
// Si aucune vérification ni renommage n'est fait, les fichiers du serveur ayant le même nom que les fichiers téléchargés seront écrasés.
// INDISPENSABLE : on doit utiliser la méthode "Upload()" pour réaliser le processus d'upload.
$up->Upload();
/* Le processus d'upload est dissocié de celui du transfert, pour permettre de traiter le fichier complet (par exemple pour faire des redimensionnements d'images en php) avant de le déplacer vers son emplacement définitif.
*/
// La méthode "getTempAdressFileComplete()" qui doit être utilisée après la méthode "Upload()", retourne l'adresse du fichier temporaire lorsqu'il est complet, sinon false. */
if($up->getTempAdressFileComplete())
{
/* Renommage des doublons avec la méthode "renameIdenticName($destination_fichier)".
La fonction de renommage peut-être assez gourmande en ressources si on utilise l'option d'incrémentation (non utilisée ici). Inutile de l'employer pour chaque fragment traité par ce script, d'où la condition "if($up->getTempAdressFileComplete())" qui permet de ne l'appliquer que lorsque le fichier est complet.
- Plus d'infos sur cette méthode dans le mode d'emploi section "Configuration Serveur", paragraphe "Méthodes de la classe UploadAjaxABCIServeur".*/
$destination_fichier = $up->renameIdenticName($destination_fichier);
// Si vous préférez écraser les fichiers existants il suffit de supprimer la ligne ci-dessus
}
/* INDISPENSABLE : on utilise la méthode "Transfert()" après la méthode "Upload()", avec comme argument optionnel la destination du fichier. Retourne true en cas de succès, sinon false.
La méthode "Transfert()" déplace le fichier temporaire vers son emplacement définitif et supprime le cookie de sauvegarde identifiant ce fichier. Elle renseigne également des paramètres qui seront exploités par le reour ajax. Si vous ne souhaitez pas utiliser cette méthode voir le mode d'emploi : section "Configuration Serveur", paragraphe "Upload sans Transfert".
*/
$transfert = $up->Transfert($destination_fichier);
/* note:
- Ici, on aurait logiquement pu mettre cette ligne à l'intérieur de la condition "if($up->getTempAdressFileComplete() != false)". Je la met ici pour montrer que la méthode "Transfert" fait automatiquement cette vérification.
*/
//Si l'on doit indiquer les droits d'accès du fichier, par exemple 604, on pourrait faire
/*if($transfert && !@chmod($destination_fichier,0604))
{
// Efface le fichier et envoie un message si erreur
unlink($destination_fichier);
$up->exitStatusErreur(SetMessages::get('UpAbConfigChmod'));
}*/
}
/*
INDISPENSABLE : La méthode "exitReponseAjax()" doit être appelée en fin de script et APRES l'utilisation de la méthode "Transfert()" pour retourner les informations nécessaires à la requête Ajax.
Entre l'utilisation de ces deux méthodes, on peut réaliser d'autres opérations, par exemple :
*/
// "getTransfertOk()" à utiliser après la méthode "Transfert()", renvoie true si le fichier complet a été déplacé avec succès vers son emplacement définitif, sinon false (alternativement on pourrait tester le retour de la méthode "Transfert()").
if($up->getTransfertOk())
{
// C'est dans cette condition qu'il conviendrait par exemple d'enregistrer la destination du fichier en bdd
/*
$bdd_ok = enregistrement du nom ou de la destination du fichier en bdd...
*/
// Et par exemple envoyer un message de confirmation dans le statut du fichier
/*
if ($bdd_ok)
{
//Utilisez la méthode "addStatusOk($value)" si vous souhaitez envoyer des messages qui seront concaténés au statut "info.status.ok" (de la classe javascript) qui renseigne le bloc html ayant la classe "UpAbci_status". Par exemple :
$up->addStatusOk(", enregistrement en bdd ok.");
// affichera "Téléchargement ok, enregistrement en bdd ok." si vous n'avez pas modifié la valeur de "info.status.ok" dans la configuration javascript.
}
*/
// Dans le cas des formulaires n°6 et n°7 le message javascript "info.status.ok" a été configuré vide. On souhaite uniquement afficher un message textuel si le fichier a été renommé (qu'il ait été nettoyé ou renommé à cause d'un doublon sur le serveur)
if (isset($id_form, $destination_fichier, $nom_fichier_originel) && ($id_form == '#form_files5' || $id_form == '#form_files6'))
{
// On ne doit pas utiliser la variable "$nom_fichier_nettoye" précédemment définie pour faire la comparaison avec le $nom_fichier_originel car le nom du fichier peut aussi être modifié en cas de doublon sur le serveur puisque j'utilise $up->renameIdenticName() prédédemment.
$nom_final = pathinfo($destination_fichier, PATHINFO_FILENAME);
$extension_fichier = pathinfo($destination_fichier, PATHINFO_EXTENSION);
$nom_final = trim($extension_fichier) != '' ? $nom_final.'.'.$extension_fichier : $nom_final;
if ($nom_fichier_originel != $nom_final)
{
$up->addStatusOk(SetMessages::get('UpAbRenomme').': '.$nom_final);
}
}
}
// On peut retourner directement des informations texte ou html dans le bloc html ayant la classe "UpAbci_infosServer" en utilisant la méthode "addInfosServer ($value)". Ici je choisi de faire afficher un message si aucun fichier n'est joint lors de l'envoi du formulaire.
if (!$fichier_en_cours)
{
$up->addInfosServer(SetMessages::get('UpAbAucunFichierTraite'));// SetMessages::get('UpAbAucunFichierTraite') renvoie "Aucun fichier traité"
}
// Notez qu'il existe une méthode nommée addMixteServer() qui permet d'envoyer tout type de contenu (tableau, texte ou html) dans le troisième paramètre des méthodes javascript événementielles "config.func_FileEndEach()" et "config.func_FormEnd()", afin de pouvoir exploiter ce contenu en javascript.
// *INDISPENSABLE dans tous les cas : Envoi des informations nécessaires pour terminer le script javascript avec "exitReponseAjax()"
$up->exitReponseAjax();
?> |
Partager