封装好的php上传文件类,php文件上传类及PHP封装的多文件上传类分享

本文主要和大家分享php文件上传类及PHP封装的多文件上传类的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。

$upload = new UpLoad();

$upload->uploadFile('fm');

/*打印错误信息*/

// var_dump($upload->errorNumber);

// var_dump($upload->errorInfo);

class UpLoad{

//文件上传路径

protected $path = 'upload/';

//允许文件上传的后缀

protected $allowSuffix = ['jpg','jpeg',

'gif','wbmp','png'];

//mime类型

protected $allowMime =['image/jpg','image/jpeg',

'image/gif','image/wbmp','image/png'];

//允许上传的大小

protected $maxSize = 2000000;

//是否启用默认的前缀

protected $isRandName =true ;

//文件的前缀

protected $prefix = 'up_';

//错误号和错误信息

protected $errorNumber;

protected $errorInfo;

//文件的信息

//文件名

protected $oldName;

//文件的后缀

protected $suffix;

//文件的大小

protected $size;

//文件的mime

protected $mime;

//文件的临时文件的路径

protected $tmpName;

//文件新名字

protected $newName;

//构造方法

//因为成员属性比较多就用数组来显示

public function __construct($arr =[]){

foreach ($arr as $key=>$value){

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

}

}

//判断$key是不是我的成员属性,如果是就设置

protected function setOption($key,$value){

//得到所有的成员属性

$keys = array_keys(get_class_vars(__CLASS__));

if(in_array($key, $keys)){

$this->$key = $value;

}

}

//文件上传函数

//key 就是input框中的name属性值

public function uploadFile($key){

//判断有没有设置路径 path

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

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

return false;

}

//判断该路径是否存在是否可写

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

$this->setOption('errorNumber', -2);

return false;

}

//判断$_FILES里面的error信息是否为0,如果为0则说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中

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

if($error){

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

return false;

}else {

//提取文件相关信息并且保存到成员属性中

$this->getFileInfo($key);

}

//判断文件的大小、mime、后缀是否符合

if(!$this->checkSize() || !$this->checkMime()|| !$this->checkSuffix()){

return false;

}

//得到新的文件名字

$this->newName = $this->createNewName();

//判断是否是上传文件,并且是移动上传文件

if(is_uploaded_file($this->tmpName)){

if(move_uploaded_file($this->tmpName, $this->path.$this->newName)){

return $this->path.$this->newName;

}else {

$this->setOption('errorNumber', -7);

return false;

}

}else{

$this->setOption('errorNumber', -6);

return false;

}

}

//检测文件夹是否存在,是否可写

protected function check(){

//文件夹不存在或者不是目录。创建文件夹

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

return mkdir($this->path,0777,true);

}

//判断文件是否可写

if(!is_writeable($this->path)){

return chmod($this->path, 0777);

}

return true;

}

//根据key得到文件信息

protected function getFileInfo($key){

//得到文件的名字

$this->oldName = $_FILES[$key]['name'];

//得到文件的mime类型

$this->mime = $_FILES[$key]['type'];

//得到文件的临时文件

$this->tmpName = $_FILES[$key]['tmp_name'];

//得到文件大小

$this->size = $_FILES[$key]['size'];

//得到文件后缀

$this->suffix = pathinfo($this->oldName)['extension'];

}

//判断文件大小

protected function checkSize(){

if($this->size > $this->maxSize){

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

return false;

}

return true;

}

//判断mime类型

protected function checkMime(){

if(!in_array($this->mime, $this->allowMime)){

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

return false;

}

return true;

}

//判断后缀

protected function checkSuffix(){

if(!in_array($this->suffix, $this->allowSuffix)){

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

return false;

}

return true;

}

//创建新名字

protected function createNewName(){

if($this->isRandName){

$name = $this->prefix.uniqid().'.'.$this->suffix;

}else {

$name = $this->prefix.$this->oldName;

}

return $name;

}

public function __get($name){

if($name == 'errorNumber'){

return $this->errorNumber;

}elseif ($name == 'errorInfo'){

return $this->getErrorInfo();

}

}

protected function getErrorInfo(){

switch ($this->errorNumber){

case -1:

$str = '文件路径没有设置';

break;

case -2:

$str = '文件不是目录或者不可写';

break;

case -3:

$str = '文件超过指定大小';

break;

case -4:

$str = 'mime类型不符合';

break;

case -5:

$str = '文件后缀不符合';

break;

case -6:

$str = '不是上传文件';

break;

case -7:

$str = '移动失败';

break;

case 1:

$str = '超出ini设置大小';

break;

case 2:

$str = '超出html表单大小';

break;

case 3:

$str = '文章只有部分上传';

break;

case 4:

$str = '没有文件上传';

break;

case 6:

$str = '找不到临时文件';

break;

case 7:

$str = '文件写入失败';

break;

}

return $str;

}

}

文件上传

注意:input中的name必须和上传类中的uploadFile中是传值一致!

PHP封装的多文件上传类实例与用法详解:<?php

/**//*

* @(#)UploadFile.php

*

* 可同时处理用户多个上传文件。效验文件有效性后存储至指定目录。

* 可返回上传文件的相关有用信息供其它程序使用。(如文件名、类型、大小、保存路径)

* 使用方法请见本类底部(UploadFile类使用注释)信息。

*

*/

class UploadFile {

var $user_post_file = array(); //用户上传的文件

var $save_file_path; //存放用户上传文件的路径

var $max_file_size; //文件最大尺寸

var $last_error; //记录最后一次出错信息

//默认允许用户上传的文件类型

var $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');

var $final_file_path; //最终保存的文件名

var $save_info = array(); //返回一组有用信息,用于提示用户。

/**//**

* 构造函数,用与初始化相关信息,用户待上传文件、存储路径等

*

* @param Array $file 用户上传的文件

* @param String $path 存储用户上传文件的路径

* @param Integer $size 允许用户上传文件的大小(字节)

* @param Array $type 此数组中存放允计用户上传的文件类型

*/

function UploadFile($file, $path, $size = 2097152, $type = '') {

$this->user_post_file = $file;

$this->save_file_path = $path;

$this->max_file_size = $size; //如果用户不填写文件大小,则默认为2M.

if ($type != '')

$this->allow_type = $type;

}

/**//**

* 存储用户上传文件,检验合法性通过后,存储至指定位置。

* @access public

* @return int 值为0时上传失败,非0表示上传成功的个数。

*/

function upload() {

for ($i = 0; $i < count($this->user_post_file['name']); $i++) {

//如果当前文件上传功能,则执行下一步。

if ($this->user_post_file['error'][$i] == 0) {

//取当前文件名、临时文件名、大小、扩展名,后面将用到。

$name = $this->user_post_file['name'][$i];

$tmpname = $this->user_post_file['tmp_name'][$i];

$size = $this->user_post_file['size'][$i];

$mime_type = $this->user_post_file['type'][$i];

$type = $this->getFileExt($this->user_post_file['name'][$i]);

//检测当前上传文件大小是否合法。

if (!$this->checkSize($size)) {

$this->last_error = "The file size is too big. File name is: ".$name;

$this->halt($this->last_error);

continue;

}

//检测当前上传文件扩展名是否合法。

if (!$this->checkType($type)) {

$this->last_error = "Unallowable file type: .".$type." File name is: ".$name;

$this->halt($this->last_error);

continue;

}

//检测当前上传文件是否非法提交。

if(!is_uploaded_file($tmpname)) {

$this->last_error = "Invalid post file method. File name is: ".$name;

$this->halt($this->last_error);

continue;

}

//移动文件后,重命名文件用。

$basename = $this->getBaseName($name, ".".$type);

//移动后的文件名

$saveas = $basename."-".time().".".$type;

//组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名

$this->final_file_path = $this->save_file_path."/".$saveas;

if(!move_uploaded_file($tmpname, $this->final_file_path)) {

$this->last_error = $this->user_post_file['error'][$i];

$this->halt($this->last_error);

continue;

}

//存储当前文件的有关信息,以便其它程序调用。

$this->save_info[] = array("name" => $name, "type" => $type,

"mime_type" => $mime_type,

"size" => $size, "saveas" => $saveas,

"path" => $this->final_file_path);

}

}

return count($this->save_info); //返回上传成功的文件数目

}

/**//**

* 返回一些有用的信息,以便用于其它地方。

* @access public

* @return Array 返回最终保存的路径

*/

function getSaveInfo() {

return $this->save_info;

}

/**//**

* 检测用户提交文件大小是否合法

* @param Integer $size 用户上传文件的大小

* @access private

* @return boolean 如果为true说明大小合法,反之不合法

*/

function checkSize($size) {

if ($size > $this->max_file_size) {

return false;

}

else {

return true;

}

}

/**//**

* 检测用户提交文件类型是否合法

* @access private

* @return boolean 如果为true说明类型合法,反之不合法

*/

function checkType($extension) {

foreach ($this->allow_type as $type) {

if (strcasecmp($extension , $type) == 0)

return true;

}

return false;

}

/**//**

* 显示出错信息

* @param $msg 要显示的出错信息

* @access private

*/

function halt($msg) {

printf(" %s
\n", $msg);

}

/**//**

* 取文件扩展名

* @param String $filename 给定要取扩展名的文件

* @access private

* @return String 返回给定文件扩展名

*/

function getFileExt($filename) {

$stuff = pathinfo($filename);

return $stuff['extension'];

}

/**//**

* 取给定文件文件名,不包括扩展名。

* eg: getBaseName("j:/hexuzhong.jpg"); //返回 hexuzhong

*

* @param String $filename 给定要取文件名的文件

* @access private

* @return String 返回文件名

*/

function getBaseName($filename, $type) {

$basename = basename($filename, $type);

return $basename;

}

}

/**//******************** UploadFile类使用注释

//注意,上传组件name属性不管是一个还是多个都要使用数组形式,如:

//如果用户点击了上传按钮。

if ($_POST['action'] == "上传") {

//设置允许用户上传的文件类型。

$type = array('gif', 'jpg', 'png', 'zip', 'rar');

//实例化上传类,第一个参数为用户上传的文件组、第二个参数为存储路径、

//第三个参数为文件最大大小。如果不填则默认为2M

//第四个参数为充许用户上传的类型数组。如果不填则默认为gif, jpg, png, zip, rar, txt, doc, pdf

$upload = new UploadFile($_FILES['user_upload_file'], 'j:/tmp', 100000, $type);

//上传用户文件,返回int值,为上传成功的文件个数。

$num = $upload->upload();

if ($num != 0) {

echo "上传成功
";

//取得文件的有关信息,文件名、类型、大小、路径。用print_r()打印出来。

print_r($upload->getSaveInfo());

//格式为: Array

// (

// [0] => Array(

// [name] => example.txt

// [type] => txt

// [size] => 526

// [path] => j:/tmp/example-1108898806.txt

// )

// )

echo $num."个文件上传成功";

}

else {

echo "上传失败
";

}

}

*/

?>

相关推荐:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值