1
2 #ifdef HAVE_CONFIG_H
3 #include "../../../ext_config.h"
4 #endif
5
6 #include <php.h>
7 #include "../../../php_ext.h"
8 #include "../../../ext.h"
9
10 #include <Zend/zend_operators.h>
11 #include <Zend/zend_exceptions.h>
12 #include <Zend/zend_interfaces.h>
13
14 #include "kernel/main.h"
15 #include "kernel/object.h"
16 #include "kernel/array.h"
17 #include "kernel/memory.h"
18 #include "kernel/fcall.h"
19 #include "kernel/operators.h"
20 #include "ext/spl/spl_exceptions.h"
21 #include "kernel/exception.h"
22
23
24 /**
25 * Phalcon\Http\Request\File
26 *
27 * Provides OO wrappers to the $_FILES superglobal
28 *
29 *<code>
30 * use Phalcon\Mvc\Controller;
31 *
32 * class PostsController extends Controller
33 * {
34 * public function uploadAction()
35 * {
36 * // Check if the user has uploaded files
37 * if ($this->request->hasFiles() == true) {
38 * // Print the real file names and their sizes
39 * foreach ($this->request->getUploadedFiles() as $file) {
40 * echo $file->getName(), " ", $file->getSize(), "\n";
41 * }
42 * }
43 * }
44 * }
45 *</code>
46 */
ZEPHIR_INIT_CLASS(Phalcon_Http_Request_File)47 ZEPHIR_INIT_CLASS(Phalcon_Http_Request_File) {
48
49 ZEPHIR_REGISTER_CLASS(Phalcon\\Http\\Request, File, phalcon, http_request_file, phalcon_http_request_file_method_entry, 0);
50
51 zend_declare_property_null(phalcon_http_request_file_ce, SL("_name"), ZEND_ACC_PROTECTED TSRMLS_CC);
52
53 zend_declare_property_null(phalcon_http_request_file_ce, SL("_tmp"), ZEND_ACC_PROTECTED TSRMLS_CC);
54
55 zend_declare_property_null(phalcon_http_request_file_ce, SL("_size"), ZEND_ACC_PROTECTED TSRMLS_CC);
56
57 zend_declare_property_null(phalcon_http_request_file_ce, SL("_type"), ZEND_ACC_PROTECTED TSRMLS_CC);
58
59 zend_declare_property_null(phalcon_http_request_file_ce, SL("_realType"), ZEND_ACC_PROTECTED TSRMLS_CC);
60
61 /**
62 * @var string|null
63 */
64 zend_declare_property_null(phalcon_http_request_file_ce, SL("_error"), ZEND_ACC_PROTECTED TSRMLS_CC);
65
66 /**
67 * @var string|null
68 */
69 zend_declare_property_null(phalcon_http_request_file_ce, SL("_key"), ZEND_ACC_PROTECTED TSRMLS_CC);
70
71 /**
72 * @var string
73 */
74 zend_declare_property_null(phalcon_http_request_file_ce, SL("_extension"), ZEND_ACC_PROTECTED TSRMLS_CC);
75
76 zend_class_implements(phalcon_http_request_file_ce TSRMLS_CC, 1, phalcon_http_request_fileinterface_ce);
77 return SUCCESS;
78
79 }
80
81 /**
82 */
PHP_METHOD(Phalcon_Http_Request_File,getError)83 PHP_METHOD(Phalcon_Http_Request_File, getError) {
84
85
86
87 RETURN_MEMBER(getThis(), "_error");
88
89 }
90
91 /**
92 */
PHP_METHOD(Phalcon_Http_Request_File,getKey)93 PHP_METHOD(Phalcon_Http_Request_File, getKey) {
94
95
96
97 RETURN_MEMBER(getThis(), "_key");
98
99 }
100
101 /**
102 */
PHP_METHOD(Phalcon_Http_Request_File,getExtension)103 PHP_METHOD(Phalcon_Http_Request_File, getExtension) {
104
105
106
107 RETURN_MEMBER(getThis(), "_extension");
108
109 }
110
111 /**
112 * Phalcon\Http\Request\File constructor
113 */
PHP_METHOD(Phalcon_Http_Request_File,__construct)114 PHP_METHOD(Phalcon_Http_Request_File, __construct) {
115
116 zend_long ZEPHIR_LAST_CALL_STATUS;
117 zval *file_param = NULL, *key = NULL, *name = NULL, *tempName = NULL, *size = NULL, *type = NULL, *error = NULL, _0$$3, *_1$$3 = NULL, _2$$4, *_3$$4 = NULL;
118 zval *file = NULL;
119
120 ZEPHIR_MM_GROW();
121 zephir_fetch_params(1, 1, 1, &file_param, &key);
122
123 file = file_param;
124 if (!key) {
125 key = ZEPHIR_GLOBAL(global_null);
126 }
127
128
129 ZEPHIR_OBS_VAR(name);
130 if (zephir_array_isset_string_fetch(&name, file, SS("name"), 0 TSRMLS_CC)) {
131 zephir_update_property_this(getThis(), SL("_name"), name TSRMLS_CC);
132 ZEPHIR_SINIT_VAR(_0$$3);
133 ZVAL_STRING(&_0$$3, "PATHINFO_EXTENSION", 0);
134 ZEPHIR_CALL_FUNCTION(&_1$$3, "defined", NULL, 37, &_0$$3);
135 zephir_check_call_status();
136 if (zephir_is_true(_1$$3)) {
137 ZEPHIR_SINIT_VAR(_2$$4);
138 ZVAL_LONG(&_2$$4, 4);
139 ZEPHIR_CALL_FUNCTION(&_3$$4, "pathinfo", NULL, 78, name, &_2$$4);
140 zephir_check_call_status();
141 zephir_update_property_this(getThis(), SL("_extension"), _3$$4 TSRMLS_CC);
142 }
143 }
144 if (zephir_array_isset_string_fetch(&tempName, file, SS("tmp_name"), 1 TSRMLS_CC)) {
145 zephir_update_property_this(getThis(), SL("_tmp"), tempName TSRMLS_CC);
146 }
147 if (zephir_array_isset_string_fetch(&size, file, SS("size"), 1 TSRMLS_CC)) {
148 zephir_update_property_this(getThis(), SL("_size"), size TSRMLS_CC);
149 }
150 if (zephir_array_isset_string_fetch(&type, file, SS("type"), 1 TSRMLS_CC)) {
151 zephir_update_property_this(getThis(), SL("_type"), type TSRMLS_CC);
152 }
153 if (zephir_array_isset_string_fetch(&error, file, SS("error"), 1 TSRMLS_CC)) {
154 zephir_update_property_this(getThis(), SL("_error"), error TSRMLS_CC);
155 }
156 if (zephir_is_true(key)) {
157 zephir_update_property_this(getThis(), SL("_key"), key TSRMLS_CC);
158 }
159 ZEPHIR_MM_RESTORE();
160
161 }
162
163 /**
164 * Returns the file size of the uploaded file
165 */
PHP_METHOD(Phalcon_Http_Request_File,getSize)166 PHP_METHOD(Phalcon_Http_Request_File, getSize) {
167
168
169
170 RETURN_MEMBER(getThis(), "_size");
171
172 }
173
174 /**
175 * Returns the real name of the uploaded file
176 */
PHP_METHOD(Phalcon_Http_Request_File,getName)177 PHP_METHOD(Phalcon_Http_Request_File, getName) {
178
179
180
181 RETURN_MEMBER(getThis(), "_name");
182
183 }
184
185 /**
186 * Returns the temporary name of the uploaded file
187 */
PHP_METHOD(Phalcon_Http_Request_File,getTempName)188 PHP_METHOD(Phalcon_Http_Request_File, getTempName) {
189
190
191
192 RETURN_MEMBER(getThis(), "_tmp");
193
194 }
195
196 /**
197 * Returns the mime type reported by the browser
198 * This mime type is not completely secure, use getRealType() instead
199 */
PHP_METHOD(Phalcon_Http_Request_File,getType)200 PHP_METHOD(Phalcon_Http_Request_File, getType) {
201
202
203
204 RETURN_MEMBER(getThis(), "_type");
205
206 }
207
208 /**
209 * Gets the real mime type of the upload file using finfo
210 */
PHP_METHOD(Phalcon_Http_Request_File,getRealType)211 PHP_METHOD(Phalcon_Http_Request_File, getRealType) {
212
213 zval *finfo = NULL, *mime = NULL, _0, *_1;
214 zend_long ZEPHIR_LAST_CALL_STATUS;
215
216 ZEPHIR_MM_GROW();
217
218 ZEPHIR_SINIT_VAR(_0);
219 ZVAL_LONG(&_0, 16);
220 ZEPHIR_CALL_FUNCTION(&finfo, "finfo_open", NULL, 255, &_0);
221 zephir_check_call_status();
222 if (Z_TYPE_P(finfo) != IS_RESOURCE) {
223 RETURN_MM_STRING("", 1);
224 }
225 _1 = zephir_fetch_nproperty_this(this_ptr, SL("_tmp"), PH_NOISY_CC);
226 ZEPHIR_CALL_FUNCTION(&mime, "finfo_file", NULL, 256, finfo, _1);
227 zephir_check_call_status();
228 ZEPHIR_CALL_FUNCTION(NULL, "finfo_close", NULL, 257, finfo);
229 zephir_check_call_status();
230 RETURN_CCTOR(mime);
231
232 }
233
234 /**
235 * Checks whether the file has been uploaded via Post.
236 */
PHP_METHOD(Phalcon_Http_Request_File,isUploadedFile)237 PHP_METHOD(Phalcon_Http_Request_File, isUploadedFile) {
238
239 zend_bool _0;
240 zval *tmp = NULL, *_1 = NULL;
241 zend_long ZEPHIR_LAST_CALL_STATUS;
242
243 ZEPHIR_MM_GROW();
244
245 ZEPHIR_CALL_METHOD(&tmp, this_ptr, "gettempname", NULL, 0);
246 zephir_check_call_status();
247 _0 = Z_TYPE_P(tmp) == IS_STRING;
248 if (_0) {
249 ZEPHIR_CALL_FUNCTION(&_1, "is_uploaded_file", NULL, 258, tmp);
250 zephir_check_call_status();
251 _0 = zephir_is_true(_1);
252 }
253 RETURN_MM_BOOL(_0);
254
255 }
256
257 /**
258 * Moves the temporary file to a destination within the application
259 */
PHP_METHOD(Phalcon_Http_Request_File,moveTo)260 PHP_METHOD(Phalcon_Http_Request_File, moveTo) {
261
262 zend_long ZEPHIR_LAST_CALL_STATUS;
263 zval *destination_param = NULL, *_0;
264 zval *destination = NULL;
265
266 ZEPHIR_MM_GROW();
267 zephir_fetch_params(1, 1, 0, &destination_param);
268
269 if (UNEXPECTED(Z_TYPE_P(destination_param) != IS_STRING && Z_TYPE_P(destination_param) != IS_NULL)) {
270 zephir_throw_exception_string(spl_ce_InvalidArgumentException, SL("Parameter 'destination' must be a string") TSRMLS_CC);
271 RETURN_MM_NULL();
272 }
273 if (EXPECTED(Z_TYPE_P(destination_param) == IS_STRING)) {
274 zephir_get_strval(destination, destination_param);
275 } else {
276 ZEPHIR_INIT_VAR(destination);
277 ZVAL_EMPTY_STRING(destination);
278 }
279
280
281 _0 = zephir_fetch_nproperty_this(this_ptr, SL("_tmp"), PH_NOISY_CC);
282 ZEPHIR_RETURN_CALL_FUNCTION("move_uploaded_file", NULL, 259, _0, destination);
283 zephir_check_call_status();
284 RETURN_MM();
285
286 }
287
288