文件上传类 php,PHP通用文件上传类

/**

* PHP通用文件上传类

*

* 支持单文件和多文件上传

*/

class FileUpload{

//要配置的内容

private $path = "./uploads";

private $allowtype = array('jpg', 'gif', 'png');

private $maxsize = 1000000;

private $israndname = true;

private $originName;

private $tmpFileName;

private $fileType;

private $fileSize;

private $newFileName;

private $errorNum = 0;

private $errorMess = "";

/**

* 用于设置成员属性($path, $allowtype, $maxsize, $israndname)

* 可以通过连贯操作一次设置多个属性值

* @param $key 成员属性(不区分大小写)

* @param $val 为成员属性设置的值

* @return object 返回自己对象$this, 可以用于连贯操作

*/

function set($key, $val){

$key = strtolower($key);

if (array_key_exists($key, get_class_vars(get_class($this)))){

$this->setOption($key, $val);

}

return $this;

}

/**

* 调用该方法上传文件

* Enter description here ...

* @param $fileField 上传文件的表单名称

*/

function upload($fileField){

$return = true;

if (!$this->checkFilePath()){

$this->errorMess = $this->getError();

return false;

}

//将文件上传的信息取出赋给变量

$name = $_FILES[$fileField]['name'];

$tmp_name = $_FILES[$fileField]['tmp_name'];

$size = $_FILES[$fileField]['size'];

$error = $_FILES[$fileField]['error'];

if (is_array($name)){

$errors = array();

//多个文件上传则循环处理,这个循环只有检查上传文件的作用,并没有真正上传

for ($i = 0; $i < count($name); $i++) {

if ($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])) {

if (!$this->checkFileSize() || !$this->checkFileType()){

$errors[] = $this->getError();

$return = false;

}

}else{

$errors[] = $this->getError();

$return = false;

}

//如果有问题,则重新初始化属性

if (!$return){

$this->setFiles();

}

}

if ($return) {

//存放所有上传后文件名的变量数组

$fileNames = array();

//如果上传的多个文件都是合法的,则通过循环向服务器上传文件

for ($i = 0; $i < count($name); $i++) {

if ($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){

$this->setNewFileName();

if (!$this->copyFile()){

$errors[] = $this->getError();

$return = false;

}

$fileNames[] = $this->newFileName;

}

}

$this->newFileName = $fileNames;

}

$this->errorMess = $errors;

return $return;

}else{

//设置文件信息

if ($this->setFiles($name, $tmp_name, $size, $error)) {

if ($this->checkFileSize() && $this->checkFileType()) {

$this->setNewFileName();

if ($this->copyFile()) {

return true;

}else{

$return = false;

}

}else{

$return=false;

}

}else{

$return=false;

}

}

if (!$return) {

$this->errorMess = $this->getError();

}

return $return;

}

//获取上传后的文件名称

public function getFileName(){

return $this->newFileName;

}

//上传失败后,调用该方法则返回,上传出错信息

public function getErrorMsg(){

return $this->errorMess;

}

//设置上传出错信息

public function getError(){

$str = "上传文件{$this->originName}时出错:";

switch ($this->errorNum) {

case 4:

$str.= "没有文件被上传";

break;

case 3:

$str.= "文件只有部分被上传";

break;

case 2:

$str.= "上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值";

break;

case 1:

$str.= "上传的文件超过了php.ini中upload_max_filesize选项限制的值";

break;

case -1:

$str.= "未允许的类型";

break;

case -2:

$str.= "文件过大, 上传的文件夹不能超过{$this->maxsize}个字节";

break;

case -3:

$str.= "上传失败";

break;

case -4:

$str.= "建立存放上传文件目录失败,请重新指定上传目录";

break;

case -5:

$str.= "必须指定上传文件的路径";

break;

default:

$str .= "未知错误";

}

return $str."
";

}

//设置和$_FILES有关的内容

private function setFiles($name="", $tmp_name="", $size=0, $error=0){

$this->setOption('errorNum', $error);

if ($error) {

return false;

}

$this->setOption('originName', $name);

$this->setOption('tmpFileName', $tmp_name);

$aryStr = explode(".", $name);

$this->setOption("fileType", strtolower($aryStr[count($aryStr)-1]));

$this->setOption("fileSize", $size);

return true;

}

//为单个成员属性设置值

private function setOption($key, $val){

$this->$key = $val;

}

//设置上传后的文件名称

private function setNewFileName(){

if ($this->israndname) {

$this->setOption('newFileName', $this->proRandName());

}else{

$this->setOption('newFileName', $this->originName);

}

}

//检查上传的文件是否是合法的类型

private function checkFileType(){

if (in_array(strtolower($this->fileType), $this->allowtype)) {

return true;

}else{

$this->setOption('errorNum', -1);

return false;

}

}

//检查上传的文件是否是允许的大小

private function checkFileSize(){

if ($this->fileSize > $this->maxsize) {

$this->setOption('errorNum', -5);

return false;

}else{

return true;

}

}

//检查是否有存放上传文件的目录

private function checkFilePath(){

if (empty($this->path)) {

$this->setOption('errorNum', -5);

return false;

}

if (!file_exists($this->path) || !is_writable($this->path)) {

if (!@mkdir($this->path, 0755)) {

$this->setOption('errorNum', -4);

return false;

}

}

return true;

}

//设置随机文件名

private function proRandName(){

$fileName = date('YmdHis')."_".rand(100,999);

return $fileName.'.'.$this->fileType;

}

//复制上传文件到指定的位置

private function copyFile(){

if (!$this->errorNum) {

$path = rtrim($this->path, '/').'/';

$path.= $this->newFileName;

if (@move_uploaded_file($this->tmpFileName, $path)) {

return true;

}else{

$this->setOption('errorNum', -3);

return false;

}

}else{

return false;

}

}

}

抄来的文件上传来,作为巩固面向对象知识。

总结:

1. 定义成员属性,要输入的信息

2. 定义构造方法或配置方法(set()实现连贯操作)

3. 定义主方法(上传方法upload())

1. 检查文件路径是否合法

2. 将文件上传的信息取出赋给变量

3. 如果是多个文件夹上传则$file['name']会是数组

1.先循环检查文件合法性

2.再上传

4. 定义各种辅助方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值