files.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <?php
  2. //define(MAX_FILES_TO_SORT, 5);
  3. //define(LISTING_TIMEOUT, 0.000001);
  4. define(LISTING_TIMEOUT, 5);
  5. //echo 'files: ';
  6. //$files = scandir(__DIR__);
  7. //echo '<pre>';
  8. //print_r($files);
  9. //$_REQUEST['sort_field'] = 'size';
  10. $_REQUEST['sort_field'] = 'name';
  11. //$_REQUEST['sort_field'] = 'atime';
  12. //$_REQUEST['sort_field'] = 'mtime';
  13. $_REQUEST['sort_desc'] = 1;
  14. /*
  15. +- copy file / dir [ recursive ]
  16. +- rename(move) file / dir
  17. +- delete file / dir [ recursive ]
  18. +- chmod file / dir
  19. +- chown file / dir
  20. +- create file
  21. +- create dir
  22. */
  23. switch($_REQUEST['action']) {
  24. case 'copy': fm_copy($_REQUEST['source'], $_REQUEST['dest']); break;
  25. case 'rename': fm_rename($_REQUEST['source'], $_REQUEST['dest']); break;
  26. case 'delete': fm_delete($_REQUEST['source']); break;
  27. case 'chmod': fm_chmod($_REQUEST['source'], $_REQUEST['mode']); break;
  28. case 'chown': fm_chown($_REQUEST['source'], $_REQUEST['uid'], $_REQUEST['gid']); break;
  29. case 'create_file': fm_create_file($_REQUEST['source'], $_REQUEST['mode'] || FALSE); break;
  30. case 'create_dir': fm_create_dir($_REQUEST['source'], $_REQUEST['mode'] || FALSE); break;
  31. default:
  32. $pwd = $_REQUEST['path'] ? $_REQUEST['path'] : __DIR__;
  33. $listing = dir_list($pwd, $_REQUEST['sort_field']);
  34. $writable = is_writable($pwd);
  35. $pwd = array_merge(array('/'), explode('/', trim($pwd, '/')));
  36. include('templates/filemanager.php');
  37. break;
  38. }
  39. //echo $_GET['sort_field'];
  40. // if(in_array($_GET['sort_field'], $available_sort_fields)){
  41. // echo '1';
  42. // }
  43. /*
  44. upload_file
  45. + list_dir
  46. +- copy file / dir [ recursive ]
  47. +- rename(move) file / dir
  48. +- delete file / dir [ recursive ]
  49. +- chmod file / dir
  50. +- chown file / dir
  51. +- create file
  52. +- create dir
  53. view file / image
  54. download file / image
  55. */
  56. function fm_create_file($filename)
  57. {
  58. if(is_file($filename))
  59. return array('error' => 'file exists', 'code' => 1);
  60. return (bool) fopen($filename, 'w'); // (bool) > !!, sorry
  61. }
  62. function fm_create_dir($dirname)
  63. {
  64. if(is_dir($filename))
  65. return array('error' => 'directory exists', 'code' => 1);
  66. // TODO set parent directory mode
  67. return mkdir($dirname);
  68. }
  69. function fm_chown($filename, $recursive = 0, $uid = FALSE, $gid = FALSE)
  70. {
  71. if (is_dir($filename) && $recursive) {
  72. $dir_handle = opendir($dir);
  73. while ($item = readdir($dir_handle)) {
  74. if (!in_array($item, array('.','..'))) {
  75. $new_item = $filename.'/'.$item;
  76. if ($uid !== FALSE) chown($new_item, (int)$uid);
  77. if ($gid !== FALSE) chgrp($new_item, (int)$gid);
  78. if (is_dir($new_item)) {
  79. fm_chown($new_item, $recursive, $uid, $gid);
  80. }
  81. }
  82. }
  83. } else {
  84. if($uid !== FALSE) chown($filename, (int)$uid);
  85. if($gid !== FALSE) chgrp($filename, (int)$gid);
  86. }
  87. }
  88. function fm_chmod($filename, $recursive = 0, $mode)
  89. {
  90. if(is_dir($filename) && $recursive) {
  91. $dir_handle = opendir($dir);
  92. while ($item = readdir($dir_handle)) {
  93. if (!in_array($item, array('.','..'))) {
  94. $new_item = $filename.'/'.$item;
  95. chmod($new_item, octdec($mode));
  96. if (is_dir($new_item)) {
  97. fm_chmod($new_item, $recursive, $mode);
  98. }
  99. }
  100. }
  101. } else {
  102. chmod($filename, octdec($mode));
  103. }
  104. }
  105. function fm_delete($filename)
  106. {
  107. if(is_dir($filename)){
  108. foreach (
  109. $iterator = new RecursiveIteratorIterator(
  110. new RecursiveDirectoryIterator($filename, RecursiveDirectoryIterator::SKIP_DOTS),
  111. RecursiveIteratorIterator::SELF_FIRST) as $item
  112. ) {
  113. if ($item->isDir()) {
  114. rmdir($item);
  115. // mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(), decoct(fileperms($item->getPerms())));
  116. } else {
  117. unlink($item);
  118. // copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  119. }
  120. }
  121. } else {
  122. return unlink($filename);
  123. }
  124. }
  125. function fm_rename($source, $dest)
  126. {
  127. return rename($source, $dest);
  128. }
  129. function fm_copy($source, $dest)
  130. {
  131. if (is_dir($source)) {
  132. foreach (
  133. $iterator = new RecursiveIteratorIterator(
  134. new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
  135. RecursiveIteratorIterator::SELF_FIRST) as $item
  136. ) {
  137. if ($item->isDir()) {
  138. // TODO set dir perms
  139. mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(), decoct(fileperms($item->getPerms())));
  140. } else {
  141. copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  142. }
  143. }
  144. }else{
  145. return copy($source, $dest);
  146. }
  147. }
  148. function list_dir()
  149. {
  150. $dir_iterator = new RecursiveDirectoryIterator("/path");
  151. $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
  152. // could use CHILD_FIRST if you so wish
  153. foreach ($iterator as $file) {
  154. echo $file, "\n";
  155. }
  156. $size = 0;
  157. foreach ($iterator as $file) {
  158. if ($file->isFile()) {
  159. echo substr($file->getPathname(), 27) . ": " . $file->getSize() . " B; modified " . date("Y-m-d", $file->getMTime()) . "\n";
  160. $size += $file->getSize();
  161. }
  162. }
  163. echo "\nTotal file size: ", $size, " bytes\n";
  164. }
  165. /// fast removing directory
  166. function rmrf($dir)
  167. {
  168. foreach (glob($dir) as $file) {
  169. if (is_dir($file)) {
  170. rmrf("$file/*");
  171. rmdir($file);
  172. } else {
  173. unlink($file);
  174. }
  175. }
  176. }
  177. function dir_list($dir, $sort = 0)
  178. {
  179. $sort_order_for_filename = SORT_ASC;
  180. //$available_sort_fields = array('size, type', 'mtime', 'atime', 'owner', 'group');
  181. $available_sort_fields = array('name', 'size', 'type', 'mtime', 'atime', 'owner', 'group');
  182. $sort_order = SORT_ASC;
  183. if ($dir[strlen($dir)-1] != '/') $dir .= '/';
  184. if (!is_dir($dir)) return array();
  185. $start = microtime(TRUE);
  186. $listing = array('dirs' => array(), 'files' => array(), 'dir_names' => array(), 'file_names' => array() ,'count' => 0, 'timeout_exeeded' => 0, 'time' => 0);
  187. $dir_handle = opendir($dir);
  188. $dir_objects = array();
  189. while ($object = readdir($dir_handle)){
  190. if (!in_array($object, array('.','..'))){
  191. $filename = $dir . $object;
  192. $time = microtime(true) - $start;
  193. if ($time <= LISTING_TIMEOUT) {
  194. $stats = stat($filename);
  195. $mode = explain_mode($stats['mode']);
  196. $perms = decoct(fileperms($filename));
  197. $item = array(
  198. 'name' => $object,
  199. 'size' => $stats['size'],
  200. 'mode' => array('owner' => $mode['owner'], 'group' => $mode['owner'], 'other' => $mode['owner']),
  201. 'perms' => decoct($stats['mode']),
  202. 'type' => $mode['type'],
  203. 'mtime' => $stats['mtime'],
  204. 'atime' => $stats['atime'],
  205. 'mdate_human' => date("Y F d", $stats['mtime']),
  206. 'mtime_human' => date("H:i:s", $stats['mtime']),
  207. 'adate_human' => date("Y F d", $stats['atime']),
  208. 'atime_human' => date("H:i:s", $stats['atime']),
  209. 'nlink' => $stats['nlink'],
  210. 'owner' => posix_getpwuid($stats['uid'])['name'],
  211. 'group' => posix_getgrgid($stats['gid'])['name']
  212. );
  213. }else{
  214. $listing['timeout_exeeded'] = TRUE;
  215. if (is_dir($filename)) {
  216. $type = 'd';
  217. } else {
  218. $type = '-';
  219. }
  220. $item = array(
  221. 'name' => $object,
  222. 'size' => FALSE,
  223. 'mode' => array('owner' => FALSE, 'group' => FALSE, 'other' => FALSE),
  224. 'type' => $type,
  225. 'mtime' => FALSE,
  226. 'atime' => FALSE,
  227. 'mdate_human' => FALSE,
  228. 'mtime_human' => FALSE,
  229. 'adate_human' => FALSE,
  230. 'atime_human' => FALSE,
  231. 'nlink' => FALSE,
  232. 'owner' => FALSE,
  233. 'group' => FALSE
  234. );
  235. }
  236. $listing['count']++;
  237. if($item['type'] == 'd'){
  238. $listing['dirs'][] = $item;
  239. $listing['dir_names'][] = $item['name'];
  240. }else{
  241. if($sort && !$listing['timeout_exeeded']){
  242. $listing[$sort][] = $item[$sort];
  243. }
  244. $listing['files'][] = $item;
  245. $listing['file_names'][] = $item['name'];
  246. }
  247. }
  248. }
  249. $listing['time'] = microtime(TRUE) - $start;
  250. if(!$listing['timeout_exeeded']){
  251. if(in_array($_REQUEST['sort_field'], $available_sort_fields)){
  252. if($_REQUEST['sort_desc']){
  253. $sort_order = SORT_DESC;
  254. }
  255. array_multisort($listing[$_REQUEST['sort_field']], $sort_order, $listing['file_names'], $sort_order_for_filename, $listing['files']);
  256. }
  257. array_multisort($listing['dir_names'], $sort_order_for_filename, $listing['dirs']);
  258. }
  259. return $listing;
  260. }
  261. function explain_mode($mode)
  262. {
  263. $info = array();
  264. if (($mode & 0xC000) == 0xC000) { $info['type'] = 's'; }
  265. elseif (($mode & 0xA000) == 0xA000) { $info['type'] = 'l'; }
  266. elseif (($mode & 0x8000) == 0x8000) { $info['type'] = '-'; }
  267. elseif (($mode & 0x6000) == 0x6000) { $info['type'] = 'b'; }
  268. elseif (($mode & 0x4000) == 0x4000) { $info['type'] = 'd'; }
  269. elseif (($mode & 0x2000) == 0x2000) { $info['type'] = 'c'; }
  270. elseif (($mode & 0x1000) == 0x1000) { $info['type'] = 'p'; }
  271. else { $info['type'] = 'u'; }
  272. $info['owner'] = (($mode & 0x0100) ? 'r' : '-');
  273. $info['owner'] .= (($mode & 0x0080) ? 'w' : '-');
  274. $info['owner'] .= (($mode & 0x0040) ? (($mode & 0x0800) ? 's' : 'x' ) : (($mode & 0x0800) ? 'S' : '-'));
  275. // group
  276. $info['group'] = (($mode & 0x0020) ? 'r' : '-');
  277. $info['group'] .= (($mode & 0x0010) ? 'w' : '-');
  278. $info['group'] .= (($mode & 0x0008) ? (($mode & 0x0400) ? 's' : 'x' ) : (($mode & 0x0400) ? 'S' : '-'));
  279. // other
  280. $info['other'] = (($mode & 0x0004) ? 'r' : '-');
  281. $info['other'] .= (($mode & 0x0002) ? 'w' : '-');
  282. $info['other'] .= (($mode & 0x0001) ? (($mode & 0x0200) ? 't' : 'x' ) : (($mode & 0x0200) ? 'T' : '-'));
  283. return $info;
  284. }