功能强大的php文件上传类,一个非常实用的php文件上传类

其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。

下面的代码放在一个名为UploadFile.class.php文件内

/**

* 文件上传

* author:师少兵

* email :beibeijing163@163.com

* time :2012/12/09

*/

class UploadFile{

private $max_size = "2000000"; //设置上传文件的大小,此为2M

private $rand_name = true; //是否采用随机命名

private $allow_type = array(); //允许上传的文件扩展名

private $error = 0; //错误代号

private $msg = ""; //信息

private $new_name = ""; //上传后的文件名

private $save_path = ""; //文件保存路径

private $uploaded = ""; //路径.文件名

private $file = ""; //等待上传的文件

private $file_type = array(); //文件类型

private $file_ext = ""; //上传文件的扩展名

private $file_name = ""; //文件原名称

private $file_size = 0; //文件大小

private $file_tmp_name = ""; //文件临时名称

/**

* 构造函数,初始化

* @param string $rand_name 是否随机命名

* @param string $save_path 文件保存路径

* @param string $allow_type 允许上传类型

$allow_type可为数组 array("jpg", "jpeg", "png", "gif");

$allow_type可为字符串 "jpg|jpeg|png|gif";中间可用" ", ",", ";", "|"分割

*/

public function __construct($rand_name=true, $save_path="./upload/", $allow_type=""){

$this->rand_name = $rand_name;

$this->save_path = $save_path;

$this->allow_type = $this->get_allow_type($allow_type);

}

/**

* 上传文件

* 在上传文件前要做的工作

* (1) 获取文件所有信息

* (2) 判断上传文件是否合法

* (3) 设置文件存放路径

* (4) 是否重命名

* (5) 上传完成

* @param array $file 上传文件

* $file须包含$file["name"], $file["size"], $file["error"], $file["tmp_name"]

*/

public function upload_file($file){

//$this->file = $file;

$this->file_name = $file["name"];

$this->file_size = $file["size"];

$this->error = $file["error"];

$this->file_tmp_name = $file["tmp_name"];

$this->ext = $this->get_file_type($this->file_name);

switch($this->error){

case 0: $this->msg = ""; break;

case 1: $this->msg = "超出了php.ini中文件大小"; break;

case 2: $this->msg = "超出了MAX_FILE_SIZE的文件大小"; break;

case 3: $this->msg = "文件被部分上传"; break;

case 4: $this->msg = "没有文件上传"; break;

case 5: $this->msg = "文件大小为0"; break;

default: $this->msg = "上传失败"; break;

}

if($this->error==0 && is_uploaded_file($this->file_tmp_name)){

//检测文件类型

if(in_array($this->ext, $this->allow_type)==false){

$this->msg = "文件类型不正确";

return false;

}

//检测文件大小

if($this->file_size > $this->max_size){

$this->msg = "文件过大";

return false;

}

}

$this->set_file_name();

$this->uploaded = $this->save_path.$this->new_name;

if(move_uploaded_file($this->file_tmp_name, $this->uploaded)){

$this->msg = "文件上传成功";

return true;

}else{

$this->msg = "文件上传失败";

return false;

}

}

/**

* 设置上传后的文件名

* 当前的毫秒数和原扩展名为新文件名

*/

public function set_file_name(){

if($this->rand_name==true){

$a = explode(" ", microtime());

$t = $a[1].($a[0]*1000000);

$this->new_name = $t.".".($this->ext);

}else{

$this->new_name = $this->file_name;

}

}

/**

* 获取上传文件类型

* @param string $filename 目标文件

* @return string $ext 文件类型

*/

public function get_file_type($filename){

$ext = pathinfo($filename, PATHINFO_EXTENSION);

return $ext;

}

/**

* 获取可上传文件的类型

*/

public function get_allow_type($allow_type){

$s = array();

if(is_array($allow_type)){

foreach($allow_type as $value){

$s[] = $value;

}

}else{

$s = preg_split("/[s,|;]+/", $allow_type);

}

return $s;

}

//获取错误信息

public function get_msg(){

return $this->msg;

}

}

?>

其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_"开头的变量缩写为一个$file数组,这样感觉更好一些。

下面我们来测试一下上面的代码。我在一个名为upfile.php文件写测试代码,同时将UploadFile.class.php放在同一个路径下。

upfile

require "UploadFile.class.php";

if(isset($_POST["sf"]) && $_POST["sf"]=="sf"){

if ($_FILES["file"]["error"] > 0){

echo "Error: " . $_FILES["file"]["error"] . "
";

}else{

$file = $_FILES["file"];

$upload = new UploadFile(true, "./images/", array("jpg", "jpeg", "png"));

$upload->upload_file($file);

echo $upload->get_msg();

}

}else{

?>

}

?>

在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。

这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传的文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行, "jpg|jpeg|png|gif", "jpg jpeg png gif", "jpg,jpeg,png,gif"都行。

好的,文件上传类就这样写好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值