PageRenderTime 51ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/core/lib/class.plx.medias.php

https://bitbucket.org/bontiv/insomnia
PHP | 464 lines | 295 code | 48 blank | 121 comment | 66 complexity | 1618bd1a26079d4ad5b166fd1342ad8d MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, LGPL-2.1, GPL-3.0, BSD-3-Clause, GPL-2.0
  1. <?php
  2. /**
  3. * Classe plxMedias regroupant les fonctions pour gérer la librairie des medias
  4. *
  5. * @package PLX
  6. * @author Stephane F
  7. **/
  8. class plxMedias {
  9. public $path = null; # chemin vers les médias
  10. public $dir = null;
  11. public $aDirs = array(); # liste des dossiers et sous dossiers
  12. public $aFiles = array(); # liste des fichiers d'un dossier
  13. public $maxUpload = array(); # taille maxi des images
  14. public $thumbQuality = 60; # qualite image
  15. public $thumbWidth = 60; # largeur des miniatures
  16. public $thumbHeight = 60; # hauteur des miniatures
  17. public $img_exts = '/\.(jpg|gif|png|bmp|jpeg)$/i';
  18. public $doc_exts = '/\.(7z|aiff|asf|avi|csv|doc|docx|fla|flv|gz|gzip|mid|mov|mp3|mp4|mpc|mpeg|mpg|ods|odt|odp|pdf|ppt|pptx|pxd|qt|ram|rar|rm|rmi|rmvb|rtf|swf|sxc|sxw|tar|tgz|txt|wav|wma|wmv|xls|xlsx|zip)$/i';
  19. /**
  20. * Constructeur qui initialise la variable de classe
  21. *
  22. * @param path répertoire racine des médias
  23. * @param dir dossier de recherche
  24. * @return null
  25. * @author Stephane F
  26. **/
  27. public function __construct($path, $dir) {
  28. # Initialisation
  29. $this->path = $path;
  30. $this->dir = $dir;
  31. # Création du dossier réservé à l'utilisateur connecté s'il n'existe pas
  32. if(!is_dir($this->path)) {
  33. if(!@mkdir($this->path,0755))
  34. return plxMsg::Error(L_PLXMEDIAS_MEDIAS_FOLDER_ERR);
  35. }
  36. # Création du dossier réservé aux miniatures
  37. if(!is_dir($this->path.'.thumbs/'.$this->dir)) {
  38. @mkdir($this->path.'.thumbs/'.$this->dir,0755,true);
  39. }
  40. $this->aDirs = $this->_getAllDirs($this->path);
  41. $this->aFiles = $this->_getDirFiles($this->dir);
  42. # Taille maxi pour l'upload de fichiers sur le serveur
  43. $maxUpload = strtoupper(ini_get("upload_max_filesize"));
  44. $this->maxUpload['display'] = str_replace('M', ' Mo', $maxUpload);
  45. $this->maxUpload['display'] = str_replace('K', ' Ko', $this->maxUpload['display']);
  46. if(substr_count($maxUpload, 'K')) $this->maxUpload['value'] = str_replace('K', '', $maxUpload) * 1024;
  47. elseif(substr_count($maxUpload, 'M')) $this->maxUpload['value'] = str_replace('M', '', $maxUpload) * 1024 * 1024;
  48. else $this->maxUpload['value'] = 0;
  49. }
  50. /**
  51. * Méthode récursive qui retourne un tableau de tous les dossiers et sous dossiers dans un répertoire
  52. *
  53. * @param dir repertoire de lecture
  54. * @param level profondeur du repertoire
  55. * @return folders tableau contenant la liste de tous les dossiers et sous dossiers
  56. * @author Stephane F
  57. **/
  58. private function _getAllDirs($dir,$level=0) {
  59. # Initialisation
  60. $folders = array();
  61. # Ouverture et lecture du dossier demandé
  62. if($handle = opendir($dir)) {
  63. while (FALSE !== ($folder = readdir($handle))) {
  64. if($folder[0] != '.') {
  65. if(is_dir(($dir!=''?$dir.'/':$dir).$folder)) {
  66. $dir = (substr($dir, -1)!='/' AND $dir!='') ? $dir.'/' : $dir;
  67. $path = str_replace($this->path, '',$dir.$folder.'/');
  68. $folders[] = array(
  69. 'level' => $level,
  70. 'name' => $folder,
  71. 'path' => $path
  72. );
  73. $folders = array_merge($folders, $this->_getAllDirs($dir.$folder, $level+1) );
  74. }
  75. }
  76. }
  77. closedir($handle);
  78. }
  79. # On retourne le tableau
  80. return $folders;
  81. }
  82. /**
  83. * Méthode qui retourne la liste des des fichiers d'un répertoire
  84. *
  85. * @param dir répertoire de lecture
  86. * @return files tableau contenant la liste de tous les fichiers d'un dossier
  87. * @author Stephane F
  88. **/
  89. private function _getDirFiles($dir) {
  90. # Initialisation
  91. $files = array();
  92. # Ouverture et lecture du dossier demandé
  93. if($handle = @opendir($this->path.$dir)) {
  94. while(FALSE !== ($file = readdir($handle))) {
  95. $thumName = plxUtils::thumbName($file);
  96. if($file[0] != '.' AND !preg_match('/index.htm/i', $file) AND !preg_match('/^(.*\.)tb.([^.]+)$/D', $file)) {
  97. if(is_file($this->path.$dir.$file)) {
  98. $ext = strtolower(strrchr($this->path.$dir.$file,'.'));
  99. $_thumb1=file_exists($this->path.'.thumbs/'.$dir.$file);
  100. if(!$_thumb1 AND in_array($ext, array('.gif', '.jpg', '.png'))) {
  101. $_thumb1 = plxUtils::makeThumb($this->path.$dir.$file, $this->path.'.thumbs/'.$dir.$file, $this->thumbWidth, $this->thumbHeight, $this->thumbQuality);
  102. }
  103. $_thumb2=false;
  104. if(is_file($this->path.$dir.$thumName)) {
  105. $_thumb2 = array(
  106. 'infos' => @getimagesize($this->path.$dir.$thumName),
  107. 'filesize' => filesize($this->path.$dir.$thumName)
  108. );
  109. }
  110. $files[$file] = array(
  111. '.thumb' => $_thumb1 ? $this->path.'.thumbs/'.$dir.$file : PLX_CORE.'admin/theme/images/file.png',
  112. 'name' => $file,
  113. 'path' => $this->path.$dir.$file,
  114. 'date' => filemtime($this->path.$dir.$file),
  115. 'filesize' => filesize($this->path.$dir.$file),
  116. 'extension' => $ext,
  117. 'infos' => @getimagesize($this->path.$dir.$file),
  118. 'thumb' => $_thumb2
  119. );
  120. }
  121. }
  122. }
  123. closedir($handle);
  124. }
  125. # On tri le contenu
  126. ksort($files);
  127. # On retourne le tableau
  128. return $files;
  129. }
  130. /**
  131. * Méthode qui formate l'affichage de la liste déroulante des dossiers
  132. *
  133. * @return string chaine formatée à afficher
  134. * @author Stephane F
  135. **/
  136. public function contentFolder() {
  137. $str = "\n".'<select class="folder" id="folder" size="1" name="folder">'."\n";
  138. $selected = (empty($this->dir)?'selected="selected" ':'');
  139. $str .= '<option '.$selected.'value=".">|. ('.L_PLXMEDIAS_ROOT.') &nbsp; </option>'."\n";
  140. # Dir non vide
  141. if(!empty($this->aDirs)) {
  142. foreach($this->aDirs as $k => $v) {
  143. $prefixe = '|&nbsp;&nbsp;';
  144. $i = 0;
  145. while($i < $v['level']) {
  146. $prefixe .= '&nbsp;&nbsp;';
  147. $i++;
  148. }
  149. $selected = ($v['path']==$this->dir?'selected="selected" ':'');
  150. $str .= '<option '.$selected.'value="'.$v['path'].'">'.$prefixe.$v['name'].'</option>'."\n";
  151. }
  152. }
  153. $str .= '</select>'."\n";
  154. # On retourne la chaine
  155. return $str;
  156. }
  157. /**
  158. * Méthode qui supprime un fichier (et sa vignette si elle existe dans le cas d'une image)
  159. *
  160. * @param files liste des fichier à supprimer
  161. * @return boolean faux si erreur sinon vrai
  162. * @author Stephane F
  163. **/
  164. public function deleteFiles($files) {
  165. $count = 0;
  166. foreach($files as $file) {
  167. # protection pour ne pas supprimer un fichier en dehors de $this->path.$this->dir
  168. $file=basename($file);
  169. if(!@unlink($this->path.$this->dir.$file)) {
  170. $count++;
  171. } else {
  172. # Suppression de la vignette
  173. if(is_file($this->path.'.thumbs/'.$this->dir.$file))
  174. @unlink($this->path.'.thumbs/'.$this->dir.$file);
  175. # Suppression de la miniature
  176. $thumName = plxUtils::thumbName($file);
  177. if(is_file($this->path.$this->dir.$thumName))
  178. @unlink($this->path.$this->dir.$thumName);
  179. }
  180. }
  181. if(sizeof($files)==1) {
  182. if($count==0)
  183. return plxMsg::Info(L_PLXMEDIAS_DELETE_FILE_SUCCESSFUL);
  184. else
  185. return plxMsg::Error(L_PLXMEDIAS_DELETE_FILE_ERR);
  186. }
  187. else {
  188. if($count==0)
  189. return plxMsg::Info(L_PLXMEDIAS_DELETE_FILES_SUCCESSFUL);
  190. else
  191. return plxMsg::Error(L_PLXMEDIAS_DELETE_FILES_ERR);
  192. }
  193. }
  194. /**
  195. * Méthode récursive qui supprimes tous les dossiers et les fichiers d'un répertoire
  196. *
  197. * @param deldir répertoire de suppression
  198. * @return boolean résultat de la suppression
  199. * @author Stephane F
  200. **/
  201. private function _deleteDir($deldir) { #fonction récursive
  202. if(is_dir($deldir) AND !is_link($deldir)) {
  203. if($dh = @opendir($deldir)) {
  204. while(FALSE !== ($file = readdir($dh))) {
  205. if($file != '.' AND $file != '..') {
  206. $this->_deleteDir($deldir.'/'.$file);
  207. }
  208. }
  209. closedir($dh);
  210. }
  211. return rmdir($deldir);
  212. }
  213. return unlink($deldir);
  214. }
  215. /**
  216. * Méthode qui supprime un dossier et son contenu
  217. *
  218. * @param deleteDir répertoire à supprimer
  219. * @return boolean faux si erreur sinon vrai
  220. * @author Stephane F
  221. **/
  222. public function deleteDir($deldir) {
  223. # suppression du dossier des miniatures et de son contenu
  224. $this->_deleteDir($this->path.'.thumbs/'.$deldir);
  225. # suppression du dossier des images et de son contenu
  226. if($this->_deleteDir($this->path.$deldir))
  227. return plxMsg::Info(L_PLXMEDIAS_DEL_FOLDER_SUCCESSFUL);
  228. else
  229. return plxMsg::Error(L_PLXMEDIAS_DEL_FOLDER_ERR);
  230. }
  231. /**
  232. * Méthode qui crée un nouveau dossier
  233. *
  234. * @param newdir nom du répertoire à créer
  235. * @return boolean faux si erreur sinon vrai
  236. * @author Stephane F
  237. **/
  238. public function newDir($newdir) {
  239. $newdir = $this->path.$this->dir.$newdir;
  240. if(!is_dir($newdir)) { # Si le dossier n'existe pas on le créer
  241. if(!@mkdir($newdir,0755))
  242. return plxMsg::Error(L_PLXMEDIAS_NEW_FOLDER_ERR);
  243. else
  244. return plxMsg::Info(L_PLXMEDIAS_NEW_FOLDER_SUCCESSFUL);
  245. } else {
  246. return plxMsg::Error(L_PLXMEDIAS_NEW_FOLDER_EXISTS);
  247. }
  248. }
  249. /**
  250. * Méthode qui envoi un fichier sur le serveur
  251. *
  252. * @param file fichier à uploader
  253. * @param resize taille du fichier à redimensionner si renseigné
  254. * @param thumb taille de la miniature à créer si renseigné
  255. * @return msg message contenant le résultat de l'envoi du fichier
  256. * @author Stephane F
  257. **/
  258. private function _uploadFile($file, $resize, $thumb) {
  259. if($file['name'] == '')
  260. return false;
  261. if($file['size'] > $this->maxUpload['value'])
  262. return L_PLXMEDIAS_WRONG_FILESIZE;
  263. if(!preg_match($this->img_exts, $file['name']) AND !preg_match($this->doc_exts, $file['name']))
  264. return L_PLXMEDIAS_WRONG_FILEFORMAT;
  265. # On teste l'existence du fichier et on formate le nom du fichier pour éviter les doublons
  266. $i = 1;
  267. $upFile = $this->path.$this->dir.plxUtils::title2filename($file['name']);
  268. $name = substr($upFile, 0, strrpos($upFile,'.'));
  269. $ext = strrchr($upFile, '.');
  270. while(file_exists($upFile)) {
  271. $upFile = $this->path.$this->dir.$name.'.'.$i++.$ext;
  272. }
  273. if(!@move_uploaded_file($file['tmp_name'],$upFile)) { # Erreur de copie
  274. return L_PLXMEDIAS_UPLOAD_ERR;
  275. } else { # Ok
  276. if(preg_match($this->img_exts, $file['name'])) {
  277. plxUtils::makeThumb($upFile, $this->path.'.thumbs/'.$this->dir.basename($upFile), $this->thumbWidth, $this->thumbHeight, $this->thumbQuality);
  278. if($resize)
  279. plxUtils::makeThumb($upFile, $upFile, $resize['width'], $resize['height'], 80);
  280. if($thumb)
  281. plxUtils::makeThumb($upFile, plxUtils::thumbName($upFile), $thumb['width'], $thumb['height'], 80);
  282. }
  283. }
  284. return L_PLXMEDIAS_UPLOAD_SUCCESSFUL;
  285. }
  286. /**
  287. * Méthode qui envoi une liste de fichiers sur le serveur
  288. *
  289. * @param files fichiers à uploader
  290. * @param post parametres
  291. * @return msg resultat de l'envoi des fichiers
  292. * @author Stephane F
  293. **/
  294. public function uploadFiles($files, $post) {
  295. $count=0;
  296. foreach($files as $file) {
  297. $resize = false;
  298. $thumb = false;
  299. if(!empty($post['resize'])) {
  300. if($post['resize']=='user') {
  301. $resize = array('width' => intval($post['user_w']), 'height' => intval($post['user_h']));
  302. } else {
  303. list($width,$height) = explode('x', $post['resize']);
  304. $resize = array('width' => $width, 'height' => $height);
  305. }
  306. }
  307. if(!empty($post['thumb'])) {
  308. if($post['thumb']=='user') {
  309. $thumb = array('width' => intval($post['thumb_w']), 'height' => intval($post['thumb_h']));
  310. } else {
  311. list($width,$height) = explode('x', $post['thumb']);
  312. $thumb = array('width' => $width, 'height' => $height);
  313. }
  314. }
  315. if($res=$this->_uploadFile($file, $resize, $thumb)) {
  316. switch($res) {
  317. case L_PLXMEDIAS_WRONG_FILESIZE:
  318. return plxMsg::Error(L_PLXMEDIAS_WRONG_FILESIZE);
  319. break;
  320. case L_PLXMEDIAS_WRONG_FILEFORMAT:
  321. return plxMsg::Error(L_PLXMEDIAS_WRONG_FILEFORMAT);
  322. break;
  323. case L_PLXMEDIAS_UPLOAD_ERR:
  324. return plxMsg::Error(L_PLXMEDIAS_UPLOAD_ERR);
  325. break;
  326. case L_PLXMEDIAS_UPLOAD_SUCCESSFUL:
  327. $count++;
  328. break;
  329. }
  330. }
  331. }
  332. if($count==1)
  333. return plxMsg::Info(L_PLXMEDIAS_UPLOAD_SUCCESSFUL);
  334. elseif($count>1)
  335. return plxMsg::Info(L_PLXMEDIAS_UPLOADS_SUCCESSFUL);
  336. }
  337. /**
  338. * Méthode qui déplace une ou plusieurs fichiers
  339. *
  340. * @param files liste des fichier à déplacer
  341. * @param src_dir répertoire source
  342. * @param dst_dir répertoire destination
  343. * @return boolean faux si erreur sinon vrai
  344. * @author Stephane F
  345. **/
  346. public function moveFiles($files, $src_dir, $dst_dir) {
  347. if($dst_dir=='.') $dst_dir='';
  348. $count = 0;
  349. foreach($files as $file) {
  350. # protection pour ne pas déplacer un fichier en dehors de $this->path.$this->dir
  351. $file=basename($file);
  352. # Déplacement du fichier
  353. if(is_readable($this->path.$src_dir.$file)) {
  354. $result = rename($this->path.$src_dir.$file, $this->path.$dst_dir.$file);
  355. $count++;
  356. }
  357. # Déplacement de la miniature
  358. $thumbName = plxUtils::thumbName($file);
  359. if($result AND is_readable($this->path.$src_dir.$thumbName)) {
  360. $result = rename($this->path.$src_dir.$thumbName, $this->path.$dst_dir.$thumbName);
  361. }
  362. # Déplacement de la vignette
  363. if($result AND is_readable($this->path.'.thumbs/'.$src_dir.$file)) {
  364. $result = rename($this->path.'.thumbs/'.$src_dir.$file, $this->path.'.thumbs/'.$dst_dir.$file);
  365. }
  366. }
  367. if(sizeof($files)==1) {
  368. if($count==0)
  369. return plxMsg::Error(L_PLXMEDIAS_MOVE_FILE_ERR);
  370. else
  371. return plxMsg::Info(L_PLXMEDIAS_MOVE_FILE_SUCCESSFUL);
  372. }
  373. else {
  374. if($count==0)
  375. return plxMsg::Error(L_PLXMEDIAS_MOVE_FILES_ERR);
  376. else
  377. return plxMsg::Info(L_PLXMEDIAS_MOVE_FILES_SUCCESSFUL);
  378. }
  379. }
  380. /**
  381. * Méthode qui recréer les miniatures
  382. *
  383. * @param files liste des fichier à déplacer
  384. * @param width largeur des miniatures
  385. * @param height hauteur des miniatures
  386. * @return boolean faux si erreur sinon vrai
  387. * @author Stephane F
  388. **/
  389. public function makeThumbs($files, $width, $height) {
  390. $count = 0;
  391. foreach($files as $file) {
  392. $file=basename($file);
  393. if(is_file($this->path.$this->dir.$file)) {
  394. $thumName = plxUtils::thumbName($file);
  395. $ext = strtolower(strrchr($this->path.$this->dir.$file,'.'));
  396. if(in_array($ext, array('.gif', '.jpg', '.png'))) {
  397. if(plxUtils::makeThumb($this->path.$this->dir.$file, $this->path.$this->dir.$thumName, $width, $height, 80))
  398. $count++;
  399. }
  400. }
  401. }
  402. if(sizeof($files)==1) {
  403. if($count==0)
  404. return plxMsg::Error(L_PLXMEDIAS_RECREATE_THUMB_ERR);
  405. else
  406. return plxMsg::Info(L_PLXMEDIAS_RECREATE_THUMB_SUCCESSFUL);
  407. }
  408. else {
  409. if($count==0)
  410. return plxMsg::Error(L_PLXMEDIAS_RECREATE_THUMBS_ERR);
  411. else
  412. return plxMsg::Info(L_PLXMEDIAS_RECREATE_THUMBS_SUCCESSFUL);
  413. }
  414. }
  415. }
  416. ?>