<?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;
}
//打开输出缓冲区�
没有合适的资源?快使用搜索试试~ 我知道了~
作业系统 (Javaweb)项目代码.zip
共1647个文件
png:439个
js:364个
gif:260个
0 下载量 110 浏览量
2025-01-01
17:41:44
上传
评论
收藏 24.45MB ZIP 举报
温馨提示
java作业系统 (Javaweb)项目代码.zip
资源推荐
资源详情
资源评论
收起资源包目录
作业系统 (Javaweb)项目代码.zip (1647个子文件)
.classpath 2KB
mvnw.cmd 6KB
style.css 148KB
style.css 148KB
bootstrap.min.css 138KB
bootstrap.min.css 138KB
bootstrap.min.css 137KB
bootstrap.min.css 137KB
bootstrap.min.css 120KB
bootstrap.min.css 120KB
animate.css 69KB
animate.css 69KB
thinker-md.vendor.css 50KB
thinker-md.vendor.css 50KB
ueditor.css 43KB
ueditor.css 43KB
ueditor.min.css 34KB
ueditor.min.css 34KB
font-awesome.min.css 30KB
font-awesome.min.css 30KB
font-awesome.min.css 26KB
font-awesome.min.css 26KB
bootstrap-responsive.css 22KB
bootstrap-responsive.css 22KB
video-js.css 21KB
video-js.css 21KB
image.css 18KB
image.css 18KB
video.css 15KB
video.css 15KB
attachment.css 14KB
attachment.css 14KB
style.css 12KB
style.css 12KB
video-js.min.css 11KB
video-js.min.css 11KB
summernote.css 10KB
summernote.css 10KB
component-chosen.min.css 10KB
component-chosen.min.css 10KB
shCoreDefault.css 7KB
shCoreDefault.css 7KB
toastr.min.css 6KB
toastr.min.css 6KB
news.css 5KB
news.css 5KB
scrawl.css 4KB
scrawl.css 4KB
codemirror.css 3KB
codemirror.css 3KB
reset.css 3KB
reset.css 3KB
charts.css 3KB
charts.css 3KB
background.css 2KB
background.css 2KB
cropbox.css 2KB
cropbox.css 2KB
blog.css 2KB
blog.css 2KB
emotion.css 2KB
emotion.css 2KB
login.css 2KB
login.css 2KB
dialogbase.css 2KB
dialogbase.css 2KB
music.css 2KB
music.css 2KB
nprogress.css 1KB
nprogress.css 1KB
bootstrap-tagsinput.css 1KB
bootstrap-tagsinput.css 1KB
edittable.css 1KB
edittable.css 1KB
template.css 1KB
template.css 1KB
signin.css 767B
signin.css 767B
webuploader.css 515B
webuploader.css 515B
help.css 389B
help.css 389B
thymeleaf-bootstrap-paginator.css 274B
thymeleaf-bootstrap-paginator.css 274B
tether.min.css 237B
tether.min.css 237B
pricing.css 211B
pricing.css 211B
navbar.css 69B
navbar.css 69B
iframe.css 41B
iframe.css 41B
fontawesome-webfont.eot 67KB
fontawesome-webfont.eot 67KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regular.eot 20KB
vjs.eot 3KB
vjs.eot 3KB
UEditorSnapscreen.exe 508KB
UEditorSnapscreen.exe 508KB
共 1647 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
资源评论
yava_free
- 粉丝: 5268
- 资源: 2020
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 数据结构数据结构代码(仅供参考)PDF
- 基于matlab的对于wav格式振动信号的处理程序
- 机器学习(图像识别):支持中风后康复锻炼的运动验证和重复计数跟踪研究
- 数据库-数据库技术PDF
- 车辆紧急防避撞AEB控制,模型包含建立驾驶员制动模型来模拟制动过程,同时加入模糊控制实现期望减速度的计算,加入纵向发动机逆动力学模型实时求解期望节气门开度,驱动与制动的切控制,以及制动压力与减速度之间
- 生成式 AI00什么是扩散模型?
- 跨平台 Python 安装指南:适用于 Windows、macOS 和 Linux 的详细步骤与配置方法
- 机器学习(预测模型):特斯拉公司从1995年到2024年的历史股票价格信息
- 汇川中型plc+纯ST语言双轴同步设备,程序中没有使用任何库文件,纯原生codesys功能块 非常适合初学入门者,三个驱动模拟虚主轴和两个伺服从轴,只要手里有汇川AM400,600,AC700,80
- IF开环启动切龙伯格观测器 Matlab simulink仿真搭建模型: 提供以下帮助 波形纪录 参考文献 仿真文件 原理解释 电机参数说明 仿真原理结构和整体框图
- 机器学习(预测模型):2024年全球2000家最大公司财务数据
- SCR Battery Test
- COMSOL 5.6 模型:煤与瓦斯气固耦合、渗流模型、扩散模型、CO2驱替甲烷模型、钻孔流固耦合模型、钻孔抽采瓦斯模型 以上模型案例以及建模教学视频 附加其他各种学习教材和学习案例库 全部打包
- python-32.排序-真的,就是排序.py
- python-33.到天宫做客-体现太空电梯的重要性~.py
- python-34.数列分段 Section I-裁.py
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功