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