PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/source/src/PO/AdminBundle/Controller/FileController.php

https://bitbucket.org/posinsk/poadminbundle
PHP | 272 lines | 206 code | 42 blank | 24 comment | 19 complexity | 8b4be8bae51c36c49b75cbb7f2f9145f MD5 | raw file
  1. <?php
  2. namespace PO\AdminBundle\Controller;
  3. use PO\AdminBundle\Controller\MyController\MyController;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\Finder\Finder;
  9. use Symfony\Component\Validator\Constraints as Assert;
  10. /**
  11. * @Route("/files")
  12. */
  13. class FileController extends MyController {
  14. /**
  15. * @Route("/list", name="po_admin_file_list")
  16. * @Template()
  17. */
  18. public function listAction(Request $r) {
  19. $config = $this->getConfig();
  20. $access = $this->get('po.access');
  21. if(array_key_exists('secure', $config) &&
  22. !$access->checkAccess($config['secure']))
  23. return $this->redirect($this->generateUrl('po_admin_dashboard'));
  24. $files = array();
  25. $dirs = array();
  26. $currentPath = $r->get('path');
  27. $dir = $config['webdir'] . $currentPath;
  28. $fileFinder = new Finder();
  29. $fileFinder->files()->in($dir)->depth('== 0');
  30. $dirFinder = new Finder();
  31. $dirFinder->directories()->in($dir)->depth('== 0');
  32. //sorting
  33. $sort = $r->get('sort', 'name-DESC');
  34. $sort = explode('-', $sort);
  35. switch ($sort[0]) {
  36. default:
  37. case 'name':
  38. $fileFinder->sortByName();
  39. $dirFinder->sortByName();
  40. break;
  41. case 'time':
  42. $fileFinder->sortByModifiedTime();
  43. $dirFinder->sortByModifiedTime();
  44. break;
  45. }
  46. foreach ($fileFinder as $file) {
  47. $filename = $file->getFilename();
  48. $files[] = array(
  49. 'name' => $filename,
  50. 'size' => filesize($dir . '/' . $filename),
  51. 'mtime' => filemtime($dir . '/' . $filename)
  52. );
  53. }
  54. foreach ($dirFinder as $dir) {
  55. $dirs[] = array(
  56. 'name' => $dir->getFilename(),
  57. 'mtime' => filectime($dir . '/')
  58. );
  59. }
  60. if ($sort[1] == 'ASC')
  61. $files = array_reverse($files);
  62. else
  63. $dirs = array_reverse($dirs);
  64. $uploadForm = $this->getUploadForm($currentPath);
  65. $newdirForm = $this->getCreateDirForm($currentPath);
  66. return array(
  67. 'files' => $files,
  68. 'dirs' => $dirs,
  69. 'uploadForm' => $uploadForm->createView(),
  70. 'newdirForm' => $newdirForm->createView(),
  71. 'freeSpace' => disk_free_space('/'),
  72. 'config' => $config
  73. );
  74. }
  75. /**
  76. * @Route("/delete", name="po_admin_file_delete")
  77. */
  78. public function deleteAction(Request $r) {
  79. $config = $this->getConfig();
  80. $webDir = $config['webdir'];
  81. $dirs = $r->get('dir', array());
  82. $files = $r->get('file', array());
  83. if(!is_array($dirs)) $dirs = array($dirs);
  84. foreach($dirs as $dir){
  85. $this->getLogger()->setSubject($dir)->logDirRemove();
  86. $this->rmdirRecursive($webDir . '/' . substr($dir, 1));
  87. }
  88. if(!is_array($files)) $files = array($files);
  89. foreach($files as $file){
  90. $this->getLogger()->setSubject($file)->logFileRemove();
  91. unlink($webDir . '/' . substr($file, 1));
  92. }
  93. $referer = $r->headers->get('referer');
  94. return new RedirectResponse($referer);
  95. }
  96. public function rmdirRecursive($dir) {
  97. foreach (glob($dir . '/*') as $file) {
  98. if (is_dir($file))
  99. $this->rmdirRecursive($file);
  100. else
  101. unlink($file);
  102. }
  103. rmdir($dir);
  104. }
  105. /**
  106. * @Route("/upload", name="po_admin_file_upload")
  107. */
  108. public function uploadAction(Request $request) {
  109. $config = $this->getConfig();
  110. $form = $this->getUploadForm();
  111. if ($request->isMethod('POST')) {
  112. $form->bind($request);
  113. if ($form->isValid()) {
  114. $file = $form['file']->getData();
  115. $uploadedFilename = $file->getClientOriginalName();
  116. $path = $request->get('path') ? $request->get('path') : null;
  117. $webUpload = $config['webdir'] . '/' . $path;
  118. //look for a file with the same name and extension in upload dir
  119. $finder = new Finder();
  120. $finder->files()->in($webUpload);
  121. foreach ($finder as $fileI) {
  122. //if file found
  123. if ($fileI->getFilename() == $uploadedFilename) {
  124. $filename = explode('.', $uploadedFilename);
  125. //set new name
  126. $extension = $file->guessExtension();
  127. if (!$extension)
  128. $extension = 'bin';
  129. $uploadedFilename = $filename[0] . substr(uniqid(), 10, 3) . '.' . $extension;
  130. }
  131. }
  132. $file->move($config['dir'] . $form->get('path')->getData(), $uploadedFilename);
  133. $this->getLogger()->setSubject($form->get('path')->getData().'/'.$uploadedFilename)->logFileUpload();
  134. }else
  135. $this->get('session')->setFlash('notification', 'An error occured while uploading a file/creating a dir');
  136. }
  137. $referer = $request->headers->get('referer');
  138. return new RedirectResponse($referer);
  139. }
  140. /**
  141. * @Route("/details", name="po_admin_file_details")
  142. * @Template
  143. */
  144. public function detailsAction(Request $request) {
  145. if(!$request->query->has('path'))
  146. return $this->redirect($this->generateUrl('po_admin_file_list'));
  147. $config = $this->getConfig();
  148. $f = explode('/', $request->get('path'));
  149. $file = explode('.', array_pop($f));
  150. $name = array('name'=>$file[0]);
  151. $form = $this->createFormBuilder($name)
  152. ->add('name', 'text')
  153. ->getForm();
  154. if ($request->isMethod('POST')) {
  155. $form->bind($request);
  156. if ($form->isValid()) {
  157. $name = $form->get('name')->getData();
  158. $oldName = $request->get('path');
  159. $extension = count($file) > 1 ? '.'.$file[1] : null;
  160. $newName = implode('/', $f).'/'.$name.$extension;
  161. rename($config['webdir'].$oldName, $config['webdir'].$newName);
  162. $this->getLogger()->setSubject($oldName.' to '.$newName)->logFilenameChange();
  163. $this->get('session')->setFlash('notification', 'Item name changed!');
  164. }
  165. }
  166. return array('form' => $form->createView());
  167. }
  168. /**
  169. * @Route("/newdir", name="po_admin_file_newdir")
  170. */
  171. public function newDirAction(Request $request) {
  172. $config = $this->getConfig();
  173. $form = $this->getCreateDirForm();
  174. if ($request->isMethod('POST')) {
  175. $form->bind($request);
  176. if ($form->isValid()) {
  177. $path = $form->get('path')->getData();
  178. $dirName = $form->get('dir_name')->getData();
  179. mkdir($config['webdir'] . '/' . $path . '/' . $dirName);
  180. $this->getLogger()->setSubject($path . '/' . $dirName)->logDirCreate();
  181. }
  182. }
  183. $referer = $request->headers->get('referer');
  184. return new RedirectResponse($referer);
  185. }
  186. private function getUploadForm($path = null) {
  187. $config = $this->getConfig();
  188. $mimeTypes = array_key_exists('allowed_mime_types', $config) ? $config['allowed_mime_types'] : false;
  189. $maxSize = array_key_exists('file_max_size', $config) ? $config['file_max_size'] : false;
  190. $fileConstraints = array();
  191. if($mimeTypes) $fileConstraints['mimeTypes'] = $mimeTypes;
  192. if($maxSize) $fileConstraints['maxSize'] = $maxSize;
  193. $form = $this->createFormBuilder(array('path' => $path), array(
  194. 'cascade_validation' => true
  195. ))
  196. ->add('file', 'file', array(
  197. 'constraints' => array(
  198. new Assert\NotBlank(),
  199. new Assert\File($fileConstraints)
  200. )))
  201. ->add('path', 'hidden', array(
  202. 'constraints' => array(
  203. new Assert\Length(array('min' => 1)),
  204. )))
  205. ->getForm();
  206. return $form;
  207. }
  208. private function getCreateDirForm($path = null) {
  209. $form = $this->createFormBuilder(array('path' => $path), array(
  210. 'cascade_validation' => true
  211. ))
  212. ->add('dir_name', 'text', array(
  213. 'constraints' => array(
  214. new Assert\NotBlank(),
  215. )))
  216. ->add('path', 'hidden', array(
  217. 'constraints' => array(
  218. new Assert\Length(array('min' => 1)),
  219. )))
  220. ->getForm();
  221. return $form;
  222. }
  223. private function getConfig() {
  224. $adminConfig = $this->container->getParameter('admin');
  225. $config = $adminConfig['upload'];
  226. $webDir = array_key_exists('webdir', $config) ? '/' . $config['webdir'] : null;
  227. $config['webdir'] = $this->get('kernel')->getRootDir() . $webDir . '/' . $config['dir'];
  228. return $config;
  229. }
  230. }