diff --git a/application/api/config.php b/application/api/config.php index 3779064a..c0b69dc7 100644 --- a/application/api/config.php +++ b/application/api/config.php @@ -2,4 +2,6 @@ //配置文件 return [ + // 默认输出类型 + 'default_return_type' => 'json', ]; \ No newline at end of file diff --git a/application/api/controller/User.php b/application/api/controller/User.php new file mode 100644 index 00000000..2fdfc401 --- /dev/null +++ b/application/api/controller/User.php @@ -0,0 +1,9 @@ +data; + } +} \ No newline at end of file diff --git a/application/common/controller/Api.php b/application/common/controller/Api.php index 70a9a9a5..bc546379 100644 --- a/application/common/controller/Api.php +++ b/application/common/controller/Api.php @@ -41,6 +41,11 @@ class Api { } } + public function _empty(){ + $this->data['msg'] = '空操作!'; + return $this->data; + } + protected function checkAuthor($header){return true; if (isset($header['authorization']) && $header['authorization']) { list($appid, $sign) = explode('{|}', $header['authorization']); diff --git a/extend/com/Ueditor.php b/extend/com/Ueditor.php new file mode 100644 index 00000000..a9e7f74d --- /dev/null +++ b/extend/com/Ueditor.php @@ -0,0 +1,354 @@ +uid = session('user_auth.uid'); + } + + //导入设置 + $this->config = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents(APP_PATH . "ueditor.json")), true); + + $action = htmlspecialchars($_GET['action']); + + switch ($action) { + case 'config': + $result = json_encode($this->config); + break; + + case 'uploadimage': + $config = array( + "pathFormat" => $this->config['imagePathFormat'], + "maxSize" => $this->config['imageMaxSize'], + "allowFiles" => $this->config['imageAllowFiles'], + ); + $fieldName = $this->config['imageFieldName']; + $result = $this->uploadFile($config, $fieldName); + break; + + case 'uploadscrawl': + $config = array( + "pathFormat" => $this->config['scrawlPathFormat'], + "maxSize" => $this->config['scrawlMaxSize'], + "allowFiles" => $this->config['scrawlAllowFiles'], + "oriName" => "scrawl.png", + ); + $fieldName = $this->config['scrawlFieldName']; + $result = $this->uploadBase64($config, $fieldName); + break; + + case 'uploadvideo': + $config = array( + "pathFormat" => $this->config['videoPathFormat'], + "maxSize" => $this->config['videoMaxSize'], + "allowFiles" => $this->config['videoAllowFiles'], + ); + $fieldName = $this->config['videoFieldName']; + $result = $this->uploadFile($config, $fieldName); + break; + + case 'uploadfile': + // default: + $config = array( + "pathFormat" => $this->config['filePathFormat'], + "maxSize" => $this->config['fileMaxSize'], + "allowFiles" => $this->config['fileAllowFiles'], + ); + $fieldName = $this->config['fileFieldName']; + $result = $this->uploadFile($config, $fieldName); + break; + + case 'listfile': + $config = array( + 'allowFiles' => $this->config['fileManagerAllowFiles'], + 'listSize' => $this->config['fileManagerListSize'], + 'path' => $this->config['fileManagerListPath'], + ); + $result = $this->listFile($config); + break; + + case 'listimage': + $config = array( + 'allowFiles' => $this->config['imageManagerAllowFiles'], + 'listSize' => $this->config['imageManagerListSize'], + 'path' => $this->config['imageManagerListPath'], + ); + $result = $this->listFile($config); + break; + + case 'catchimage': + $config = array( + "pathFormat" => $this->config['catcherPathFormat'], + "maxSize" => $this->config['catcherMaxSize'], + "allowFiles" => $this->config['catcherAllowFiles'], + "oriName" => "remote.png", + ); + $fieldName = $this->config['catcherFieldName']; + $result = $this->saveRemote($config, $fieldName); + break; + + default: + $result = json_encode(array( + 'state' => 'wrong require', + )); + break; + + } + + if (isset($_GET["callback"])) { + if (preg_match("/^[\w_]+$/", $_GET["callback"])) { + $this->output = htmlspecialchars($_GET["callback"]) . '(' . $result . ')'; + } else { + $this->output = json_encode(array( + 'state' => 'callback参数不合法', + )); + } + } else { + $this->output = $result; + } + } + + /** + * + * 输出结果 + * @param data 数组数据 + * @return 组合后json格式的结果 + */ + public function output() { + return $this->output; + } + + /** + * 上传文件方法 + * + */ + private function uploadFile($config, $fieldName) { + $file = request()->file('upfile'); + if (is_array($config['allowFiles'])) { + $config['allowFiles'] = str_replace('.', '', implode(',', $config['allowFiles'])); + }else{ + $config['allowFiles'] = ''; + } + $info = $file->validate(array('size'=>$config['maxSize'], 'ext'=>$config['allowFiles']))->move($config['pathFormat'], true, false); + + if ($info) { + $data = array( + 'state' => "SUCCESS", + 'url' => str_replace("\\", '/', substr($info->getPathname(), 1)), + 'title' => $info->getSaveName(), + 'original' => $info->getFilename(), + 'type' => '.' . $info->getExtension(), + 'size' => $info->getSize(), + ); + } else { + $data = array( + "state" => $file->getError(), + ); + } + return json_encode($data); + } + + /** + * + * Enter description here ... + */ + private function uploadBase64($config, $fieldName) { + $data = array(); + + $base64Data = $_POST[$fieldName]; + $img = base64_decode($base64Data); + $path = $this->getFullPath($config['pathFormat']); + + if (strlen($img) > $config['maxSize']) { + $data['states'] = 'too large'; + return json_encode($data); + } + + $rootpath = $this->rootpath; + + //替换随机字符串 + $imgname = uniqid() . '.png'; + $filename = $path . $imgname; + + if (\Think\Storage::put($rootpath, $filename, $img)) { + $data = array( + 'state' => 'SUCCESS', + 'url' => $rootpath . $filename, + 'title' => $imgname, + 'original' => 'scrawl.png', + 'type' => '.png', + 'size' => strlen($img), + + ); + } else { + $data = array( + 'state' => 'cant write', + ); + } + return json_encode($data); + } + + /** + * 列出文件夹下所有文件,如果是目录则向下 + */ + private function listFile($config) { + $allowFiles = substr(str_replace(".", "|", join("", $config['allowFiles'])), 1); + $size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $config['listSize']; + $start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0; + $end = $start + $size; + + $rootpath = $this->rootpath; + + $path = $config['path']; + $files = \Think\Storage::listFile($rootpath, $path, $allowFiles); + //return $files; + if (!count($files)) { + return json_encode(array( + "state" => "no match file", + "list" => array(), + "start" => $start, + "total" => count($files), + )); + } + + /* 获取指定范围的列表 */ + $len = count($files); + for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--) { + $list[] = $files[$i]; + } + //倒序 + //for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){ + // $list[] = $files[$i]; + //} + + /* 返回数据 */ + $result = json_encode(array( + "state" => "SUCCESS", + "list" => $list, + "start" => $start, + "total" => count($files), + )); + + return $result; + } + + /** + * + * Enter description here ... + */ + private function saveRemote($config, $fieldName) { + $list = array(); + if (isset($_POST[$fieldName])) { + $source = $_POST[$fieldName]; + } else { + $source = $_GET[$fieldName]; + } + foreach ($source as $imgUrl) { + $upload = new \org\Upload(); + + $imgUrl = htmlspecialchars($imgUrl); + $imgUrl = str_replace("&", "&", $imgUrl); + + //http开头验证 + if (strpos($imgUrl, "http") !== 0) { + $data = array('state' => '不是http链接'); + return json_encode($data); + } + //格式验证(扩展名验证和Content-Type验证) + $fileType = strtolower(strrchr($imgUrl, '.')); + if (!in_array($fileType, $config['allowFiles']) || stristr($heads['Content-Type'], "image")) { + $data = array("state" => "错误文件格式"); + return json_encode($data); + } + + //打开输出缓冲区并获取远程图片 + ob_start(); + $context = stream_context_create( + array('http' => array( + 'follow_location' => false, // don't follow redirects + )) + ); + readfile($imgUrl, false, $context); + $img = ob_get_contents(); + ob_end_clean(); + preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m); + + $path = $this->getFullPath($config['pathFormat']); + if (strlen($img) > $config['maxSize']) { + $data['states'] = 'too large'; + return json_encode($data); + } + + $rootpath = $this->rootpath; + + $imgname = uniqid() . '.png'; + $filename = $path . $imgname; + + $oriName = $m ? $m[1] : ""; + + if (\Think\Storage::put($rootpath, $filename, $img)) { + array_push($list, array( + "state" => 'SUCCESS', + "url" => \Think\Storage::getPath($rootpath, $filename), + "size" => strlen($img), + "title" => $imgname, + "original" => $oriName, + "source" => htmlspecialchars($imgUrl), + )); + } else { + array_push($list, array('state' => '文件写入失败')); + } + } + + /* 返回抓取数据 */ + return json_encode(array( + 'state' => count($list) ? 'SUCCESS' : 'ERROR', + 'list' => $list, + )); + } + + /** + * 规则替换命名文件 + * @param $path + * @return string + */ + private function getFullPath($path) { + //替换日期事件 + $t = time(); + $d = explode('-', date("Y-y-m-d-H-i-s")); + $format = $path; + $format = str_replace("{yyyy}", $d[0], $format); + $format = str_replace("{yy}", $d[1], $format); + $format = str_replace("{mm}", $d[2], $format); + $format = str_replace("{dd}", $d[3], $format); + $format = str_replace("{hh}", $d[4], $format); + $format = str_replace("{ii}", $d[5], $format); + $format = str_replace("{ss}", $d[6], $format); + $format = str_replace("{uid}", $this->uid, $format); + + return $format; + } + + private function format_exts($exts) { + $data = array(); + foreach ($exts as $key => $value) { + $data[] = ltrim($value, '.'); + } + return $data; + } + +}