ProcessFile.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace Typemill\Models;
  3. use Slim\Http\UploadedFile;
  4. use Typemill\Models\Helpers;
  5. use \URLify;
  6. class ProcessFile extends ProcessAssets
  7. {
  8. /**
  9. * Moves the uploaded file to the upload directory. Only used for settings / NON VUE.JS uploads
  10. *
  11. * @param string $directory directory to which the file is moved
  12. * @param UploadedFile $uploadedFile file uploaded file to move
  13. * @return string filename of moved file
  14. */
  15. public function moveUploadedFile(UploadedFile $uploadedFile, $overwrite = false, $name = false)
  16. {
  17. $this->setFileName($uploadedFile->getClientFilename(), 'file');
  18. if($name)
  19. {
  20. $this->setFileName($name . '.' . $this->extension, 'file', $overwrite);
  21. }
  22. $uploadedFile->moveTo($this->fileFolder . $this->getFullName());
  23. return $this->getFullName();
  24. }
  25. public function storeFile($file, $name)
  26. {
  27. $this->setFileName($name, 'file');
  28. $this->clearTempFolder();
  29. $file = $this->decodeFile($file);
  30. $path = $this->tmpFolder . $this->getFullName();
  31. if(file_put_contents($path, $file))
  32. {
  33. $size = filesize($path);
  34. $size = $this->formatSizeUnits($size);
  35. $title = str_replace('-', ' ', $this->filename);
  36. $title = $title . ' (' . strtoupper($this->extension) . ', ' . $size .')';
  37. return ['title' => $title, 'name' => $this->filename, 'extension' => $this->extension, 'size' => $size, 'url' => 'media/files/' . $this->getFullName()];
  38. }
  39. return false;
  40. }
  41. public function publishFile()
  42. {
  43. $files = scandir($this->tmpFolder);
  44. $success = true;
  45. foreach($files as $file)
  46. {
  47. if (!in_array($file, array(".","..")))
  48. {
  49. $success = rename($this->tmpFolder . $file, $this->fileFolder . $file);
  50. }
  51. }
  52. return $success;
  53. }
  54. public function decodeFile(string $file)
  55. {
  56. $fileParts = explode(";base64,", $file);
  57. $fileType = explode("/", $fileParts[0]);
  58. $fileData = base64_decode($fileParts[1]);
  59. if ($fileData !== false)
  60. {
  61. return array("file" => $fileData, "type" => $fileType[1]);
  62. }
  63. return false;
  64. }
  65. public function deleteFile($name)
  66. {
  67. # validate name
  68. $name = basename($name);
  69. if(file_exists($this->fileFolder . $name) && unlink($this->fileFolder . $name))
  70. {
  71. return true;
  72. }
  73. return false;
  74. }
  75. public function deleteFileWithName($name)
  76. {
  77. # e.g. delete $name = 'logo';
  78. $name = basename($name);
  79. if($name != '' && !in_array($name, array(".","..")))
  80. {
  81. foreach(glob($this->fileFolder . $name . '.*') as $file)
  82. {
  83. unlink($file);
  84. }
  85. }
  86. }
  87. /*
  88. * scans content of a folder (without recursion)
  89. * vars: folder path as string
  90. * returns: one-dimensional array with names of folders and files
  91. */
  92. public function scanFilesFlat()
  93. {
  94. $files = scandir($this->fileFolder);
  95. $filelist = array();
  96. foreach ($files as $key => $name)
  97. {
  98. if (!in_array($name, array(".","..")) && file_exists($this->fileFolder . $name))
  99. {
  100. $filelist[] = [
  101. 'name' => $name,
  102. 'timestamp' => filemtime($this->fileFolder . $name),
  103. 'info' => pathinfo($this->fileFolder . $name),
  104. 'url' => 'media/files/' . $name,
  105. ];
  106. }
  107. }
  108. $filelist = Helpers::array_sort($filelist, 'timestamp', SORT_DESC);
  109. return $filelist;
  110. }
  111. public function getFileDetails($name, $structure)
  112. {
  113. $name = basename($name);
  114. if (!in_array($name, array(".","..")) && file_exists($this->fileFolder . $name))
  115. {
  116. $filedetails = [
  117. 'name' => $name,
  118. 'timestamp' => filemtime($this->fileFolder . $name),
  119. 'bytes' => filesize($this->fileFolder . $name),
  120. 'info' => pathinfo($this->fileFolder . $name),
  121. 'url' => 'media/files/' . $name,
  122. 'pages' => $this->findPagesWithUrl($structure, $name, $result = [])
  123. ];
  124. return $filedetails;
  125. }
  126. return false;
  127. }
  128. }