source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Upload.php @ 1300

Last change on this file since 1300 was 1300, checked in by gogo, 8 years ago

Update the MootoolsFileManager? to the latest cpojer with some modifications.
Add a demo for the MFM examples/mootools-file-manager.php
Change the default config for ImageManager? and ExtendedFileManager? for added security.

File size: 4.1 KB
Line 
1<?php
2/**
3 * Styx::Upload - Handles file uploads
4 *
5 * @package Styx
6 * @subpackage Utility
7 *
8 * @license MIT-style License
9 * @author Christoph Pojer <christoph.pojer@gmail.com>
10 */
11
12class Upload {
13
14        /**
15         * Moves the uploaded file to the specified location. It throws a UploadException
16         * if anything goes wrong except for if the upload does not exist. This can be checked with {@link Upload::exists()}
17         *
18         * @param string $file
19         * @param string $to
20         * @param array $options
21         * @return bool|string Path to moved file or false if the specified upload does not exist
22         */
23        public static function move($file, $to, $options = null){
24                if(!self::exists($file)) return false;
25
26                $options = array_merge(array(
27                        'name' => null,
28                        'extension' => null,
29                        'maxsize' => null,
30                        'chmod' => 0777,
31                        'overwrite' => false,
32                        'mimes' => array(),
33                        'ext2mime_map' => null
34                ), (is_array($options) ? $options : array()));
35
36                $file = $_FILES[$file];
37
38                if($options['maxsize'] && $file['size'] > $options['maxsize'])
39                        throw new UploadException('size');
40
41                $pathinfo = pathinfo($file['name']);
42                if($options['extension']) $pathinfo['extension'] = $options['extension'];
43                if(!$pathinfo['extension'])
44                        throw new UploadException('extension');
45
46                if(count($options['mimes'])){
47                        $mime = self::mime($file['tmp_name'], array(
48                                'default' => $file['type'],
49                                'extension' => $pathinfo['extension'],
50                        ), $options['ext2mime_map']);
51
52                        if(!$mime || !in_array($mime, $options['mimes']))
53                                throw new UploadException('extension');
54                }
55
56                $file['ext'] = strtolower($pathinfo['extension']);
57                $file['base'] = basename($pathinfo['basename'], '.'.$pathinfo['extension']);
58
59                $real = realpath($to);
60                if(!$real) throw new UploadException('path');
61                if(is_dir($real)) $to = $real.'/'.($options['name'] ? $options['name'] : $file['base']).'.'.$file['ext'];
62
63                if(!$options['overwrite'] && file_exists($to))
64                        throw new UploadException('exists');
65
66                if(!move_uploaded_file($file['tmp_name'], $to))
67                        throw new UploadException(strtolower($_FILES[$file]['error']<=2 ? 'size' : ($_FILES[$file]['error']==3 ? 'partial' : 'nofile')));
68
69                chmod($to, $options['chmod']);
70
71                return realpath($to);
72        }
73
74        /**
75         * Returns whether the Upload exists or not
76         *
77         * @param string $file
78         * @return bool
79         */
80        public static function exists($file){
81                return isset($_FILES) && !empty($_FILES[$file]) && !empty($_FILES[$file]['name']) && !empty($_FILES[$file]['size']);
82        }
83
84        /**
85         * Returns (if possible) the mimetype of the given file
86         *
87         * @param string $file
88         * @param array $options
89         * @param array $ext2mimetype_arr optional externally specified array for mapping file extensions
90         *                                to mime types. May be specified as a temporary alternative to
91         *                                using the local MimeTypes.ini file.
92         */
93        public static function mime($file, $options = null, $ext2mimetype_arr = null){
94                $file = realpath($file);
95                $options = array_merge(array(
96                                'default' => null,
97                                'extension' => strtolower(pathinfo($file, PATHINFO_EXTENSION)),
98                        ), (is_array($options) ? $options : array()));
99
100    // Xinha: Might have been overwritten by the options!
101    $options['extension'] = strtolower($options['extension']);
102   
103                $mime = null;
104                $ini = error_reporting(0);
105                if (function_exists('finfo_open') && $f = finfo_open(FILEINFO_MIME, getenv('MAGIC'))){
106                        $mime = finfo_file($f, $file);
107                        finfo_close($f);
108                }
109                error_reporting($ini);
110
111                if(!$mime && in_array(strtolower($options['extension']), array('gif', 'jpg', 'jpeg', 'png'))){
112                        $image = @getimagesize($file);
113                        if($image !== false && !empty($image['mime']))
114                                $mime = $image['mime'];
115                }
116
117                if((!$mime || $mime=='application/octet-stream') && $options['extension']){
118                        if (!is_array($ext2mimetype_arr)){
119                                static $mimes;
120                                if(!$mimes) $mimes = parse_ini_file(pathinfo(__FILE__, PATHINFO_DIRNAME).'/MimeTypes.ini');
121                                $ext2mimetype_arr = $mimes;
122                        }
123
124                        if(!empty($ext2mimetype_arr[$options['extension']])) return $ext2mimetype_arr[$options['extension']];
125                }
126
127                if(!$mime && $options['default']) $mime = $options['default'];
128
129                return $mime;
130        }
131}
132
133class UploadException extends Exception {}
134
Note: See TracBrowser for help on using the repository browser.