| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511 |
- <?php
- /**
- * Niushop商城系统 - 团队十年电商经验汇集巨献!
- * =========================================================
- * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
- * ----------------------------------------------
- * 官方网址: https://www.niushop.com
- * =========================================================
- */
- namespace app\shop\controller;
- use app\Controller;
- use app\model\upload\Upload as UploadModel;
- /**
- * 百度编辑器上传
- * 版本 1.0.6
- */
- class Ueditor extends Controller
- {
- public function index()
- {
- date_default_timezone_set("Asia/chongqing");
- error_reporting(E_ERROR);
- header("Content-Type: text/html; charset=utf-8");
- $CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("./public/static/ext/ueditor/php/config.json")), true);
- $action = $_GET[ 'action' ];
- switch ( $action ) {
- case 'config':
- $result = json_encode($CONFIG);
- break;
- /* 上传图片 */
- case 'uploadimage':
- $fieldName = $CONFIG[ 'imageFieldName' ];
- $result = $this->upImage($fieldName);
- break;
- /* 上传涂鸦 */
- case 'uploadscrawl':
- $config = array (
- "pathFormat" => $CONFIG[ 'scrawlPathFormat' ],
- "maxSize" => $CONFIG[ 'scrawlMaxSize' ],
- "allowFiles" => $CONFIG[ 'scrawlAllowFiles' ],
- "oriName" => "scrawl.png"
- );
- $fieldName = $CONFIG[ 'scrawlFieldName' ];
- $base64 = "base64";
- $result = $this->upBase64($config, $fieldName);
- break;
- /* 上传视频 */
- case 'uploadvideo':
- $fieldName = $CONFIG[ 'videoFieldName' ];
- $result = $this->upVideo($fieldName, $CONFIG[ 'videoMaxSize' ]);
- break;
- /* 上传文件 */
- case 'uploadfile':
- $fieldName = $CONFIG[ 'fileFieldName' ];
- $result = $this->upFile($fieldName);
- break;
- /* 列出图片 */
- case 'listimage':
- $allowFiles = $CONFIG[ 'imageManagerAllowFiles' ];
- $listSize = $CONFIG[ 'imageManagerListSize' ];
- $path = $CONFIG[ 'imageManagerListPath' ];
- $get = $_GET;
- $result = $this->fileList($allowFiles, $listSize, $get);
- break;
- /* 列出文件 */
- case 'listfile':
- $allowFiles = $CONFIG[ 'fileManagerAllowFiles' ];
- $listSize = $CONFIG[ 'fileManagerListSize' ];
- $path = $CONFIG[ 'fileManagerListPath' ];
- $get = $_GET;
- $result = $this->fileList($allowFiles, $listSize, $get);
- break;
- /* 抓取远程文件 */
- case 'catchimage':
- $config = array (
- "pathFormat" => $CONFIG[ 'catcherPathFormat' ],
- "maxSize" => $CONFIG[ 'catcherMaxSize' ],
- "allowFiles" => $CONFIG[ 'catcherAllowFiles' ],
- "oriName" => "remote.png"
- );
- $fieldName = $CONFIG[ 'catcherFieldName' ];
- /* 抓取远程图片 */
- $list = array ();
- isset($_POST[ $fieldName ]) ? $source = $_POST[ $fieldName ] : $source = $_GET[ $fieldName ];
- foreach ($source as $imgUrl) {
- $info = json_decode($this->saveRemote($config, $imgUrl), true);
- array_push($list, array (
- "state" => $info[ "state" ],
- "url" => $info[ "url" ],
- "size" => $info[ "size" ],
- "title" => htmlspecialchars($info[ "title" ]),
- "original" => htmlspecialchars($info[ "original" ]),
- "source" => htmlspecialchars($imgUrl)
- ));
- }
- $result = json_encode(array (
- 'state' => count($list) ? 'SUCCESS' : 'ERROR',
- 'list' => $list
- ));
- break;
- default:
- $result = json_encode(array (
- 'state' => '请求地址出错'
- ));
- break;
- }
- /* 输出结果 */
- if (isset($_GET[ "callback" ])) {
- if (preg_match("/^[\w_]+$/", $_GET[ "callback" ])) {
- echo htmlspecialchars($_GET[ "callback" ]) . '(' . $result . ')';
- } else {
- echo json_encode(array (
- 'state' => 'callback参数不合法'
- ));
- }
- } else {
- echo $result;
- }
- }
- /**
- * 上传文件
- * @param unknown $fieldName
- */
- private function upFile($fieldName)
- {
- $upload_service = new Upload();
- $upload_path = 'ueditor/file/' . date('Ymd');
- if (!empty($_FILES[ $fieldName ])) {//上传成功
- $info = $upload_service->file($_FILES[ $fieldName ], $upload_path);
- if ($info[ 'code' ] > 0) {
- $data = array (
- 'state' => 'SUCCESS',
- 'url' => $info[ 'data' ][ 'path' ],
- 'title' => $info[ 'data' ][ 'file_name' ],
- 'original' => $info[ 'data' ][ 'file_name' ],
- 'type' => '.' . $info[ 'data' ][ 'file_ext' ],
- 'size' => $info[ 'data' ][ 'size' ]
- );
- } else {
- $data = array (
- 'state' => $info[ 'message' ]
- );
- }
- } else {
- $data = array (
- 'state' => '上传文件为空',
- );
- }
- return json_encode($data);
- }
- /**
- * 上传图片
- * @param unknown $fieldName
- * @return string
- */
- private function upImage($fieldName)
- {
- $upload_service = new UploadModel();
- $upload_path = 'ueditor/image/' . date('Ymd');
- if (!empty($_FILES[ $fieldName ])) {//上传成功
- $info = $upload_service->setPath("common/images/" . date("Ymd") . '/')->image([
- 'name' => $fieldName,
- 'thumb_type' => '',
- 'cloud' => 1
- ]);
- if ($info[ 'code' ] >= 0) {
- $data = array (
- 'state' => 'SUCCESS',
- 'url' => $info[ 'data' ][ 'pic_path' ],
- 'title' => $info[ 'data' ][ 'pic_name' ],
- 'original' => $info[ 'data' ][ 'pic_name' ],
- 'type' => '.' . $info[ 'data' ][ 'file_ext' ],
- );
- } else {
- $data = array (
- 'state' => $info[ 'message' ]
- );
- }
- } else {
- $data = array (
- 'state' => '上传文件为空',
- );
- }
- return json_encode($data);
- }
- public function upVideo($fieldName, $size)
- {
- $upload_service = new UploadModel();
- if (!empty($_FILES[ $fieldName ])) {//上传成功
- $info = $upload_service->setPath("common/video/" . date("Ymd") . '/')->video([
- 'name' => $fieldName,
- ]);
- if ($info[ 'code' ] >= 0) {
- $data = array (
- 'state' => 'SUCCESS',
- 'url' => $info[ 'data' ][ 'path' ],
- 'title' => $info[ 'data' ][ 'path' ],
- 'original' => $info[ 'data' ][ 'path' ]
- );
- } else {
- $data = array (
- 'state' => 'FAIL'
- );
- }
- } else {
- $data = array (
- 'state' => '上传文件为空',
- );
- }
- return json_encode($data);
- }
- //列出图片
- private function fileList($allowFiles, $listSize, $get)
- {
- $dirname = __UPLOAD__ . '/ueditor/';
- $allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
- /* 获取参数 */
- $size = isset($get[ 'size' ]) ? htmlspecialchars($get[ 'size' ]) : $listSize;
- $start = isset($get[ 'start' ]) ? htmlspecialchars($get[ 'start' ]) : 0;
- $end = $start + $size;
- /* 获取文件列表 */
- $path = $dirname;
- $files = $this->getFiles($path, $allowFiles);
- 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 ];
- }
- /* 返回数据 */
- $result = json_encode(array (
- "state" => "SUCCESS",
- "list" => $list,
- "start" => $start,
- "total" => count($files)
- ));
- return $result;
- }
- /*
- * 遍历获取目录下的指定类型的文件
- * @param $path
- * @param array $files
- * @return array
- */
- private function getFiles($path, $allowFiles, &$files = array ())
- {
- if (!is_dir($path)) return null;
- if (substr($path, strlen($path) - 1) != '/') $path .= '/';
- $handle = opendir($path);
- while (false !== ( $file = readdir($handle) )) {
- if ($file != '.' && $file != '..') {
- $path2 = $path . $file;
- if (is_dir($path2)) {
- $this->getFiles($path2, $allowFiles, $files);
- } else {
- if (preg_match("/\.(" . $allowFiles . ")$/i", $file)) {
- $files[] = array (
- 'url' => $path2, //substr($path2,1),
- 'mtime' => filemtime($path2)
- );
- }
- }
- }
- }
- return $files;
- }
- private function saveRemote($config, $fieldName)
- {
- $imgUrl = htmlspecialchars($fieldName);
- $imgUrl = str_replace("&", "&", $imgUrl);
- //http开头验证
- if (strpos($imgUrl, "http") !== 0) {
- $data = array (
- 'state' => '链接不是http链接',
- );
- return json_encode($data);
- }
- //获取请求头并检测死链
- $heads = get_headers($imgUrl);
- if (!( stristr($heads[ 0 ], "200") && stristr($heads[ 0 ], "OK") )) {
- $data = array (
- 'state' => '链接不可用',
- );
- return json_encode($data);
- }
- //格式验证(扩展名验证和Content-Type验证)
- $fileType = strtolower(strrchr($imgUrl, '.'));
- if (!in_array($fileType, $config[ 'allowFiles' ]) || stristr($heads[ 'Content-Type' ], "image")) {
- $data = array (
- 'state' => '链接contentType不正确',
- );
- return json_encode($data);
- }
- $upload_service = new UploadModel();
- $res = $upload_service->setPath("common/images/" . date("Ymd") . '/')->remotePull($imgUrl);
- if ($res[ 'code' ] != 0) {
- return json_encode([ 'state' => $res[ 'message' ] ]);
- }
- preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m);
- return json_encode([
- 'state' => 'SUCCESS',
- 'url' => img($res[ 'data' ][ 'pic_path' ]),
- 'title' => $res[ 'data' ][ 'pic_path' ],
- 'original' => $m ? $m[ 1 ] : "",
- 'type' => strtolower(strrchr($config[ 'oriName' ], '.')),
- 'size' => 0,
- ]);
- }
- //抓取远程图片
- private function saveRemoteBackup($config, $fieldName)
- {
- $imgUrl = htmlspecialchars($fieldName);
- $imgUrl = str_replace("&", "&", $imgUrl);
- //http开头验证
- if (strpos($imgUrl, "http") !== 0) {
- $data = array (
- 'state' => '链接不是http链接',
- );
- return json_encode($data);
- }
- //获取请求头并检测死链
- $heads = get_headers($imgUrl);
- if (!( stristr($heads[ 0 ], "200") && stristr($heads[ 0 ], "OK") )) {
- $data = array (
- 'state' => '链接不可用',
- );
- return json_encode($data);
- }
- //格式验证(扩展名验证和Content-Type验证)
- $fileType = strtolower(strrchr($imgUrl, '.'));
- if (!in_array($fileType, $config[ 'allowFiles' ]) || stristr($heads[ 'Content-Type' ], "image")) {
- $data = array (
- 'state' => '链接contentType不正确',
- );
- 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);
- $dirname = __UPLOAD__ . '/ueditor/image/' . date('Ymd');
- $file[ 'oriName' ] = $m ? $m[ 1 ] : "";
- $file[ 'filesize' ] = strlen($img);
- $file[ 'ext' ] = strtolower(strrchr($config[ 'oriName' ], '.'));
- $file[ 'name' ] = uniqid() . $file[ 'ext' ];
- $file[ 'fullName' ] = $dirname . '/' . $file[ 'name' ];
- $fullName = $file[ 'fullName' ];
- //检查文件大小是否超出限制
- if ($file[ 'filesize' ] >= ( $config[ "maxSize" ] )) {
- $data = array (
- 'state' => '文件大小超出网站限制',
- );
- return json_encode($data);
- }
- //创建目录失败
- if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
- $data = array (
- 'state' => '目录创建失败',
- );
- return json_encode($data);
- } else if (!is_writeable($dirname)) {
- $data = array (
- 'state' => '目录没有写权限',
- );
- return json_encode($data);
- }
- //移动文件
- if (!( file_put_contents($fullName, $img) && file_exists($fullName) )) { //移动失败
- $data = array (
- 'state' => '写入文件内容错误',
- );
- return json_encode($data);
- } else {
- //先拉取到本地在上传到云端
- $upload_service = new Upload();
- $info = $upload_service->fileStore($dirname, $file[ 'name' ]);
- if ($info[ 'code' ] > 0) {
- $file[ 'fullName' ] = $info[ 'path' ];
- } else {
- $data = array (
- 'state' => $info[ 'message' ],
- );
- return json_encode($data);
- }
- $data = array (
- 'state' => 'SUCCESS',
- 'url' => $file[ 'fullName' ],
- 'title' => $file[ 'name' ],
- 'original' => $file[ 'oriName' ],
- 'type' => $file[ 'ext' ],
- 'size' => $file[ 'filesize' ],
- );
- }
- return json_encode($data);
- }
- /*
- * 处理base64编码的图片上传
- * 例如:涂鸦图片上传
- */
- private function upBase64($config, $fieldName)
- {
- $base64Data = $_POST[ $fieldName ];
- $img = base64_decode($base64Data);
- $dirname = __UPLOAD__ . '/ueditor/scrawl/' . date('Ymd');
- $file[ 'filesize' ] = strlen($img);
- $file[ 'oriName' ] = $config[ 'oriName' ];
- $file[ 'ext' ] = strtolower(strrchr($config[ 'oriName' ], '.'));
- $file[ 'name' ] = uniqid() . $file[ 'ext' ];
- $file[ 'fullName' ] = $dirname . '/' . $file[ 'name' ];
- $fullName = $file[ 'fullName' ];
- //检查文件大小是否超出限制
- if ($file[ 'filesize' ] >= ( $config[ "maxSize" ] )) {
- $data = array (
- 'state' => '文件大小超出网站限制',
- );
- return json_encode($data);
- }
- //创建目录失败
- if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
- $data = array (
- 'state' => '目录创建失败',
- );
- return json_encode($data);
- } else if (!is_writeable($dirname)) {
- $data = array (
- 'state' => '目录没有写权限',
- );
- return json_encode($data);
- }
- //移动文件
- if (!( file_put_contents($fullName, $img) && file_exists($fullName) )) { //移动失败
- $data = array (
- 'state' => '写入文件内容错误',
- );
- } else {
- //先拉取到本地在上传到云端
- $upload_service = new Upload();
- $info = $upload_service->fileStore($dirname, $file[ 'name' ]);
- if ($info[ 'code' ] > 0) {
- $file[ 'fullName' ] = $info[ 'path' ];
- } else {
- $data = array (
- 'state' => $info[ 'message' ],
- );
- return json_encode($data);
- }
- $data = array (
- 'state' => 'SUCCESS',
- 'url' => substr($file[ 'fullName' ], 1),
- 'title' => $file[ 'name' ],
- 'original' => $file[ 'oriName' ],
- 'type' => $file[ 'ext' ],
- 'size' => $file[ 'filesize' ],
- );
- }
- return json_encode($data);
- }
- }
|