www.legu.cc/application/Asset/Controller/UeditorController.class.php
2021-09-06 11:50:33 +08:00

350 lines
10 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Asset\Controller;
use Think\Controller;
class UeditorController extends Controller {
private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化
"SUCCESS", //上传成功标记在UEditor中内不可改变否则flash判断会出错
"文件大小超出 upload_max_filesize 限制",
"文件大小超出 MAX_FILE_SIZE 限制",
"文件未被完整上传",
"没有文件被上传",
"上传文件为空",
"ERROR_TMP_FILE" => "临时文件错误",
"ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件",
"ERROR_SIZE_EXCEED" => "文件大小超出网站限制",
"ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许",
"ERROR_CREATE_DIR" => "目录创建失败",
"ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限",
"ERROR_FILE_MOVE" => "文件保存时出错",
"ERROR_FILE_NOT_FOUND" => "找不到上传文件",
"ERROR_WRITE_CONTENT" => "写入文件内容错误",
"ERROR_UNKNOWN" => "未知错误",
"ERROR_DEAD_LINK" => "链接不可用",
"ERROR_HTTP_LINK" => "链接不是http链接",
"ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确"
);
public function _initialize() {
$adminid=sp_get_current_admin_id();
$userid=sp_get_current_userid();
if(empty($adminid) && empty($userid)){
exit("非法上传!");
}
}
public function imageManager(){
error_reporting(E_ERROR|E_WARNING);
$path = 'upload'; //最好使用缩略图地址,否则当网速慢时可能会造成严重的延时
$action = htmlspecialchars($_POST["action"]);
if($action=="get"){
$files = $this->getfiles($path);
if(!$files)return;
$str = "";
foreach ($files as $file) {
$str .= $file."ue_separate_ue";
}
echo $str;
}
}
// 百度编辑器文件上传
public function upload(){
error_reporting(E_ERROR);
header("Content-Type: application/json; charset=utf-8");
$action = $_GET['action'];
switch ($action) {
case 'config':
$result = $this->_ueditor_config();
break;
/* 上传图片 */
case 'uploadimage':
/* 上传涂鸦 */
case 'uploadscrawl':
$result = $this->_ueditor_upload('image');
break;
/* 上传视频 */
case 'uploadvideo':
$result = $this->_ueditor_upload('video');
break;
/* 上传文件 */
case 'uploadfile':
$result = $this->_ueditor_upload('file');
break;
/* 列出图片 */
case 'listimage':
$result = "";
break;
/* 列出文件 */
case 'listfile':
$result = "";
break;
/* 抓取远程文件 */
case 'catchimage':
$result=$this->_get_remote_image();
break;
default:
$result = json_encode(array('state'=> '请求地址出错'));
break;
}
/* 输出结果 */
if (isset($_GET["callback"]) && false ) {//TODO 跨域上传
if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
} else {
echo json_encode(array(
'state'=> 'callback参数不合法'
));
}
} else {
exit($result) ;
}
}
/**
* 获取远程图片
*/
private function _get_remote_image(){
$source=array();
if (isset($_POST['source'])) {
$source = $_POST['source'];
} else {
$source = $_GET['source'];
}
$item=array(
"state" => "",
"url" => "",
"size" => "",
"title" => "",
"original" => "",
"source" =>""
);
$date=date("Ymd");
//远程抓取图片配置
$config = array(
"savePath" => './'. C("UPLOADPATH")."ueditor/$date/", //保存路径
"allowFiles" => array( ".gif" , ".png" , ".jpg" , ".jpeg" , ".bmp" ) , //文件允许格式
"maxSize" => 3000 //文件大小限制单位KB
);
$storage_setting=sp_get_cmf_settings('storage');
$qiniu_domain=$storage_setting['Qiniu']['domain'];
$no_need_domains=array($qiniu_domain);
$list = array();
foreach ( $source as $imgUrl ) {
$host=str_replace(array('http://','https://'), '', $imgUrl);
$host=explode('/', $host);
$host=$host[0];
if(in_array($host, $no_need_domains)){
continue;
}
$return_img=$item;
$return_img['source']=$imgUrl;
$imgUrl = htmlspecialchars($imgUrl);
$imgUrl = str_replace("&amp;", "&", $imgUrl);
//http开头验证
if(strpos($imgUrl,"http")!==0){
$return_img['state']=$this->stateMap['ERROR_HTTP_LINK'];
array_push( $list , $return_img );
continue;
}
//获取请求头
if(!sp_is_sae()){//SAE下无效
$heads = get_headers( $imgUrl );
//死链检测
if ( !( stristr( $heads[ 0 ] , "200" ) && stristr( $heads[ 0 ] , "OK" ) ) ) {
$return_img['state']=$this->stateMap['ERROR_DEAD_LINK'];
array_push( $list , $return_img );
continue;
}
}
//格式验证(扩展名验证和Content-Type验证)
$fileType = strtolower( strrchr( $imgUrl , '.' ) );
if ( !in_array( $fileType , $config[ 'allowFiles' ] ) || stristr( $heads[ 'Content-Type' ] , "image" ) ) {
$return_img['state']=$this->stateMap['ERROR_HTTP_CONTENTTYPE'];
array_push( $list , $return_img );
continue;
}
//打开输出缓冲区并获取远程图片
ob_start();
$context = stream_context_create(
array (
'http' => array (
'follow_location' => false // don't follow redirects
)
)
);
//请确保php.ini中的fopen wrappers已经激活
readfile( $imgUrl,false,$context);
$img = ob_get_contents();
ob_end_clean();
//大小验证
$uriSize = strlen( $img ); //得到图片大小
$allowSize = 1024 * $config[ 'maxSize' ];
if ( $uriSize > $allowSize ) {
$return_img['state']=$this->stateMap['ERROR_SIZE_EXCEED'];
array_push( $list , $return_img );
continue;
}
$file=uniqid() . strrchr( $imgUrl , '.' );
$savePath = $config[ 'savePath' ];
$tmpName = $savePath .$file ;
//创建保存位置
if ( !file_exists( $savePath ) ) {
mkdir( "$savePath" , 0777 ,true);
}
$file_write_result=sp_file_write($tmpName,$img);
if($file_write_result){
if(C('FILE_UPLOAD_TYPE')=='Qiniu'){
$upload = new \Think\Upload();
$savename="ueditor/$date/".$file;
$uploader_file=array('savepath'=>'','savename'=>$savename,'tmp_name'=>$tmpName);
$result=$upload->getUploader()->save($uploader_file);
if($result){
unlink($tmpName);
$return_img['state']='SUCCESS';
$return_img['url']=sp_get_image_preview_url($savename);
array_push( $list , $return_img );
}else{
$return_img['state']=$this->stateMap['ERROR_WRITE_CONTENT'];
array_push( $list , $return_img );
}
}
if(C('FILE_UPLOAD_TYPE')=='Local'){
$file = C("TMPL_PARSE_STRING.__UPLOAD__")."ueditor/$date/".$file;
$return_img['state']='SUCCESS';
$return_img['url']=$file;
array_push( $list , $return_img );
}
}else{
$return_img['state']=$this->stateMap['ERROR_WRITE_CONTENT'];
array_push( $list , $return_img );
}
}
return json_encode(array(
'state'=> count($list) ? 'SUCCESS':'ERROR',
'list'=> $list
));
}
/**
* 获取百度编辑器配置
*/
private function _ueditor_config(){
$config_text=preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("./public/js/ueditor/config.json"));
$config = json_decode($config_text, true);
$upload_setting=sp_get_upload_setting();
$config['imageMaxSize']=$upload_setting['image']['upload_max_filesize']*1024;
$config['imageAllowFiles']=array_map(array($this,'_ueditor_extension'), explode(",", $upload_setting['image']['extensions']));
$config['scrawlMaxSize']=$upload_setting['image']['upload_max_filesize']*1024;
$config['catcherMaxSize']=$upload_setting['image']['upload_max_filesize']*1024;
$config['catcherAllowFiles']=array_map(array($this,'_ueditor_extension'), explode(",", $upload_setting['image']['extensions']));
$config['videoMaxSize']=$upload_setting['video']['upload_max_filesize']*1024;
$config['videoAllowFiles']=array_map(array($this,'_ueditor_extension'), explode(",", $upload_setting['video']['extensions']));
$config['fileMaxSize']=$upload_setting['file']['upload_max_filesize']*1024;
$config['fileAllowFiles']=array_map(array($this,'_ueditor_extension'), explode(",", $upload_setting['file']['extensions']));
return json_encode($config);
}
/**
* 获取文件后缀名
* @param string $str
*/
public function _ueditor_extension($str){
return ".".trim($str,'.');
}
/**
* 处理文件上传
* @param string $filetype 文件类型,如image,vedio,audio,file
*/
private function _ueditor_upload($filetype='image'){
$upload_setting=sp_get_upload_setting();
$file_extension=sp_get_file_extension($_FILES['upfile']['name']);
$upload_max_filesize=$upload_setting['upload_max_filesize'][$file_extension];
$upload_max_filesize=empty($upload_max_filesize)?2097152:$upload_max_filesize;//默认2M
$allowed_exts=explode(',', $upload_setting[$filetype]);
$date=date("Ymd");
//上传处理类
$config=array(
'rootPath' => './'. C("UPLOADPATH"),
'savePath' => "ueditor/$date/",
'maxSize' => $upload_max_filesize,//10M
'saveName' => array('uniqid',''),
'exts' => $allowed_exts,
'autoSub' => false,
);
$upload = new \Think\Upload($config);//
$file = $title = $oriName = $state ='0';
$info=$upload->upload();
//开始上传
if ($info) {
//上传成功
$title = $oriName = $_FILES['upfile']['name'];
$first=array_shift($info);
$size=$first['size'];
$state = 'SUCCESS';
if(!empty($first['url'])){
if($filetype=='image'){
$url=sp_get_image_preview_url($first['savepath'].$first['savename']);
}else{
$url=sp_get_file_download_url($first['savepath'].$first['savename'],3600*24*365*50);//过期时间设置为50年
}
}else{
$url = C("TMPL_PARSE_STRING.__UPLOAD__").$first['savepath'].$first['savename'];
}
} else {
$state = $upload->getError();
}
$response=array(
"state" => $state,
"url" => $url,
"title" => $title,
"original" =>$oriName,
);
return json_encode($response);
}
}