~~~
<?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配置詳解