时间:2021-07-01 10:21:17 帮助过:9人阅读
- <br><?php <br>/** <br>+------------------------------------------------------------------------------ <br>* Upload 文件上传类 <br>+------------------------------------------------------------------------------ <br>* @package Upload <br>* @author Anyon <Anyon@139.com> <br>* @version $Id: Upload.class.php 2013-3-20 21:47:23 Anyon $ <br>+------------------------------------------------------------------------------ <br>*/ <br>class Upload { <br>private static $image = null; <br>private static $status = 0; <br>private static $suffix = null; <br>private static $imageType = array('.jpg', '.bmp','.gif','.png'); <br>private static $message = array( <br>'0' => '没有错误发生,文件上传成功。', <br>'1' => '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。', <br>'2' => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。', <br>'3' => '文件只有部分被上传。', <br>'4' => '没有文件上传。', <br>'5' => '未能通过安全检查的文件。', <br>'6' => '找不到临时文件夹。', <br>'7' => '文件写入失败。', <br>'8' => '文件类型不支持', <br>'9' => '上传的临时文件丢失。', <br>); <br>//@ 开始执行文件上传 <br>public static function start($feild = 'file') { <br>if (!empty($_FILES)) { <br>self::$status = $_FILES[$feild]['error']; <br>if (self::$status > 0) <br>return array('status' => self::$status, 'msg' => self::$message[self::$status]); <br>self::$image = $_FILES[$feild]['tmp_name']; <br>self::$suffix = strtolower(strrchr($_FILES[$feild]['name'], '.')); <br>return array('status' => self::_upload(), 'path' => self::$image, 'msg' => self::$message[self::$status]); <br>} else { <br>return array('status' => self::$status, 'msg' => self::$message[self::$status]); <br>} <br>} <br>//@ 私有 上传开始 <br>private static function _upload($path = './upload/') { <br>date_default_timezone_set('PRC'); <br>$newFile = $path . date('Y/m/d/His') . rand(100, 999) . self::$suffix; <br>self::umkdir(dirname($newFile)); <br>if (is_uploaded_file(self::$image) && move_uploaded_file(self::$image, $newFile)) { <br>self::$image = $newFile; <br>if (in_array(self::$suffix, self::$imageType)) <br>return self::checkHex(); <br>else <br>return self::$status = 0; <br>} else { <br>return self::$status = 9; <br>} <br>} <br>//@ 私有 16进制检测 <br>private static function checkHex() { <br>if (file_exists(self::$image)) { <br>$resource = fopen(self::$image, 'rb'); <br>$fileSize = filesize(self::$image); <br>fseek($resource, 0); <br>if ($fileSize > 512) { // 取头和尾 <br>$hexCode = bin2hex(fread($resource, 512)); <br>fseek($resource, $fileSize - 512); <br>$hexCode .= bin2hex(fread($resource, 512)); <br>} else { // 取全部 <br>$hexCode = bin2hex(fread($resource, $fileSize)); <br>} <br>fclose($resource); <br>/* 匹配16进制中的 <% ( ) %> */ <br>/* 匹配16进制中的 <? ( ) ?> */ <br>/* 匹配16进制中的 <script | /script> 大小写亦可*/ <br>if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) <br>self::$status = 5; <br>else <br>self::$status = 0; <br>return self::$status; <br>} else { <br>return self::$status = 9; <br>} <br>} <br>//@ 私有 创建目录 <br>private static function umkdir($dir) { <br>if (!file_exists($dir) && !is_dir($dir)) { <br>self::umkdir(dirname($dir)); <br>@mkdir($dir); <br>} <br>} <br>} <br>