XCL Web Application Platform 2.5.0
The XoopsCube Legacy Project
Loading...
Searching...
No Matches
AvatarUploadAction.class.php
1<?php
2
3if (!defined('XOOPS_ROOT_PATH')) {
4 exit();
5}
6
7require_once XOOPS_MODULE_PATH . '/user/class/AbstractEditAction.class.php';
8require_once XOOPS_MODULE_PATH . '/user/admin/forms/AvatarUploadForm.class.php';
9
10class User_AvatarUploadAction extends User_Action
11{
12 public $mActionForm = null;
13 public $mErrorMessages = [];
14 public $mAllowedExts = ['gif' =>'image/gif', 'jpg' =>'image/jpeg', 'jpeg' =>'image/jpeg', 'png' =>'image/png'];
15
16 //public function prepare(&$controller, &$xoopsUser)
17 public function prepare(&$controller, &$xoopsUser, $moduleConfig)
18 {
19 $this->mActionForm =new User_AvatarUploadForm();
20 $this->mActionForm->prepare();
21 }
22
23 public function getDefaultView(&$controller, &$xoopsUser)
24 {
25 return USER_FRAME_VIEW_INPUT;
26 }
27
28 public function _addErrorMessage($msg)
29 {
30 $this->mErrorMessages[] = $msg;
31 }
32
33 public function execute(&$controller, &$xoopsUser)
34 {
35 $form_cancel = $controller->mRoot->mContext->mRequest->getRequest('_form_control_cancel');
36 if (null != $form_cancel) {
37 return USER_FRAME_VIEW_CANCEL;
38 }
39
40 $this->mActionForm->fetch();
41 $this->mActionForm->validate();
42
43 if ($this->mActionForm->hasError()) {
44 return $this->getDefaultView($controller, $xoopsUser);
45 }
46
47 $formFile = $this->mActionForm->get('upload');
48 $formFileExt = $formFile->getExtension();
49 $files = [];
50 $avatarimages = [];
51
52 if ('zip' == strtolower($formFileExt)) {
53 if (!file_exists(XOOPS_ROOT_PATH . '/class/Archive_Zip.php')) {
54 return USER_FRAME_VIEW_ERROR;
55 }
56 require_once XOOPS_ROOT_PATH . '/class/Archive_Zip.php';
57 $zip = new Archive_Zip($formFile->_mTmpFileName) ;
58 $files = $zip->extract(['extract_as_string' => true]) ;
59 if (! is_array(@$files)) {
60 return USER_FRAME_VIEW_ERROR;
61 }
62 if (!$this->_fetchZipAvatarImages($files, $avatarimages)) {
63 return USER_FRAME_VIEW_ERROR;
64 }
65 }//if zip end
66 else {
67 require_once XOOPS_ROOT_PATH . '/class/class.tar.php';
68 $tar =new tar();
69 $tar->openTar($formFile->_mTmpFileName);
70 if (!is_array(@$tar->files)) {
71 return USER_FRAME_VIEW_ERROR;
72 }
73 if (!$this->_fetchTarAvatarImages($tar->files, $avatarimages)) {
74 return USER_FRAME_VIEW_ERROR;
75 }
76 }//end tar
77
78 if (!$this->_saveAvatarImages($avatarimages)) {
79 return USER_FRAME_VIEW_ERROR;
80 }
81 return USER_FRAME_VIEW_SUCCESS;
82 }
83
84 public function _fetchZipAvatarImages(&$files, &$avatarimages)
85 {
86 foreach ($files as $file) {
87 $file_pos = strrpos($file['filename'], '/') ;
88 if (false !== $file_pos) {
89 $file['filename'] = substr($file['filename'], $file_pos+1);
90 }
91 if (!empty($file['filename']) && preg_match("/(.*)\.(gif|jpg|jpeg|png)$/i", $file['filename'], $match) && !preg_match('/[' . preg_quote('\/:*?"<>|', '/') . ']/', $file['filename'])) {
92 $avatarimages[] = ['name' => $file['filename'], 'content' => $file['content']];
93 }
94 unset($file);
95 }
96 return true;
97 }
98
99 public function _fetchTarAvatarImages(&$files, &$avatarimages)
100 {
101 foreach ($files as $id => $info) {
102 $file_pos = strrpos($info['name'], '/') ;
103 if (false !== $file_pos) {
104 $info['name'] = substr($info['name'], $file_pos+1);
105 }
106 if (!empty($info['name']) && preg_match("/(.*)\.(gif|jpg|jpeg|png)$/i", $info['name'], $match) && !preg_match('/[' . preg_quote('\/:*?"<>|', '/') . ']/', $info['name'])) {
107 $avatarimages[] = ['name' => $info['name'], 'content' => $info['file']];
108 }
109 unset($info);
110 }
111 return true;
112 }
113
114 public function _saveAvatarImages(&$avatarimages)
115 {
116 if (0 == (is_countable($avatarimages) ? count($avatarimages) : 0)) {
117 return true;
118 }
119
120 $avatarhandler =& xoops_getmodulehandler('avatar');
121
122 for ($i = 0; $i < (is_countable($avatarimages) ? count($avatarimages) : 0); $i++) {
123 $ext_pos = strrpos($avatarimages[$i]['name'], '.') ;
124 if (false === $ext_pos) {
125 continue ;
126 }
127 $ext = strtolower(substr($avatarimages[$i]['name'], $ext_pos + 1)) ;
128 if (empty($this->mAllowedExts[$ext])) {
129 continue ;
130 }
131 $file_name = substr($avatarimages[$i]['name'], 0, $ext_pos) ;
132 $save_file_name = uniqid('savt') . '.' . $ext ;
133 $filehandle = fopen(XOOPS_UPLOAD_PATH.'/'.$save_file_name, 'w') ;
134 if (! $filehandle) {
135 $this->_addErrorMessage(XCube_Utils::formatString(_AD_USER_ERROR_COULD_NOT_SAVE_AVATAR_FILE, $file_name));
136 continue ;
137 }
138 if (!@fwrite($filehandle, $avatarimages[$i]['content'])) {
139 $this->_addErrorMessage(XCube_Utils::formatString(_AD_USER_ERROR_COULD_NOT_SAVE_AVATAR_FILE, $file_name));
140 @fclose($filehandle) ;
141 continue;
142 };
143 @fclose($filehandle) ;
144
145 $avatar =& $avatarhandler->create();
146 $avatar->set('avatar_name', $file_name);
147 $avatar->set('avatar_file', $save_file_name);
148 $avatar->set('avatar_display', 1);
149 $avatar->set('avatar_weight', 0);
150 $avatar->set('avatar_type', 'S');
151 $avatar->set('avatar_mimetype', $this->mAllowedExts[$ext]);
152
153 if (!$avatarhandler->insert($avatar)) {
154 $this->_addErrorMessage(XCube_Utils::formatString(_AD_USER_ERROR_COULD_NOT_SAVE_AVATAR_FILE, $file_name));
155 }
156 unset($avatar);
157 }
158
159 return true;
160 }
161
162 public function executeViewInput(&$controller, &$xoopsUser, &$render)
163 {
164 $render->setTemplateName('avatar_upload.html');
165 $render->setAttribute('actionForm', $this->mActionForm);
166 }
167
168 public function executeViewSuccess(&$controller, &$xoopsUser, &$render)
169 {
170 $controller->executeForward('./index.php?action=AvatarList');
171 }
172
173 public function executeViewError(&$controller, &$xoopsUser, &$render)
174 {
175 if (0 == count($this->mErrorMessages)) {
176 $controller->executeRedirect('./index.php?action=AvatarList', 1, _AD_USER_ERROR_DBUPDATE_FAILED);
177 } else {
178 $render->setTemplateName('avatar_upload_error.html');
179 $render->setAttribute('errorMessages', $this->mErrorMessages);
180 }
181 }
182
183 public function executeViewCancel(&$controller, &$xoopsUser, &$render)
184 {
185 $controller->executeForward('./index.php?action=AvatarList');
186 }
187}
static formatString()
[Static] Formats string with special care for international.