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.
161 lines
4.2 KiB
161 lines
4.2 KiB
<?php
|
|
|
|
/**
|
|
* 上传类
|
|
*/
|
|
|
|
namespace libraries;
|
|
|
|
class Upload {
|
|
|
|
/**
|
|
* 上传配置
|
|
* @var array
|
|
*/
|
|
protected $config = array(
|
|
'maxSize' => 1048576, //上传的文件大小限制 默认10M
|
|
'allowExts' => array(), //允许的文件后缀
|
|
'rootPath' => './upload/', //上传根路径
|
|
'savePath' => '', //保存路径
|
|
'saveRule' => 'md5_file', //命名规则
|
|
'driver' => 'Local',
|
|
'driverConfig' => array(),
|
|
);
|
|
|
|
/**
|
|
* 上传文件信息
|
|
* @var array
|
|
*/
|
|
protected $uploadFileInfo = array();
|
|
|
|
/**
|
|
* 错误消息
|
|
* @var string
|
|
*/
|
|
protected $errorMsg = '';
|
|
|
|
/**
|
|
* 构建函数
|
|
* @param array $config 上传配置
|
|
*/
|
|
public function __construct($config = array()) {
|
|
$this->config = array_merge($this->config, $config);
|
|
$this->setDriver();
|
|
}
|
|
|
|
/**
|
|
* 上传配置
|
|
* @param string $key 上传字段
|
|
* @return boolean
|
|
*/
|
|
public function upload($key = '') {
|
|
if(empty($_FILES)) {
|
|
$this->errorMsg = '没有文件上传!';
|
|
return false;
|
|
}
|
|
if(empty($key)) {
|
|
$files = $_FILES;
|
|
} else {
|
|
$files[$key] = $_FILES[$key];
|
|
}
|
|
//上传根目录检查
|
|
if(!$this->uploader->rootPath($this->config['rootPath'])){
|
|
$this->errorMsg = $this->uploader->getError();
|
|
return false;
|
|
}
|
|
//上传目录检查
|
|
$savePath = $this->config['rootPath'] . $this->config['savePath'];
|
|
if(!$this->uploader->checkPath($savePath)){
|
|
$this->errorMsg = $this->uploader->getError();
|
|
return false;
|
|
}
|
|
$num = 0;
|
|
foreach($files as $key =>$file) {
|
|
if( $file['error'] == 4 ) continue;
|
|
$saveRuleFunc = $this->config['saveRule'];
|
|
$pathinfo = pathinfo($file['name']);
|
|
$file['key'] = $key;
|
|
$file['extension'] = strtolower( $pathinfo['extension'] );
|
|
$file['savepath'] = $savePath;
|
|
$file['savename'] = $saveRuleFunc( $file['tmp_name'] ) . '.' . $file['extension'];
|
|
$file['driver'] = $this->config['driver'];
|
|
//检查文件类型大小和合法性
|
|
if (!$this->check($file)) {
|
|
return false;
|
|
}
|
|
//存储文件
|
|
$info = $this->uploader->saveFile($file, $config);
|
|
if(!$info){
|
|
$this->errorMsg = $this->uploader->getError();
|
|
return false;
|
|
}
|
|
$this->uploadFileInfo[$num] = $info;
|
|
$this->uploadFileInfo[$key] = $info;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 检测文件合法性
|
|
* @param string $file 文件名
|
|
* @return boolean
|
|
*/
|
|
protected function check($file) {
|
|
//文件上传失败
|
|
if($file['error'] !== 0) {
|
|
$this->errorMsg= '文件上传失败!';
|
|
return false;
|
|
}
|
|
//检查文件类型
|
|
$this->allowExts = array_map('strtolower', $this->config['allowExts']);
|
|
if( !in_array($file['extension'], $this->config['allowExts'])) {
|
|
$this->errorMsg = '上传文件类型不允许!';
|
|
return false;
|
|
}
|
|
//检查文件大小
|
|
if ($file['size'] > $this->config['maxSize']) {
|
|
$this->errorMsg = '上传文件大小超出限制!';
|
|
return false;
|
|
}
|
|
//检查是否合法上传
|
|
if(!is_uploaded_file($file['tmp_name'])) {
|
|
$this->errorMsg = '非法上传文件!';
|
|
return false;
|
|
}
|
|
// 如果是图像文件 检测文件格式
|
|
if( in_array($file['extension'], array('gif','jpg','jpeg','bmp','png','swf')) && false === getimagesize($file['tmp_name']) ) {
|
|
$this->errorMsg = '非法图像文件!';
|
|
return false;
|
|
}
|
|
//检查通过,返回true
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 设置驱动
|
|
*/
|
|
protected function setDriver() {
|
|
$uploadDriver = __NAMESPACE__.'\upload\\' . ucfirst( $this->config['driver'] ).'Driver';
|
|
$this->uploader = new $uploadDriver($this->config);
|
|
if(!$this->uploader){
|
|
throw new \Exception("Upload Driver '{$this->config['driver']}' not found'", 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取上传文件信息
|
|
* @return array
|
|
*/
|
|
public function getUploadFileInfo() {
|
|
return $this->uploadFileInfo;
|
|
}
|
|
|
|
/**
|
|
* 获取框架错误
|
|
* @return string
|
|
*/
|
|
public function getError(){
|
|
return $this->errorMsg;
|
|
}
|
|
|
|
}
|
|
|