mirror of https://github.com/helloxz/imgurl.git
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.
440 lines
17 KiB
440 lines
17 KiB
<?php |
|
/* |
|
name:ImgURL上传控制器 |
|
author:xiaoz.me |
|
QQ:337003006 |
|
*/ |
|
|
|
//允许跨域请求 |
|
header("Access-Control-Allow-Origin: *"); |
|
defined('BASEPATH') OR exit('No direct script access allowed'); |
|
|
|
class Upload extends CI_Controller{ |
|
//声明上传文件路径 |
|
public $upload_path; |
|
//声明文件相对路径 |
|
public $relative_path; |
|
public $image_lib; |
|
//当前时间 |
|
public $date; |
|
//设置临时目录 |
|
public $temp; |
|
//用户是否已经登录的属性 |
|
protected $user; |
|
//构造函数 |
|
public function __construct() |
|
{ |
|
parent::__construct(); |
|
//设置上传文件路径 |
|
$this->upload_path = FCPATH.'imgs/'.date('Y',time()).'/'.date('m',time()).'/'; |
|
$this->upload_path = str_replace('\\','/',$this->upload_path); |
|
$this->relative_path = "/imgs/".date('Y',time()).'/'.date('m',time()).'/'; |
|
$this->relative_path = str_replace('\\','/',$this->relative_path); |
|
$this->temp = FCPATH.'data/temp/'; |
|
//如果文件夹不存在,则创建文件夹 |
|
if(!is_dir($this->upload_path)){ |
|
//递归模式创建目录 |
|
mkdir($this->upload_path,0777,TRUE); |
|
} |
|
$this->date = date('Y-m-d H:i',time()); |
|
//加载辅助函数 |
|
$this->load->helper('basic'); |
|
$ip = get_ip(); |
|
//加载基本类 |
|
$this->load->library('basic'); |
|
//加载查询模型 |
|
$this->load->model('query','',TRUE); |
|
//用户已经登录 |
|
if($this->basic->is_login(FALSE)){ |
|
$this->user = 'admin'; |
|
} |
|
else{ |
|
$this->user = 'visitor'; |
|
//限制上传数量 |
|
if($this->query->uplimit($ip) === FALSE){ |
|
$this->error_msg("上传达到上限!"); |
|
} |
|
} |
|
} |
|
//通用上传设置 |
|
protected function config($upload_path = ''){ |
|
//设置上传路径 |
|
if($upload_path == ''){ |
|
$upload_path = $this->upload_path; |
|
} |
|
// var_dump(); |
|
$config['upload_path'] = $upload_path; |
|
$config['allowed_types'] = 'gif|jpg|jpeg|png|bmp|webp'; |
|
$config['max_size'] = 5120; |
|
$config['file_ext_tolower'] = TRUE; //文件名转换为小写 |
|
$config['overwrite'] = TRUE; //覆盖同名文件 |
|
$config['encrypt_name'] = TRUE; //随机命名图片 |
|
return $config; |
|
} |
|
public function localhost($type = 'json'){ |
|
//加载上传的配置选项 |
|
$config = $this->config(); |
|
//加载上传类 |
|
$this->load->library('upload', $config); |
|
|
|
//上传失败 |
|
if ( ! $this->upload->do_upload('file')) |
|
{ |
|
$msg = $this->upload->display_errors(); |
|
$msg = strip_tags($msg); |
|
|
|
$this->error_msg($msg); |
|
} |
|
else |
|
{ |
|
$data = $this->upload->data(); |
|
//加载模型 |
|
$this->load->model('insert','',TRUE); |
|
$this->load->model('query','',TRUE); |
|
//计算文件MD5 |
|
$file_name = md5_file($data['full_path']); |
|
$file_name = substr($file_name,8,16); |
|
//图片唯一ID |
|
$imgid = $file_name; |
|
$file_name = $file_name.$data['file_ext']; |
|
//新图片完整路径 |
|
$full_path = $this->upload_path.$file_name; |
|
$full_path = str_replace("\\","/",$full_path); |
|
//新图片相对路径 |
|
$relative_path = $this->relative_path.$file_name; |
|
//缩略图相对路径 |
|
$thumbnail_path = $this->relative_path.$imgid.'_thumb'.$data['file_ext']; |
|
//获取域名 |
|
$domain = $this->query->domain('localhost'); |
|
|
|
//获取图片URL地址 |
|
$url = $domain.$relative_path; |
|
//缩略图地址 |
|
$thumbnail_url = $domain.$thumbnail_path; |
|
|
|
//重命名文件 |
|
rename($data['full_path'],$full_path); |
|
|
|
//生成缩略图 |
|
$this->load->library('image'); |
|
if(!$this->image->thumbnail($full_path,290,175)){ |
|
//像素太小就不生产缩略图 |
|
$thumbnail_url = $domain.$relative_path; |
|
} |
|
|
|
//CI获取获取.bmp 图片的像素,认为.bmp不是图像类型,改用其它方法获取像素 |
|
if(($data['file_type'] == 'image/x-ms-bmp') OR ($data['file_type'] == 'image/webp')){ |
|
$tmpinfo = getimagesize($full_path); |
|
$data['image_width'] = $tmpinfo[0]; |
|
$data['image_height'] = $tmpinfo[1]; |
|
} |
|
|
|
//查询图片是否上传过 |
|
if($imginfo = $this->query->repeat($imgid)){ |
|
$id = $imginfo->id; |
|
//重组数组 |
|
$info = array( |
|
"code" => 200, |
|
"id" => $id, |
|
"imgid" => $imgid, |
|
"relative_path" => $relative_path, |
|
"url" => $url, |
|
"thumbnail_url" => $thumbnail_url, |
|
"width" => $data['image_width'], |
|
"height" => $data['image_height'] |
|
); |
|
//$this->succeed_msg($info); |
|
//根据不同的类型返回不同的数据 |
|
$this->re_data($type,$info); |
|
} |
|
//图片没有上传过 |
|
else{ |
|
//需要插入到images表的数据 |
|
$datas = array( |
|
"imgid" => $imgid, |
|
"path" => $relative_path, |
|
"thumb_path"=> $thumbnail_path, |
|
"storage" => "localhost", |
|
"ip" => get_ip(), |
|
"ua" => get_ua(), |
|
"date" => $this->date, |
|
"user" => $this->user, |
|
"level" => 'unknown' |
|
); |
|
//需要插入到imginfo表的数据 |
|
$imginfo = array( |
|
"imgid" => $imgid, |
|
"mime" => $data['file_type'], |
|
"width" => $data['image_width'], |
|
"height" => $data['image_height'], |
|
"ext" => $data['file_ext'], |
|
"client_name" => $data['client_name'] |
|
); |
|
|
|
//插入数据到img_images表 |
|
$id = $this->insert->images($datas); |
|
$this->insert->imginfo($imginfo); |
|
//重组数组 |
|
$info = array( |
|
"code" => 200, |
|
"id" => $id, |
|
"imgid" => $imgid, |
|
"relative_path" => $relative_path, |
|
"url" => $url, |
|
"thumbnail_url" => $thumbnail_url, |
|
"width" => $data['image_width'], |
|
"height" => $data['image_height'] |
|
); |
|
//根据不同的类型返回不同的数据 |
|
$this->re_data($type,$info); |
|
} |
|
} |
|
} |
|
//根据不同的类型返回不同的数据 |
|
protected function re_data($type,$info){ |
|
$url = $info['url']; |
|
switch ($type) { |
|
case 'json': |
|
$this->succeed_msg($info); |
|
break; |
|
case 'url': |
|
echo $url; |
|
break; |
|
case 'html': |
|
echo "<img src = '$url' />"; |
|
break; |
|
case 'markdown': |
|
echo "![]($url)"; |
|
break; |
|
case 'bbcode': |
|
echo "[img]".$url."[/img]"; |
|
break; |
|
default: |
|
$this->succeed_msg($info); |
|
break; |
|
} |
|
} |
|
//上传成功返回json |
|
protected function succeed_msg($data){ |
|
$info = json_encode($data); |
|
echo $info; |
|
exit; |
|
} |
|
//上传失败返回json |
|
protected function error_msg($msg){ |
|
$data = array( |
|
"code" => 0, |
|
"msg" => $msg |
|
); |
|
|
|
$data = json_encode($data); |
|
echo $data; |
|
exit; |
|
} |
|
//URL上传 |
|
public function url(){ |
|
$url = @$this->input->post('url',TRUE); |
|
$url = trim($url); |
|
//检测用户是否登录 |
|
$this->load->library('basic'); |
|
$this->basic->is_login(TRUE); |
|
//判断URL是否合法 |
|
if(!filter_var($url, FILTER_VALIDATE_URL)){ |
|
$this->error_msg('不是有效的URL地址!'); |
|
} |
|
//继续执行 |
|
//获取图片后缀名 |
|
$url_arr = explode('.',$url); |
|
$ext = strtolower(end($url_arr)); |
|
|
|
|
|
//判断是否是允许的后缀 |
|
switch($ext){ |
|
case 'png': |
|
case 'jpg': |
|
case 'jpeg': |
|
case 'bmp': |
|
case 'gif': |
|
case 'bmp': |
|
break; |
|
default: |
|
$this->error_msg('不是有效的图片地址!'); |
|
exit; |
|
} |
|
|
|
//继续执行 |
|
//下载图片 |
|
$pic_data = $this->basic->dl_pic($url); |
|
//临时文件路径 |
|
$tmp_name = $this->temp.md5($url); |
|
//写入临时文件 |
|
file_put_contents($tmp_name,$pic_data); |
|
//计算文件MD5 |
|
$imgid = md5_file($tmp_name); |
|
$imgid = substr($imgid,8,16); |
|
$file_name = $imgid.'.'.$ext; |
|
//图片相对路径 |
|
$relative_path = $this->relative_path.$file_name; |
|
$ext = '.'.$ext; |
|
//查询图片是否已经上传过 |
|
if($this->query->repeat($imgid)){ |
|
//删除临时文件 |
|
unlink($tmp_name); |
|
$this->error_msg('文件已经上传过!'); |
|
exit; |
|
} |
|
//没有上传过继续执行 |
|
//复制图片到上传目录 |
|
$full_path = $this->upload_path.$file_name; |
|
copy($tmp_name,$full_path); |
|
//删除临时文件 |
|
unlink($tmp_name); |
|
//生成缩略图 |
|
$this->load->library('image'); |
|
$this->image->thumbnail($full_path,290,175); |
|
|
|
//获取图片信息 |
|
$img_info = getimagesize($full_path); |
|
//缩略图相对地址 |
|
$thumbnail_path = $this->relative_path.$imgid.'_thumb'.$ext; |
|
|
|
//需要插入到images表的数据 |
|
$datas = array( |
|
"imgid" => $imgid, |
|
"path" => $relative_path, |
|
"thumb_path"=> $thumbnail_path, |
|
"storage" => "localhost", |
|
"ip" => get_ip(), |
|
"ua" => get_ua(), |
|
"date" => $this->date, |
|
"user" => $this->user, |
|
"level" => 'unknown' |
|
); |
|
//需要插入到imginfo表的数据 |
|
$imginfo = array( |
|
"imgid" => $imgid, |
|
"mime" => $img_info['mime'], |
|
"width" => $img_info[0], |
|
"height" => $img_info[1], |
|
"ext" => $ext, |
|
"client_name" => $file_name |
|
); |
|
//加载数据库模型 |
|
$this->load->model('insert','',TRUE); |
|
//插入数据到img_images表 |
|
$id = $this->insert->images($datas); |
|
$this->insert->imginfo($imginfo); |
|
//获取域名 |
|
$domain = $this->query->domain('localhost'); |
|
//获取图片URL地址 |
|
$url = $domain.$relative_path; |
|
//返回成功的信息 |
|
$re = array( |
|
"code" => 200, |
|
"msg" => $url |
|
); |
|
$re = json_encode($re); |
|
echo $re; |
|
} |
|
//粘贴上传 |
|
public function parse(){ |
|
$date = date('Y-m-d H:i:s',time()); |
|
//临时文件名 |
|
$tmp_name = get_ip().get_ua().$date; |
|
$tmp_name = md5($tmp_name); |
|
//图片临时路径 |
|
$tmp_file = $this->temp.$tmp_name; |
|
//接接收ase64图片 |
|
$picfile = $_POST['content']; |
|
$picfile = base64_decode($picfile); |
|
//echo $picfile; |
|
//存储图片 |
|
file_put_contents($tmp_file, $picfile); |
|
|
|
//判断图片MIME类型 |
|
if(!mime($tmp_file)){ |
|
unlink($tmp_file); |
|
$this->error_msg('不允许的文件类型!'); |
|
exit; |
|
} |
|
//继续执行 |
|
//计算文件MD5 |
|
$imgid = md5_file($tmp_file); |
|
$imgid = substr($imgid,8,16); |
|
//获取文件后缀 |
|
$ext = ext($tmp_file); |
|
$file_name = $imgid.$ext; |
|
//图片相对路径 |
|
$relative_path = $this->relative_path.$file_name; |
|
//图片完整路径 |
|
$full_path = $this->upload_path.$file_name; |
|
//查询图片是否已经上传过 |
|
if($this->query->repeat($imgid)){ |
|
//删除临时文件 |
|
unlink($tmp_file); |
|
$this->error_msg('文件已经上传过!'); |
|
exit; |
|
} |
|
//没有上传过继续执行 |
|
//复制图片到上传目录 |
|
copy($tmp_file,$full_path); |
|
$file_name = $imgid.$ext; |
|
//删除临时文件 |
|
unlink($tmp_file); |
|
//生成缩略图 |
|
$this->load->library('image'); |
|
$this->image->thumbnail($full_path,290,175); |
|
//缩略图地址 |
|
$thumbnail_path = $this->relative_path.$imgid.'_thumb.'.$ext; |
|
|
|
//获取图片信息 |
|
$img_info = getimagesize($full_path); |
|
|
|
//需要插入到images表的数据 |
|
$datas = array( |
|
"imgid" => $imgid, |
|
"path" => $relative_path, |
|
"thumb_path"=> $thumbnail_path, |
|
"storage" => "localhost", |
|
"ip" => get_ip(), |
|
"ua" => get_ua(), |
|
"date" => $this->date, |
|
"user" => $this->user, |
|
"level" => 'unknown' |
|
); |
|
//需要插入到imginfo表的数据 |
|
$imginfo = array( |
|
"imgid" => $imgid, |
|
"mime" => $img_info['mime'], |
|
"width" => $img_info[0], |
|
"height" => $img_info[1], |
|
"ext" => $ext, |
|
"client_name" => $file_name |
|
); |
|
//加载数据库模型 |
|
$this->load->model('insert','',TRUE); |
|
//插入数据到img_images表 |
|
$id = $this->insert->images($datas); |
|
$this->insert->imginfo($imginfo); |
|
//获取域名 |
|
$domain = $this->query->domain('localhost'); |
|
//获取图片URL地址 |
|
$url = $domain.$relative_path; |
|
$thumbnail_url = $domain.$this->relative_path.$imgid.'_thumb'.$ext; |
|
//返回成功的信息 |
|
//重组数组 |
|
$info = array( |
|
"code" => 200, |
|
"id" => $id, |
|
"imgid" => $imgid, |
|
"relative_path" => $relative_path, |
|
"url" => $url, |
|
"thumbnail_url" => $thumbnail_url, |
|
"width" => $img_info[0], |
|
"height" => $img_info[1] |
|
); |
|
$this->succeed_msg($info); |
|
//echo $re; |
|
} |
|
} |
|
?>
|