三款php多文件上传实例代码

作者:袖梨 2022-06-24

示例代码:

 代码如下 复制代码

   命名必是这样有"[]"

//设置允许用户上传的文件类型。
$type = array('gif', 'jpg', 'png', 'zip', 'rar');
$upload = new uploadfile($_files['uploadfile'], '/', 1024*1024, $type);
参数说明:1:表单的文件,2:上传目录,3:支持文件大小,4:允许文件类型
$icount = $upload->upload();
if($icount > 0) { //上传成功
   print_r($upload->getsaveinfo());
  */

class uploadfile {
var $postfile = array();       // 用户上传的文件
var $custompath = "";          // 自定义文件上传路径
var $maxsize = "";             // 文件最大尺寸
var $lasterror = "";           // 最后一次出错信息
var $allowtype = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');
var $endfilename = "";         // 最终保存的文件名
var $saveinfo = array();       // 保存文件的最终信息
var $root_dir = ""; // 项目在硬盘上的位置

/**
* 构造函数
* @access public
*/

 代码如下 复制代码
function uploadfile($arrfile, $path="_", $size = 2097152, $type = 0) {
   $this->postfile     = $arrfile;
   $this->custompath   = $path == "_" ? "" : $path ;
   $this->maxsize      = $size;
   if($type!=0)   $this->allowtype   = $arrfile;
   $this->root_dir      = $_server['document_root'];
   $this->_mkdir($this->custompath);
}

/**
* 文件上传的核心代码
* @access public
* @return int 上传成功文件数
*/

 代码如下 复制代码

function upload() {
   $ilen = sizeof($this->postfile['name']);
   for($i=0;$i<$ilen;$i++){
    if ($this->postfile['error'][$i] == 0) { //上传时没有发生错误
      //取当前文件名、临时文件名、大小、扩展名,后面将用到。
     $sname   = $this->postfile['name'][$i];
     $stname = $this->postfile['tmp_name'][$i];
     $isize   = $this->postfile['size'][$i];
     $stype   = $this->postfile['type'][$i];
     $sextn   = $this->_getextname($sname);
   
     //检测当前上传文件大小是否合法。
     if($this->_checksize){
      $this->lasterror = "您上传的文件[".$sname."],超过系统支持大小!";
      $this->_showmsg($this->lasterror);
      continue;
     }

     if(!is_uploaded_file($stname)) {
      $this->lasterror = "您的文件不是通过正常途径上传!";
      $this->_showmsg($this->lasterror);
      continue;
     }
     $_filename = basename($sname,".".$sextn)."_".time().".".$sextn;
     $this->endfilename = $this->custompath.$_filename;
   
     if(!move_uploaded_file($stname, $this->root_dir.$this->endfilename)) {
      $this->lasterror = $this->postfile['error'][$i];
      $this->_showmsg($this->lasterror);
      continue;
     }

     //存储当前文件的有关信息,以便其它程序调用。
     $this->save_info[] =   array("name" => $sname, "type" => $sextn, "size" => $isize,   "path" => $this->endfilename);
    }
   }

   return sizeof($this->save_info);
}

 

 

/**
* 得到上传信息
* @access public
* @return array 保存信息
*/
function getsaveinfo(){
   return $this->save_info;
}

 


/**
* 得到文件名的扩展名
* @access private
* @return string 返回文件扩展名
*/
private function _getextname($filename){
   $arrparts = pathinfo($filename);
   return $arrparts['extension'];
}

/**
* 判断文件大小
* @access private
* @return boolean 传入size大于系统定义,则true,反之false
*/
private function _checksize($size){
   return $size > $this->maxsize;
}

/**
* 输出错误信息
* @access private
* @return void
*/
private function _showmsg($msg){
   printf("<错误信息:> %s
n", $msg);
}

/**
* 新增多级目录
* @access private
* @return void
*/
private function _mkdir($p){
   $ap = split('[/]', $p);
   foreach($ap as $v){
    if(!empty($v)){
     if(empty($path)) $path=$v;
     else $path.='/'.$v;
     file_exists($this->root_dir."/".$path) or mkdir($this->root_dir."/".$path);
    }
   }
}
}

/*


}

 

/**//*
//注意,上传组件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());

echo $num."个文件上传成功";
}
else {
echo "上传失败
";
}
}


* @(#)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类使用注释


*/
?>

一个简单实例


send this file:

send this file:

send this file:



// in php versions earlier than 4.1.0, $http_post_files should be used instead
// of $_files.

$uploaddir = './';
/*
print "

";


if (move_uploaded_file($_files['userfile']['tmp_name'], $uploadfile)) {
print "file is valid, and was successfully uploaded. ";
print "here's some more debugging info:n";
print_r($_files);
} else {
print "possible file upload attack! here's some debugging info:n";
print_r($_files);
}


print "

";
*/
?>


function rearrayfiles(&$file_post) {

$file_ary = array();
$file_count = count($file_post['name']);
$file_keys = array_keys($file_post);

for ($i=0; $i<$file_count; $i++) {
foreach ($file_keys as $key) {
$file_ary[$i][$key] = $file_post[$key][$i];
}
}

return $file_ary;
}


print "

";

if ($_files['userfile']) {
$file_ary = rearrayfiles($_files['userfile']);

相关文章

精彩推荐