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 211 212 213
| <?php
/*
Gardez à 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.
CONSULTEZ LE MODE D'EMPLOI POUR L'UTILISATION DES METHODES SERVEUR,
BON NOMBRE D'ENTRE ELLES DOIVENT ETRE UTILISEES DANS UN ORDRE PRECIS.
*/
// Vous devez vérifier l'existence du dossier ou changer cette adresse
/*------------------------------------------------------*/
$dossier_destination = '../Destination_Upload1/';
/*------------------------------------------------------*/
// Pour récupérer la variable de session "$_SESSION['UploadAjaxABCI'][$uniqid_form]" qui fait office de token
session_start();
// Par sécurité on n'autorise que certaines extensions
$ext_ok = ['csv','pdf'];
// On limite la taille maximale de chaque fichier si besoin
$max_size = '500 Mo';
// Charge les classes php avec spl_autoload_register
spl_autoload_register(function ($class) {require 'Classes/' . $class . '.php';});
/* On peut configurer la classe en envoyant un tableau (voir mode d'emploi: "Configuration serveur -> configuration de la classe d'upload serveur").
Les paramètres du fichier "ParamsDefautServeur.php" seront appliqués pour les paramètres non renseignés.
Cette configuration renverra les messages appropriés en cas d'extension non autorisée, ou si le type mime du fichier
ne correspond pas à son extension ou si la taille du fichier dépasse la taille autorisée.
Voir le fichier UploadAjaxABCI_Upload_Basique_Controle_Multiple.php pour d'autres possibilités.
*/
$config = [
'dossier_destination' => $dossier_destination
,'extensions' => $ext_ok
,'max_size' => $max_size
,'verif_type_MIME' => ['except'=>['csv']] //Si l'on souhaite exclure le contrôle du type MIME pour certaines extensions (ici csv)
];
// Initialisation de la classe php d'upload
$up = new UploadAjaxABCIServeur($config);
/*
Lors de traitement complémentaire à l'upload on peut gérer les erreurs fatales du serveur
avec la méthode catchErrorServer. Les éventuelles erreurs fatales à gérer ici sont le dépassement de la capacité mémoire du serveur
et du temps maximum autorisé pour l'exécution du script.
Les contenus des messages renvoyés par "SetMessages::get" sont ceux de la classe "Message.php". Faire une recherche par exemple sur "UpAbAllowedMemorySize"
dans le fichier "Message.php" du dossier "Classes" inclus dans le dossier "Php_Upload" pour voir la correspondance.
Pour personnaliser le message, plutôt que de modifier le contenu de cette classe, il est plus simple d'écrire directement sont propre message,
par exemple $tab_erreurs['Allowed memory size'] = ['Vous avez explosé la mémoire du serveur, une facture de maintenance vous sera envoyée pour réparation',true];
*/
$tab_erreurs = [];
$tab_erreurs['Allowed memory size'] = [SetMessages::get('UpAbAllowedMemorySize'),true];
$tab_erreurs['Maximum execution time'] = [SetMessages::get('UpAbMaximumExecutionTime'),true];
$up->catchErrorServer($tab_erreurs);
// Décommenter la ligne ci-dessous en phase de développement pour faire afficher les erreurs php dans le formulaire.
// $up->setModeDebug ();
/* getParam("uniqid_form") renvoie l'identifiant de formulaire pour la vérification ci-dessous
cf mode d'emploi "Configuration serveur -> Récupération des paramètres Ajax prédéfinis" pour les index disponibles.
*/
$uniqid_form = $up->getParam("uniqid_form");
/* Il est conseillé (indispensable) 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]['token'])))
{
$up->exitStatusErreur(SetMessages::get('UpAbVerifToken'));
}
// Initialise l'upload
$up->Upload();
// Récupère le fichier lorsqu'il est complet. C'est à l'intérieur de cette condition que tu pourras faire des traitements sur le fichier
$fichier_complet = $up->getTempAdressFileComplete();
if($fichier_complet != false)
{
/*
C'est donc $fichier_complet que tu dois utiliser avec les fonctions php fetgetcsv ou encore SplFileObject
Si ce même script doit être utilisé pour charger à la fois des fichiers pdf et csv, il faut faire des distinctions pour faire des traitements différents.
getcleanFileName() récupère le nom du fichier nettoyé, utile pour tes fichiers pdf s'ils doivent être accessibles via une URL, sinon on peut utiliser $up->getParam('name')
qui retourne le nom originel du fichier.
Enfin peu importe puisqu'ici je cherche à faire un tri sur l'extension
*/
$name = $up->getcleanFileName();
$extension = $up->getExtension($name);
if($extension == 'csv') {
/* Prépare une requête avec la classe pdo intégrée
Pour qu'elle fonctionne, tu dois renseigner tes propres valeurs de connexion dans la méthode "getParamConnectBdd"
de la classe "ParamsDefautServeur" qui est inclue dans le dossier "Classes" du dossier "Php_Upload"
*/
try
{
$dbh = C_PDO::getC();
// Ma table se nomme "test_bart" et comprend trois champs "Nom", "Prenom", "Telephone"
$insert = $dbh->prepare("INSERT INTO test_bart (Nom, Prenom, Telephone) VALUES (?, ?, ?)");
// Prépare la lecture du fichier csv
$file = new SplFileObject($fichier_complet);
// Configure pour la lecture d'un CSV et pour ignorer les lignes vides
$file->setFlags(
SplFileObject::READ_CSV |
SplFileObject::SKIP_EMPTY |
SplFileObject::DROP_NEW_LINE |
SplFileObject::READ_AHEAD
);
// Si format français le séparateur est un point virgule, l'enclosure est '"' et escape est vide (qu'il faut spécifier pour compatibilité php 8.4)
$file->setCsvControl(';','"','');
$row_count = 0;
// Liste le csv en hydratant la bdd, suppose que les champs csv sont dans le même ordre que ceux de la bdd
foreach ($file as $row) {
list($param1, $param2, $param3) = $row;
// Eventuellement pour voir les lignes en phase de débug, décommentes la ligne ci-dessous (le script s'arrêtera et renverra la valeur)
//$up->exitStatusErreur(var_dump($row));
// Hydrate la bdd
$insert->execute([$param1, $param2, $param3]);
// Pour compter le nombre de lignes insérées
$row_count += $insert->rowCount();
}
// Envoie un message dans le html avec le nombre de lignes mises à jour
$up->addStatusOk("Traitement terminé. ".$row_count." lignes ont été insérées.");
/* Le fichier csv est exploité et n'a plus d'utilité, on n'utilisera pas la fonction Transfert () qui transfère le fichier ver son emplacement définitif, renseigne le status javascript, et efface le fichier temporaire et le cookie de sauvegarde.
On utilisera donc à la place des fonctions dédiées pour renseigner le retour javascript (indispensable pour la bonne continuité du script) et pour supprimer le fichier temporaire.
*/
// Status ok pour renseigner le retour javascript
$up->setTransfertOk();
// Efface le fichier et le cookie de sauvegarde
$up->deleteFileTempCookie();
}
// Retourne les erreurs pdo
catch(PDOException $e)
{
/*
A noter que la méthode exitStatusErreur() sort du script dès qu'elle est appelée.
Si l'on souhaite supprimer le fichier temporaire, ce qui est logique en cas d'erreur, il faut donc le supprimer avant d'appliquer la méthode exitStatusErreur().
*/
// Efface le fichier et le cookie de sauvegarde
$up->deleteFileTempCookie();
/* remplacer la ligne ci-dessous par
$up->exitStatusErreur(SetMessages::get('UpAbConnectBdd'));
en dehors des phases de débug pour éviter de renseigner les visiteurs sur la structure de la bdd
*/
$up->exitStatusErreur($e->getMessage());
}
// Retourne les autres erreurs (donc celles générées par SplFileObject)
catch(Exception $e)
{
// Efface le fichier et le cookie de sauvegarde
$up->deleteFileTempCookie();
// Sort du script en renvoyant le message d'erreur
$up->exitStatusErreur($e->getMessage());
}
}
else if ($extension == 'pdf') {
/* Transfert() attend comme argument le chemin complet de destination du fichier, si non renseigné ce sera
$dossier_destination.$nom_fichier_nettoyé ou encore "$up->getFileDestination()" qui retourne la même valeur
*/
// Ci-dessous je teste l'adresse du fichier $pdf pour éviter d'écraser des fichiers de même nom déjà existants
if(!is_file($up->getFileDestination())) {
$tranfert = $up->Transfert();
if($tranfert) {
$up->addStatusOk("Votre fichier PDF a été chargé avec succès");
// Si besoin pour définir le chmod par exemple 0604
$up->setChmod($up->getFileDestination(), 0604);
// (pas besoin de supprimer le fichier temporaire et le cookie de sauvegarde puisque la méthode Transfert() le fait automatiquement
}
}
else { // Si le fichier existe déjà
// Efface le fichier et le cookie de sauvegarde
$up->deleteFileTempCookie();
// Sort du script en renvoyant un message d'erreur
$up->exitStatusErreur("Ce fichier existe déjà");
}
}
}
// Indispensable dans tous les cas de figure, renvoie les informations à javascript
$up->exitReponseAjax();
?> |
Partager