PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/models/behaviors/brw_upload.php

http://github.com/plusglobal/BrowniePHP
PHP | 188 lines | 161 code | 26 blank | 1 comment | 37 complexity | 4952e58302db5d5df2a0fe038ab13e54 MD5 | raw file
  1. <?php
  2. class BrwUploadBehavior extends ModelBehavior {
  3. var $max_upload_size = 0;
  4. var $extensions = array('png', 'jpg', 'gif', 'jpeg');
  5. var $excluded_extensions = array('php');
  6. function setup($Model, $config = array()) {
  7. $this->max_upload_size = 50 * 1024 * 1024;
  8. }
  9. function beforeValidate($Model) {
  10. $kB = round($this->max_upload_size / 1024, 2);
  11. $mB = round($this->max_upload_size / (1024 * 1024), 2);
  12. $Model->validate = array (
  13. 'file' => array (
  14. 'valid_size' => array(
  15. 'rule' => array('validateSizeFile'),
  16. 'message' => sprintf(__d('brownie', 'File too heavy. Maximum allowed: %s KB (%s MB)', true), $kB, $mB)
  17. ),
  18. ),
  19. );
  20. if ($Model->alias == 'BrwImage') {
  21. $Model->validate['file']['valid_image'] = array(
  22. 'rule' => array('validateImageFile'),
  23. 'message' => __d('brownie', 'Invalid image. Only jpg, gif and png are allowed.', true),
  24. );
  25. }
  26. $Model->data[$Model->alias]['name'] = null;
  27. if (!empty($Model->data[$Model->alias]['file'])) {
  28. if (is_array($Model->data[$Model->alias]['file'])) {
  29. //the image was uploaded
  30. switch ($Model->data[$Model->alias]['file']['error']) {
  31. case 0:
  32. $Model->data[$Model->alias]['name'] = $Model->data[$Model->alias]['file']['name'];
  33. $Model->data[$Model->alias]['file'] = $Model->data[$Model->alias]['file']['tmp_name'];
  34. break;
  35. case 4:
  36. $Model->data[$Model->alias]['file'] = '';
  37. break;
  38. }
  39. } elseif(is_string($Model->data[$Model->alias]['file'])) {
  40. $Model->data[$Model->alias]['name'] = end(explode(DS, $Model->data[$Model->alias]['file']));
  41. if ($Model->data[$Model->alias]['file'][0] == '/') {
  42. $Model->data[$Model->alias]['file'] = substr($Model->data[$Model->alias]['file'], 1);
  43. }
  44. }
  45. $Model->data[$Model->alias]['name'] = $this->_cleanFileName($Model->data[$Model->alias]['name']);
  46. }
  47. }
  48. function beforeSave($Model) {
  49. $updating = !empty($Model->data[$Model->alias]['id']);
  50. $file_changed = !empty($Model->data[$Model->alias]['file']);
  51. if ($updating) {
  52. if($file_changed) {
  53. $image = array_shift($Model->findById($Model->id));
  54. $Model->data['name_prev'] = $image['name'];
  55. } else {
  56. unset($Model->data[$Model->alias]['name']);
  57. return true;
  58. }
  59. }
  60. if (empty($Model->data[$Model->alias]['name'])) {
  61. return false;
  62. }
  63. return true;
  64. }
  65. function afterSave($Model, $created) {
  66. $file_changed = !empty($Model->data[$Model->alias]['file']);
  67. if ($file_changed) {
  68. $model = $Model->data[$Model->alias]['model'];
  69. $source = $Model->data[$Model->alias]['file'];
  70. $dest_dir = WWW_ROOT . 'uploads' . DS . $model . DS . $Model->data[$Model->alias]['record_id'];
  71. $dest = $dest_dir . DS . $Model->data[$Model->alias]['name'];
  72. $updating = !empty($Model->data[$Model->alias]['id']);
  73. if ($updating and $file_changed) {
  74. $this->_deleteFiles($model, $Model->data[$Model->alias]['record_id'], $Model->data['name_prev']);
  75. }
  76. if (!is_dir($dest_dir)) {
  77. if (!mkdir($dest_dir, 0777, true)) {
  78. $this->log('BrowniePHP: unable to create dir ' . $dest_dir);
  79. } else {
  80. chmod($dest_dir, 0777);
  81. }
  82. }
  83. if ($this->_copy($Model, $source, $dest)) {
  84. chmod($dest, 0777);
  85. }
  86. }
  87. }
  88. function _copy($Model, $source, $dest) {
  89. $newDest = $dest;
  90. while (is_file($newDest)) {
  91. $parts = explode(DS, $newDest);
  92. $file = '_' . array_pop($parts);
  93. $newDest = join(DS, $parts) . DS . $file;
  94. }
  95. if (copy($source, $newDest)) {
  96. if($newDest != $dest) {
  97. return $Model->save(array('id' => $Model->id, 'name' => $file), array('callbacks' => false, 'validate' => false));
  98. } else {
  99. return true;
  100. }
  101. } else {
  102. return false;
  103. }
  104. }
  105. function beforeDelete($Model) {
  106. $image = $Model->read();
  107. $image = array_shift($image);
  108. $this->_deleteFiles($image['model'], $image['record_id'], $image['name']);
  109. }
  110. function _deleteFiles($model, $record, $filename) {
  111. $baseFilePath = WWW_ROOT . 'uploads' . DS . $model . DS . $record;
  112. $filePath = $baseFilePath . DS . $filename;
  113. if (is_file($filePath)) {
  114. unlink($filePath);
  115. }
  116. if (is_dir($baseFilePath)) {
  117. if (count(scandir($baseFilePath)) <= 2) {
  118. rmdir($baseFilePath);
  119. }
  120. }
  121. $baseCacheDir = WWW_ROOT . 'uploads' . DS . 'thumbs' . DS . $model;
  122. if(is_dir($baseCacheDir)) {
  123. $handle = opendir($baseCacheDir);
  124. while ($sizeDir = readdir($handle)) {
  125. if(is_dir($baseCacheDir . DS . $sizeDir)) {
  126. $fileToDelete = $baseCacheDir . DS . $sizeDir . DS . $record . DS . $filename;
  127. if (is_file($fileToDelete)) {
  128. unlink($fileToDelete);
  129. }
  130. }
  131. }
  132. }
  133. }
  134. function validateSizeFile($Model, $data) {
  135. if (empty($Model->data[$Model->alias]['file'])) {
  136. return true;
  137. }
  138. if (substr($Model->data[$Model->alias]['file'], 0, 7) == 'http://') {
  139. $filesize = 0;
  140. } else {
  141. $filesize = filesize($Model->data[$Model->alias]['file']);
  142. }
  143. if ($filesize > $this->max_upload_size) {
  144. return false;
  145. } else {
  146. return true;
  147. }
  148. }
  149. function validateImageFile($Model, $data) {
  150. if (empty($Model->data[$Model->alias]['file'])) {
  151. return true;
  152. }
  153. return getimagesize($Model->data[$Model->alias]['file']);
  154. }
  155. function _cleanFileName($filename) {
  156. $parts = explode('.', $filename);
  157. foreach ($parts as $key => $part) {
  158. $parts[$key] = Inflector::slug($part, '-');
  159. }
  160. return join('.', $parts);
  161. }
  162. }