PageRenderTime 85ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/php/File.php

https://gitlab.com/fridezlucas/utils
PHP | 268 lines | 130 code | 20 blank | 118 comment | 11 complexity | 564e497afabe60e113300c7baaef7d31 MD5 | raw file
  1. <?php
  2. /*****************************************************************************************
  3. * PROPRIETES DES FICHIERS
  4. *****************************************************************************************/
  5. /**
  6. * Obtenir le nom d'un fichier
  7. * @author Fridez Lucas
  8. *
  9. * @param $filePath : Représente le chemin du fichier dont on souhaite obtenir le nom
  10. *
  11. * @return string : Le nom du fichier désiré
  12. */
  13. function getFileName($filePath) {
  14. return strtolower(pathinfo($filePath, PATHINFO_FILENAME));
  15. }
  16. /**
  17. * Nettoyer le nom d'un fichier en supprimant les caratères interdits
  18. *
  19. * @param $filename : Nom du fichier a nettoyer
  20. *
  21. * @return mixed|string : Nom du fichier nettoyé
  22. */
  23. function sanitize_file_name($filename) {
  24. $filename_raw = $filename;
  25. $special_chars = ["?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*",
  26. "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0)];
  27. $filename = preg_replace("#\x{00a0}#siu", ' ', $filename);
  28. $filename = str_replace($special_chars, '', $filename);
  29. $filename = str_replace(['%20', '+'], '-', $filename);
  30. $filename = preg_replace('/[\r\n\t -]+/', '-', $filename);
  31. $filename = trim($filename, '.-_');
  32. return $filename;
  33. }
  34. /**
  35. * Retourne l'extension du fichier en minuscule
  36. * @author Fridez Lucas
  37. *
  38. * @param $filePath : Chemin du fichier dont on veut connaître l'extension
  39. *
  40. * @return string : Extension du fichier
  41. */
  42. function getExtensionFile($filePath) {
  43. return strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
  44. }
  45. /**
  46. * Tester l'extension d'un chemin de fichier avec une extension
  47. * Ne contrôle pas si le fichier existe
  48. * @author Fridez Lucas
  49. *
  50. * @param $filePath : Chemin du fichier dont on souhaite tester l'extension
  51. * @param $extensionString : Chaîne de caractère correspondant à l'extension qui sera tester sur le chemin de fichier
  52. *
  53. * @return bool : Booléen à vrai si l'extension correspond. Faux dans le cas contraire.
  54. */
  55. function testExtensionFile($filePath, $extensionString) {
  56. return (getExtensionFile($filePath) == strtolower($extensionString));
  57. }
  58. /**
  59. * Obtenir le MIME type du fichier
  60. * @author Fridez Lucas
  61. *
  62. * @param $filePath : Chemin du fichir dont on veut connaître le MIME type
  63. *
  64. * @return mixed : MIME type du fichier
  65. */
  66. function getMimeTypeFile($filePath) {
  67. $fileInfo = finfo_open(FILEINFO_MIME_TYPE);
  68. if (is_file($filePath)) {
  69. $mimeType = finfo_file($fileInfo, $filePath);
  70. }
  71. return $mimeType;
  72. }
  73. /*****************************************************************************************
  74. * OBTENIR LES LISTES DE FICHIERS / DOSSIERS
  75. *****************************************************************************************/
  76. /**
  77. * Obtenir un tableau contenant tous les fichiers contenus dans un dossier
  78. * @author Fridez Lucas
  79. *
  80. * @param string $dirPath : Chemin du dossier dont on veut obtenir les fichiers
  81. * @param string $fileExtension : Extension de fichier souhaitée
  82. *
  83. * @return array : Tableau contenant tous les fichiers correspondants aux critères
  84. */
  85. function getFiles($dirPath = __DIR__, $fileExtension = "*") {
  86. if (is_dir($dirPath)) {
  87. $files = glob($dirPath . "/*." . $fileExtension);
  88. }
  89. return $files;
  90. }
  91. /**
  92. * Obtenir un tableau contenant tous les dossiers fils contenus dans un dossier parent
  93. * @author Fridez Lucas
  94. *
  95. * @param string $dirPath : Chemin du dossier dont on veut obtenir les répertoires
  96. *
  97. * @return array : Tableau contenant tous les répertoires correspondants au critère
  98. */
  99. function getDirs($dirPath = __DIR__) {
  100. if (is_dir($dirPath)) {
  101. $dirs = glob($dirPath . "/*", GLOB_ONLYDIR);
  102. }
  103. return $dirs;
  104. }
  105. /*****************************************************************************************
  106. * COMPTER LES FICHIERS / DOSSIERS
  107. *****************************************************************************************/
  108. /**
  109. * Compter le nombre de fichiers dans un répertoire
  110. * @author Fridez Lucas
  111. *
  112. * @param string $dirPath : Chemin du dossier dont on souhaite compter le nombre de fichiers
  113. * @param string $fileExtension : Extension de fichier souhaitée
  114. *
  115. * @return int : Nombre de fichiers
  116. */
  117. function countFiles($dirPath = __DIR__, $fileExtension = "*") {
  118. $files = getFiles($dirPath, $fileExtension);
  119. return count($files);
  120. }
  121. /**
  122. * Compter le nombre de dossiers dans un répertoire
  123. * @author Fridez Lucas
  124. *
  125. * @param string $dirPath : Chemin dont on désire connaître le nombre de dossiers
  126. *
  127. * @return int : Nombre de dossiers
  128. */
  129. function countDirs($dirPath = __DIR__) {
  130. $dirs = getDirs($dirPath);
  131. return count($dirs);
  132. }
  133. /*****************************************************************************************
  134. * FICHIERS XML
  135. *****************************************************************************************/
  136. /**
  137. * Obtenir un tableau correspondant à un fichier XML
  138. * @author Fridez Lucas
  139. *
  140. * @param $filePath : Chemin du fichier XML à analyser
  141. *
  142. * @return array : Tableau contenant le fichier XML
  143. */
  144. function getArrayXmlFile($filePath) {
  145. if (is_file($filePath) AND testExtensionFile($filePath, 'xml')) {
  146. //Parser le fichier xml
  147. $xml = simplexml_load_file($filePath);
  148. //Encoder l'objet xml en chaîne JSON
  149. $json = json_encode($xml);
  150. //Transforme la chaîne JSON en tableau PHP
  151. $xmlArray = json_decode($json, TRUE);
  152. }
  153. return $xmlArray;
  154. }
  155. /**
  156. * Obtenir un objet DOM Document d'un fichier XML
  157. * @author Fridez Lucas
  158. *
  159. * @param $filePath : Chemin du fichier XML dont on veut créer un objet DOM Document
  160. *
  161. * @return DOMDocument : DOMDocument correspondant au fichier chargé
  162. */
  163. function getDomDocumentXmlFile($filePath) {
  164. //Créer un nouvel objet de type DOMDocument
  165. $xmlDoc = new DOMDocument;
  166. //Active le maintient de l'indentation
  167. $xmlDoc->formatOutput = TRUE;
  168. //Désactive la suppression des espaces redondants
  169. $xmlDoc->preserveWhiteSpace = FALSE;
  170. //Charger le document XML dans l'objet DOMDocument
  171. if (is_file($filePath) AND testExtensionFile($filePath, 'xml')) {
  172. $xmlDoc->load($filePath);
  173. }
  174. return $xmlDoc;
  175. }
  176. /*****************************************************************************************
  177. * UPLOAD DE FICHIERS
  178. *****************************************************************************************/
  179. //Liste des types de fichiers autorisés
  180. const FILE_VALID_TYPE = [
  181. 'image/gif' => 'gif',
  182. 'text/plain' => 'txt',
  183. 'image/jpeg' => 'jpg',
  184. 'application/pdf' => 'pdf',
  185. 'image/png' => 'png',
  186. ];
  187. /**
  188. * Uploader un fichier s'il correspond aux critères (extension, poids, type)
  189. * Déplacer le fichier dans le répertoire désiré et nettoyer son nom (compatible URL)
  190. *
  191. * @param $uploadDir : Chemin du dossier ou l'on souhaite déplacer les fichiers uploadés
  192. * @param $fileInputName : Nom de la balise <input type="file"> à partir de laquelle on souhaite uploader des fichiers
  193. *
  194. * @return array : Tableau contenant les erreurs d'upload. Vide si l'upload est un succès.
  195. */
  196. function uploadFile($uploadDir, $fileInputName) {
  197. $errors = [];
  198. //Si erreur lors de l'envoi (code d'erreur > 0)
  199. if ($_FILES[$fileInputName]['error']) {
  200. switch ($_FILES[$fileInputName]['error']) {
  201. case UPLOAD_ERR_INI_SIZE:
  202. case UPLOAD_ERR_FORM_SIZE:
  203. $errors[] = "Fichier trop volumineux.";
  204. break;
  205. case UPLOAD_ERR_NO_FILE:
  206. $errors[] = "Choisir un fichier.";
  207. break;
  208. default:
  209. $errors[] = "Erreur lors de l'envoi du fichier.";
  210. break;
  211. }
  212. }
  213. //Si envoi du fichier ok
  214. if ($_FILES[$fileInputName]['error'] === UPLOAD_ERR_OK) {
  215. //Détermine le type du fichier
  216. $fileType = getMimeTypeFile($_FILES[$fileInputName]['tmp_name']);
  217. //Si extension invalide
  218. if (!array_key_exists($fileType, FILE_VALID_TYPE)) {
  219. $errors[] = 'Type de fichier (' . $fileType . ') invalide.';
  220. }
  221. //Si fichier trop volumineux > MYFILES_MAX_UPLOAD
  222. // MYFILES_MAX_UPLOAD est une constante que l'on crée et que l'on ajoute en valeur d'un input caché.
  223. if ($_FILES[$fileInputName]['size'] > MYFILES_MAX_UPLOAD) {
  224. $errors[] = 'Fichier trop volumineux.';
  225. }
  226. //Si PAS d'erreur, on nettoye le nom du fichier et on le copie
  227. if (!$errors) {
  228. //Nettoye, supprimer les caractères interdits, du nom et supprime l'extension
  229. $fileName = sanitize_file_name(getFileName($_FILES[$fileInputName]['name']));
  230. //Ajoute l'extension correspondant au type du fichier
  231. $fileName = $fileName . '.' . FILE_VALID_TYPE[$fileType];
  232. //Copie du fichier
  233. if (!@move_uploaded_file($_FILES[$fileInputName]['tmp_name'], $uploadDir . $fileName)) {
  234. $errors[] = 'Copie du fichier' . $fileName . ' impossible pour le moment';
  235. }
  236. }
  237. }
  238. return $errors;
  239. }