<?php
/**
* Created by JetBrains PhpStorm.
* User: taoqili
* Date: 12-7-18
* Time: 上午11: 32
* UEditor编辑器通用上传类
*/
class Uploader
{
private $fileField; //文件域名
private $file; //文件上传对象
private $base64; //文件上传对象
private $config; //配置信息
private $oriName; //原始文件名
private $fileName; //新文件名
private $fullName; //完整文件名,即从当前配置目录开始的URL
private $filePath; //完整文件名,即从当前配置目录开始的URL
private $fileSize; //文件大小
private $fileType; //文件类型
private $stateInfo; //上传状态信息,
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不正确",
"INVALID_URL" => "非法 URL",
"INVALID_IP" => "非法 IP"
);
/**
* 构造函数
* @param string $fileField 表单名称
* @param array $config 配置项
* @param bool $base64 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名
*/
public function __construct($fileField, $config, $type = "upload")
{
$this->fileField = $fileField;
$this->config = $config;
$this->type = $type;
if ($type == "remote") {
$this->saveRemote();
} else if($type == "base64") {
$this->upBase64();
} else {
$this->upFile();
}
$this->stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']);
}
/**
* 上传文件的主处理方法
* @return mixed
*/
private function upFile()
{
$file = $this->file = $_FILES[$this->fileField];
if (!$file) {
$this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");
return;
}
if ($this->file['error']) {
$this->stateInfo = $this->getStateInfo($file['error']);
return;
} else if (!file_exists($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");
return;
} else if (!is_uploaded_file($file['tmp_name'])) {
$this->stateInfo = $this->getStateInfo("ERROR_TMPFILE");
return;
}
$this->oriName = $file['name'];
$this->fileSize = $file['size'];
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//检查是否不允许的文件格式
if (!$this->checkType()) {
$this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 处理base64编码的图片上传
* @return mixed
*/
private function upBase64()
{
$base64Data = $_POST[$this->fileField];
$img = base64_decode($base64Data);
$this->oriName = $this->config['oriName'];
$this->fileSize = strlen($img);
$this->fileType = $this->getFileExt();
$this->fullName = $this->getFullName();
$this->filePath = $this->getFilePath();
$this->fileName = $this->getFileName();
$dirname = dirname($this->filePath);
//检查文件大小是否超出限制
if (!$this->checkSize()) {
$this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");
return;
}
//创建目录失败
if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) {
$this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");
return;
} else if (!is_writeable($dirname)) {
$this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");
return;
}
//移动文件
if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败
$this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");
} else { //移动成功
$this->stateInfo = $this->stateMap[0];
}
}
/**
* 拉取远程图片
* @return mixed
*/
private function saveRemote()
{
$imgUrl = htmlspecialchars($this->fileField);
$imgUrl = str_replace("&", "&", $imgUrl);
//http开头验证
if (strpos($imgUrl, "http") !== 0) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK");
return;
}
preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches);
$host_with_protocol = count($matches) > 1 ? $matches[1] : '';
// 判断是否是合法 url
if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) {
$this->stateInfo = $this->getStateInfo("INVALID_URL");
return;
}
preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches);
$host_without_protocol = count($matches) > 1 ? $matches[1] : '';
// 此时提取出来的可能是 ip 也有可能是域名,先获取 ip
$ip = gethostbyname($host_without_protocol);
// 判断是否是私有 ip
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) {
$this->stateInfo = $this->getStateInfo("INVALID_IP");
return;
}
//获取请求头并检测死链
$heads = get_headers($imgUrl, 1);
if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) {
$this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK");
return;
}
//格式验证(扩展名验证和Content-Type验证)
$fileType = strtolower(strrchr($imgUrl, '.'));
if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) {
$this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE");
return;
}
//打开输出缓冲区�
gis分享者
- 粉丝: 8632
- 资源: 85
最新资源
- 自制太阳能手机充电器设计资料.zip
- 自制实用多功能编程器资料.zip
- "30吨双级反渗透纯水系统:西门子S7-编程实现,自动化一键操作,全流程透明化处理",30吨双级反渗透程序,纯水程序,软化水程序以及阻垢剂、杀菌剂加药 一键制水,一键反洗,一键正洗,无人值守 西门
- VSC整流系统定功率控制仿真模型:MATLAB支持的先进控制系统模拟机制,VSC整流系统定功率控制系统仿真模型,支持MATLAB2014a及以上版本 ,VSC整流系统; 定功率控制; 仿真模型; MA
- 关于自动化制水技术的35吨反渗透纯水程序系统设计及实现介绍,35吨反渗透程序,纯水程序 一键制水,一键反洗,一键正洗,无人值守 程序,画面+电气原理图 程序有注释 ,核心关键词:35吨反渗透
- 西门子1200PLC通过Profinet控制V90伺服功能块程序详解:从梯形图到SCL高级编程,附报文文档与操作指南,1200plc通过pn总线控制v90程序 此程序是关于西门子1200PLC以pr
- 图像分割技术在医学领域的应用:脑部CT白质分割与视网膜血管提取,图像分割例如可以对脑部CT的图像进行处理,把大脑白质部分分割出来 或者是视网膜的血管提取 ,图像分割; 脑部CT; 大脑白质分割;
- 基于STM32的数控恒压恒流电源设计方案详解:从市电到稳压输出的调整过程与实现原理,基于stm32的数控恒压恒流电源设计方案 基于stm32的数控恒压恒流电源设计方案 不包实物,可自己动手制作,可代做
- 永磁同步电机的弱磁控制与凸极电机Simulink仿真模型研究,同步电机仿真永磁同步电机 弱磁控制 simulink仿真模型 凸极电机 前馈控制 MTPA控制 控制策略采用的是基速以下最大转矩电流
- 昆仑通泰暖通空调中央空调西门子方案控制组态程序:全面适配,智能控制,昆仑通泰暖通空调中央空调控制组态程序,适用于绝大多数西门子方案暖通空调自控系统 ,核心关键词:昆仑通泰;暖通空调;中央空调;控制组
- 步进电机矢量控制及foc控制策略的Simulink仿真模型研究,步进电机矢量控制simulink仿真模型,步进电机foc控制 ,核心关键词:步进电机; 矢量控制; Simulink仿真模型; FOC
- 关于西门子S7-200 Smart系列控制器实现的反渗透+混床程序纯水项目实例介绍,60吨反渗透+混床程序 西门子200 smart 编写程序,西门子smart line触摸屏上位机组态 带模拟量
- 三菱PLC与威纶触摸屏组成的中央空调冷却水塔变频节能控制系统:温度采集与PID手动调整功能,plc触摸屏程序,中央空调冷却水塔变频节能控制系统,温度采集,PID手动调整,变频与工频交控制,触摸屏plc
- "淘客云:全开源淘客系统源码搭建部署一站式服务,原生开发技术支持与首年免费更新",-成品全开源淘客系统 -源码,全开源,无加密,原生开发,支持二开 -提供搭建部署,参数申请,配置打包全站式服务 -提供
- Abaqus晶体塑性黄永刚版子程序后处理插件:晶体取向分析与管理,支持多种平均方式,自定义输出格式并支持Excel与MTEX集成绘图,Abaqus 晶体塑性黄永刚版子程序后处理插件 用于晶体取向,提
- 精准伺服电机追标与变速控制程序:平稳起步、灵活调整加速度与减速度,同步追标并返回原点,追切,追剪,追标,关键程序,细心看视频,演示的是平稳起步,中间变过几次速度,然后平稳停止,再按相应的脉冲反回原点
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈