PHP多文件一件上传类–upload.class.php
最近在学习PHP,写了一个多文件上传类练练手,与单文件相比,主要注意以下几点:
- 在表单中,的multiple属性要用到,这样可以选择多个文件
- 获取文件名称时,要用$_FILES[]循环读取上传,具体实现方式见代码
- *貌似可以通过js的var files = doucument.getElementById(‘files’).files,然后通过循环得到上传各文件的名称,传递给PHP后台进行操作,但具体实现方式我还不懂。。希望各路大神尝试一下,给予解答!
- 文件类型我默认选的是图片,大小默认是3m,大家可以自己根据需求改一改,或者再写一个set()方法,直接进行设置。
注释不少,应该很容易看明白
代码块
网页html代码:
<html>
<head>
<title>文件上传测试</title>
<script type="text/javascript" src="uploadFile.js"></script>
</head>
<body>
<!-- <form action="upload.php" method="post" enctype="multipart/form-data"> -->
<form action="upload.class.php" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="fileNames[]" id="files" multiple="multiple" />
<br />
<input type="submit" name="" value="Submit" />
</form>
</body>
</html>
后台的PHP代码:
<?php
/**
* 支持多文件上传
* 面向对象
* jaywong20170910
*/
date_default_timezone_set('Asia/Shanghai');
class uploadFile{
//成员属性
protected $fileNames;
protected $supportType;
protected $maxSize;
protected $filepath;
protected $fileInfo;
protected $error = null;
protected $upFileName;
//成员属性初始化
public function __construct($fileNames='fileNames',
$supportType = ['image/jpg','image/png','image/gif','image/jpeg','image/tiff'],
$maxSize = 3000000,$filepath = '/users/jaywong/sites/uploadTest'){
$this->fileNames = $fileNames;
$this->supportType = $supportType;
$this->maxSize = $maxSize;
$this->filepath = $filepath;
$this->fileInfo = $_FILES[$this->fileNames];
}
//判断错误
protected function judgeError($i){
if($this->fileInfo['error'][$i]){
switch ($fileInfo['error'][$i]){
case 1:
$this->error = 'UPLOAD_ERR_INI_SIZE:上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
return false;
case 2:
$this->error = 'UPLOAD_ERR_FORM_SIZE:上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。';
return false;
case 3:
$this->error = 'UPLOAD_ERR_PARTIAL';
return false;
case 4:
$this->error = 'UPLOAD_ERR_NO_FILE';
return false;
case 6:
$this->error = 'UPLOAD_ERR_NO_TMP_DIR';
return false;
case 7:
$this->error = 'UPLOAD_ERR_CANT_WRITE';
return false;
}
}
}
//判断文件mime类型
protected function judgeMime($i){
if(!in_array($this->fileInfo['type'][$i],$this->supportType)){
$this->error = $this->fileInfo['name'][$i].'不支持文件类型.<br>';
return false;
}
}
//判断文件是否超过允许最大值
protected function judgeSize($i){
if($this->fileInfo['size'][$i]>$this->maxSize){
$this->error = $fileName.'文件太大了,超过了3m.<br>';
return false;
}
}
//创建目录
protected function createDir(){
if(!file_exists($this->filepath)){
mkdir($this->filepath);
}
}
//给上传文件命名
protected function newName($i){
$basename = $this->fileInfo['name'][$i];
$filename = pathinfo($basename,PATHINFO_FILENAME);
$extention = pathinfo($basename,PATHINFO_EXTENSION);
$this->upFileName = $filename.date("Y-m-d H:i:s").'.'.$extention;
}
//上传文件
protected function upFile($i){
$this->newName($i);
if(is_uploaded_file($this->fileInfo['tmp_name'][$i])){
move_uploaded_file($this->fileInfo['tmp_name'][$i],$this->filepath.'/'.$this->upFileName);
echo $this->upFileName."上传成功.<br>";
return array('name'=>$this->fileInfo['name'][$i],
'type'=>$this->fileInfo['type'][$i],'size'=>$this->fileInfo['size'][$i],
'newname'=>$this->newName($i));
}
}
//循环上传文件
public function loopUpFiles(){
// $fileInfo = $_FILES[$fileNames];
$n = count($this->fileInfo['name']);//$_FILES must be usedfor reading files information.
for($i = 0; $i < $n; $i++){
//判断是否有错误
$this->judgeError($i);
//判断文件mime类型
$this->judgeMime($i);
//判断文件大小
$this->judgeSize($i);
//创建目录
$this->createDir();
//上传文件
if(is_null($this->error)){
$this->upFile($i);
}
}
}
//查看错误接口
public function getError(){
return $this->error;
}
//清空对象
function __destruct(){
}
}
$upFiles = new uploadFile();
$upFiles->loopUpFiles();
?>