why.xingtongworld.com项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

511 lines
17 KiB

<?php
// +----------------------------------------------------------------------
// | YFCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://www.rainfer.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: rainfer <81818832@qq.com>
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\common\controller\Common;
use think\Db;
class Ueditor extends Common
{
protected $config;
protected $type;
protected function _initialize()
{
parent::_initialize();
$adminid=session('admin_auth.aid');
$userid=session('hid');
if(empty($adminid) && empty($userid)){
exit("非法上传!");
}
}
/**
* 上传
*/
public function upload()
{
$this->type=input('edit_type','');
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/ueditor/config.json")), true);
$storage_domain=config('storage.domain');
$config_qiniu=array(
"imageUrlPrefix"=> $storage_domain, /* 图片访问路径前缀 */
"scrawlUrlPrefix" => $storage_domain, /* 图片访问路径前缀 */
"snapscreenUrlPrefix" => $storage_domain, /* 图片访问路径前缀 */
"catcherUrlPrefix" => $storage_domain, /* 图片访问路径前缀 */
"fileUrlPrefix" => $storage_domain, /* 文件访问路径前缀 */
"imageManagerUrlPrefix" => $storage_domain, /* 图片访问路径前缀 */
);
if(config('storage.storage_open') && $this->type!='mats'){
$CONFIG=array_merge($CONFIG,$config_qiniu);
}
$this->config=$CONFIG;
$action = input('action');
switch ($action) {
case 'config':
$result = json_encode($CONFIG);
break;
/* 上传图片 */
case 'uploadimage':
$result = $this->_ueditor_upload();
break;
/* 上传涂鸦 */
case 'uploadscrawl':
$result = $this->_ueditor_upload_scrawl();
break;
/* 上传视频 */
case 'uploadvideo':
$result = $this->_ueditor_upload(array('maxSize' => 1073741824,/*1G*/'exts'=>array('mp4', 'avi', 'wmv','rm','rmvb','mkv')));
break;
/* 上传文件 */
case 'uploadfile':
$result = $this->_ueditor_upload(array('exts'=>array('jpg', 'gif', 'png', 'jpeg','txt','pdf','doc','docx','xls','xlsx','zip','rar','ppt','pptx',)));
break;
/* 列出图片 */
case 'listimage':
/* 列出文件 */
case 'listfile':
$result = $this->_ueditor_list($action);
break;
/* 抓取远程文件 */
case 'catchimage':
$result = $this->_ueditor_upload_catch();
break;
default:
$result = json_encode(array('state'=> '请求地址出错'));
break;
}
/* 输出结果 */
if (isset($_GET["callback"]) && false ) {
if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
} else {
echo json_encode(array(
'state'=> 'callback参数不合法'
));
}
} else {
exit($result) ;
}
}
private function _ueditor_list($action)
{
/* 判断类型 */
switch ($action) {
/* 列出文件 */
case 'listfile':
$allowFiles = $this->config['fileManagerAllowFiles'];
$listSize = $this->config['fileManagerListSize'];
$prefix='file/';
break;
/* 列出图片 */
case 'listimage':
default:
$allowFiles = $this->config['imageManagerAllowFiles'];
$listSize = $this->config['imageManagerListSize'];
$prefix='image/';
}
$allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1);
/* 获取参数 */
$size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize;
$start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0;
$end = intval($start) + intval($size);
if($this->type=='mats'){
//微信公众平台图片列表
$files=Db::name('we_pic')->field('mtime,url')->select();
if(empty($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];
}
}elseif(config('storage.storage_open')){
//七牛
$upload = \Qiniu::instance();
$files = $upload->listfile($prefix);
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--){
$tmp['url']= $files[$i]['key'];
$tmp['mtime']= $files[$i]['putTime'];
$list[]=$tmp;
}
}else{
/* 获取文件列表 */
$path = './data/upload/';
$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;
}
/**
* 遍历获取目录下的指定类型的文件
* @author rainfer <81818832@qq.com>
* @param string $path
* @param string $allowFiles
* @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'=> __ROOT__.substr($path2,1),
'mtime'=> filemtime($path2)
);
}
}
}
}
return $files;
}
//上传
private function _ueditor_upload($config=array())
{
$title = '';
$url='';
if(!empty($config)){
$this->config=array_merge($this->config,$config);;
}
if($this->type=='mats'){
$file = request()->file('upfile');
if($file){
$validate=array(
'size'=>5024*1024 ,// 设置附件上传大小1M
'ext'=>array('jpg', 'png', 'gif'),
);
$info = $file->validate($validate)->rule('uniqid')->move(ROOT_PATH . config('upload_path') . DS . date('Y-m-d'));
if($info) {
$imgurl=ROOT_PATH.config('upload_path'). '/' . date('Y-m-d') . '/' . $info->getFilename();
//上传微信
$wechat=controller('wechat/WeBase');
$material = $wechat->app->material;
$result = $material->uploadArticleImage($imgurl);
$url = $result->url;
if(!empty($url)){
$data['mtime']=time();
$data['url']=$url;
Db::name('we_pic')->insert($data);
$title =$info->getFilename();
$state = 'SUCCESS';
}else{
$state ='上传微信平台失败';
}
$file = null;
@unlink($imgurl);
}else{
$state = $file->getError();
}
}else{
$state = '未接收到文件';
}
}elseif(config('storage.storage_open')){
//七牛云存储
$upload = \Qiniu::instance();
$info = $upload->upload();
$error = $upload->getError();
if ($info) {
$state = 'SUCCESS';
$url= $info[0]['key'];
$title =$info[0]['name'];
}else{
$state = $error;
}
}else{
//本地上传
$file = request()->file('upfile');
if($file){
$validate=array(
'size'=>3145728 ,// 设置附件上传大小
//'ext'=>array('jpg', 'gif', 'png', 'jpeg'),
);
$info = $file->validate($validate)->rule('uniqid')->move(ROOT_PATH . config('upload_path') . DS . date('Y-m-d'));
if($info) {
$img_url=config('upload_path'). '/' . date('Y-m-d') . '/' . $info->getFilename();
//写入本地文件数据库
$data['uptime']=time();
$data['filesize']=$info->getSize();
$data['path']=$img_url;
Db::name('plug_files')->insert($data);
$title =$info->getFilename();
$state = 'SUCCESS';
$url= __ROOT__.$img_url;
}else{
$state = $file->getError();
}
}else{
$state = '未接收到文件';
}
}
$response=array(
"state" => $state,
"url" => $url,
"title" => $title,
"original" =>$title,
);
return json_encode($response);
}
//涂鸦
private function _ueditor_upload_scrawl()
{
$data = input('post.' . $this->config ['scrawlFieldName']);
$url='';
$title = '';
$oriName = '';
if (empty ($data)) {
$state= 'Scrawl Data Empty!';
} else {
if($this->type=='mats'){
//本地存储
$img = base64_decode($data);
if(strlen($img)>1024*1024){
$state ='文件超过1M';
}else{
$savepath = save_storage_content('png', $img);
//上传微信
$wechat=controller('wechat/WeBase');
$material = $wechat->app->material;
$result = $material->uploadArticleImage(ROOT_PATH.$savepath);
$url = $result->url;
if(!empty($url)){
$sldata['mtime']=time();
$sldata['url']=$url;
Db::name('we_pic')->insert($sldata);
$state = 'SUCCESS';
}else{
$state ='上传微信平台失败';
}
@unlink(ROOT_PATH.$savepath);
}
}elseif(config('storage.storage_open')){
//七牛
$upload = \Qiniu::instance();
$info = $upload->uploadOne('data:image/png;base64,'.$data,"image/");
$error = $upload->getError();
if ($info) {
$state = 'SUCCESS';
$url= $info['key'];
$title =$info['name'];
}else{
$state = $error;
}
}else{
//本地存储
$img = base64_decode($data);
$savepath = save_storage_content('png', $img);
if ($savepath) {
$state = 'SUCCESS';
$url = __ROOT__.'/'.$savepath;
//写入数据库
$file['uptime']=time();
$file['filesize']=strlen($img);
$file['path']='/'.$savepath;
Db::name('plug_files')->insert($file);
} else {
$state = 'Save scrawl file error!';
}
}
}
$response=array(
"state" => $state,
"url" => $url,
"title" => $title,
"original" =>$oriName ,
);
return json_encode($response);
}
//抓取远程文件
private function _ueditor_upload_catch()
{
set_time_limit(0);
$sret = array(
'state' => '',
'list' => null
);
$savelist = array();
$flist = input('post.' . $this->config ['catcherFieldName'].'/a');
if (empty ($flist)) {
$sret ['state'] = 'ERROR';
} else {
$sret ['state'] = 'SUCCESS';
foreach ($flist as $f) {
if (preg_match('/^(http|ftp|https):\\/\\//i', $f)) {
$ext = strtolower(pathinfo($f, PATHINFO_EXTENSION));
if (in_array('.' . $ext, $this->config ['catcherAllowFiles'])) {
if ($img = file_get_contents($f)) {
if($this->type=='mats' && in_array($ext,array('jpg','png')) && strlen($img)<1024*1024){
//本地
$savepath = save_storage_content($ext, $img);
if ($savepath) {
//上传微信
$wechat=controller('wechat/WeBase');
$material = $wechat->app->material;
$result = $material->uploadArticleImage(ROOT_PATH.$savepath);
$url = $result->url;
if(!empty($url)){
$sldata['mtime']=time();
$sldata['url']=$url;
Db::name('we_pic')->insert($sldata);
$savelist [] = array(
'state' => 'SUCCESS',
'url' => $url,
'size' => strlen($img),
'title' => '',
'original' => '',
'source' => htmlspecialchars($f)
);
}else{
$savelist [] = array(
'state' => 'Save remote file error!',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
@unlink(ROOT_PATH.$savepath);
} else {
$savelist [] = array(
'state' => 'Save remote file error!',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
}elseif(config('storage.storage_open') && stripos($f,config('storage.domain'))===false){
//七牛
$upload = \Qiniu::instance();
$info = $upload->uploadcatch($f,'','',$ext);
if ($info) {
$savelist [] = array(
'state' => 'SUCCESS',
'url' => $info[0]['key'],
'size' => 0,
'title' => '',
'original' => '',
'source' => htmlspecialchars($f)
);
}else{
$savelist [] = array(
'state' => 'Save remote file error!',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
}else{
//本地
$savepath = save_storage_content($ext, $img);
if ($savepath) {
$savelist [] = array(
'state' => 'SUCCESS',
'url' => __ROOT__.'/'.$savepath,
'size' => strlen($img),
'title' => '',
'original' => '',
'source' => htmlspecialchars($f)
);
//写入数据库
$data['uptime']=time();
$data['filesize']=strlen($img);
$data['path']='/'.$savepath;
Db::name('plug_files')->insert($data);
} else {
$savelist [] = array(
'state' => 'Save remote file error!',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
}
} else {
$savelist [] = array(
'state' => 'Get remote file error',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
} else {
$sret ['state'] = 'File ext not allowed';
}
} else {
$savelist [] = array(
'state' => 'not remote image',
'url' => '',
'size' => '',
'title' => '',
'original' => '',
'source' => htmlspecialchars($f),
);
}
}
$sret ['list'] = $savelist;
}
return json_encode($sret);
}
}