~~~
<?php
/**
* 上传工具类,单文件直接实列化请求UploadFile,多文件请求uploadMulti
* 同时提供了一些对外界修改参数的函数
*/
class Upload {
private $_error; // 存储当前错误信息
private $_upload_path; // 上传目录
private $_prefix; // 前缀
private $_max_size; // 最大size
private $_ext_list; // 允许的后缀列表
private $_mime_list; // 允许的MIME列表
private $_ext_mime = array( // 图片对应的MIME表
'.jpeg' => 'image/jpeg',
'.jpg' => 'image/jpeg',
'.png' => 'image/png',
'.gif' => 'image/gif'
);
public function __construct() {
// 为选项指定默认值
$this->_error = array();
$this->_upload_path = './';
$this->_prefix = '';
$this->_max_size = 5 * 1024 * 1024;
$this->_ext_list = array('.jpg', '.gif', '.png', '.jpeg');
$this->_setMIMEList($this->_ext_list);
}
/**
* 通过允许的后缀列表获得相对应允许的MIME列表
* @param string $ext_list 允许的后缀列表
* @return void 赋值到 MIME列表属性上
*/
private function _setMIMEList($ext_list) {
$mime_list = array();
// 遍历获得每一个后缀名
foreach($ext_list as $ext) {
// 利用当前后缀名,获取对应的MIME,存储到MIME列表中!
$mime_list[] = $this->_ext_mime[$ext];
}
// 赋值到 MIME列表属性上!
$this->_mime_list = $mime_list;
}
//下面的提供修改这些配置属性的方法:setUploadPath setPrefix setMaxSize setExtList
/**
* 提供修改路径的方法
* @access public
* @param string $upload 目录字符串 默认'./'
* @return void 目录不存在采用默认,存在采用传入的参数
*/
public function setUploadPath($upload_path) {
// 不允许将不存在的目录设置为上传目录
if (is_dir($upload_path)) {
$this->_upload_path = $upload_path;
} else {
trigger_error('上传目录设置失败,采用默认');
}
}
/**
* 提供修改前缀的方法
* @access public
* @param string $prefix 默认''
* @return void 把传入的前缀保存到_prefix
*/
public function setPrefix($prefix) {
$this->_prefix = $prefix;
}
/**
* 提供修改最大大小的方法
* @access public
* @param int $max_size 最大大小 默认1*1024*1024
* @return void 将传入的尺寸保存到_max_size
*/
public function setMaxSize($max_size) {
$this->_max_size = $max_size;
}
/**
* 提供修改允许的后缀名列表
* @param array $ext_list 后缀名组成的数组,默认array('.jpg', '.gif', '.png', '.jpeg');
* @return void 将传入的数组保存到_ext_list,并调用_setMIMEList方法生成对应的MIME类型
*/
public function setExtList($ext_list) {
$this->_ext_list = $ext_list;
$this->_setMIMEList($ext_list);
}
/**
* 文件上传(业务逻辑判断)函数
* 一次上传(判断)一个文件
* @param array $file_info 某个临时上传文件的5个信息,由$_FILES中获得!
* @return string:成功,目标文件名;false: 失败
*/
public function uploadFile($file_info) {
// 判断是否有错误
if ($file_info['error'] != 0) {
$this->_error[] = '上传文件存在错误';
return false;
}
// 判断文件类型
// 后缀名
$ext_list = $this->_ext_list; // 允许的后缀名列表
$ext = strrchr($file_info['name'], '.');
if (! in_array($ext, $ext_list)) {
$this->_error[] = '类型,后缀不合法';
return false;
}
// MIME
$mime_list = $this->_mime_list; // 允许的mime列表!
if (! in_array($file_info['type'], $mime_list)) {
$this->_error[] = '类型,MIME不合法';
return false;
}
// PHP检测MIME
$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($file_info['tmp_name']);
if (! in_array($mime_type, $mime_list)) {
$this->_error[] = '类型,PHP检测MIME不合法';
return false;
}
// 判断大小
$max_size = $this->_max_size; // 允许的最大尺寸
if ($file_info['size'] > $max_size) {
$this->_error[] = '文件过大';
return false;
}
// 设置目标文件地址
// 上传目录
$upload_path = $this->_upload_path;
// 采用子目录存储
// 获取当前需要的子目录名(目录/小时)
$sub_dir = date('YmdH') . '/'; // 当前的年月日时
// 是否存在
if (! is_dir($upload_path . $sub_dir)) {
// 不存在,创建
mkdir($upload_path . $sub_dir);
}
// 目标文件名
$prefix = $this->_prefix;// 前缀
$dst_name = uniqid($prefix, true) . $ext;
// 是否为HTTP上传文件的检测
if (! is_uploaded_file($file_info['tmp_name'])) {
$this->_error = '不是HTTP上传的临时文件';
return false;
}
// 移动!
if (move_uploaded_file($file_info['tmp_name'], $upload_path . $sub_dir . $dst_name)) {
// 移动成功
return $sub_dir . $dst_name; // 仅仅返回 上传目录之后的地址即可!
} else {
$this->_error = '移动失败';
return false;
}
}
/**
* 获取错误信息
* @access public
* @return string 错误信息
*/
public function getError() {
return $this->_error;
}
//示范多文件上传处理,name相同的情况
//$arrFile = array();
//$i=0;
//foreach($file as $key=>$value){ 二维数组
// foreach($value as $val){ 一维数组
// $arrFile[$i++][$key] = $val;
// }
// $i = 0;
//}
//name 取出每个名字 $arr[0~3][name]
//type 取出每个类型 $arr[0~3][type]
//tmp_name 取出每个上传的位置 $arr[0~3][tmp_name]
//error 取出每个错误信息 $arr[0~3][error]
//size 取出每个大小 $arr[0~3][size]
/**
* 上传文件判断函数,多文件上传,name值不同
* @param array $file_list 比如:$_FILES['image'] 二维数组
* @return 返回上传目录之后的地址结果
*/
function uploadMulti($file_list) {
// 遍历,其中的name元素,得到下标,下面看不懂看177-189
foreach($file_list['name'] as $key=>$v) { //传进来的$file_list是二维数组
// 利用下标 获得对应的5个元素值
// $file_info每个文件的信息,$key是0开始的整数
$file_info['name'] = $file_list['name'][$key];
$file_info['type'] = $file_list['type'][$key];
$file_info['tmp_name'] = $file_list['tmp_name'][$key];
$file_info['error'] = $file_list['error'][$key];
$file_info['size'] = $file_list['size'][$key];
// 上传该文件即可!
// 并存储每个文件的上传结果,与$key对应!
$result_list[$key] = $this->uploadFile($file_info);
}
// 返回上传结果
return $result_list;
}
}
~~~
- OAuth
- 简介
- 步骤
- 单点登录
- .user.ini
- 时间转换为今天昨天前天几天前
- 获取ip接口
- 协程
- 概念
- yield-from && return-values
- 协程与阻塞的思考
- 中间件
- mysqli异步与php的协程
- 代码片段
- pdo 执行的sql语句
- 二进制安全
- 捕捉异常中断
- global
- 利用cookie模拟登陆
- 解析非正常json
- 简单的对称加密算法
- RSA 加密
- 过滤掉emoji表情
- 判断远程图片是否存在
- 一分钟限制请求100次
- 文件处理
- 多文件上传
- 显示所有文件
- 文件下载和上面显示所有文件配合
- 文件的删除,统计,存数组等
- 图片处理
- 简介
- 验证码
- 图片等比缩放
- 批量添加水印
- beanstalkd
- 安装
- 使用
- RabbitMQ
- 简介
- debain安装
- centos安装
- 常用方法
- 入门
- 工作队列
- 订阅,发布
- 路由
- 主题
- 远程调用RPC
- 消息中间件的选型
- .htaccess
- isset、empty、if区别以及0、‘’、null
- php各版本
- php7.2 不向后兼容的改动
- php中的各种坑
- php7改变
- php慢日志
- 邮件
- PHPMailer实现发邮件
- 验证邮件地址真实性
- 文件下载
- FastCgi 与 PHP-fpm 之间的关系
- openssl 加解密
- 反射
- 钩子方法
- 查找插件
- opcode
- opcache使用
- opcache优化
- 分布式一致性hash算法
- 概念
- 哈希算法好坏的四个定义
- php实现
- java实现
- 数组
- jwt
- jwt简介
- 单点登录
- phpize
- GeoIP扩展
- php无法获得https网页内容的解决方案
- homestead运行的脚本
- Unicode和Utf-8转换
- php优化
- kafka
- fpm配置
- configure配置详解