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

 更新时间:2017年7月6日 23:34  点击:1853
小编推荐的这篇文章介绍了PHP封装的多文件上传类实例与用法详解,非常实用,有兴趣的同学可以参考一下本文。
 代码如下 复制代码

<?php

/**//*

 * @(#)UploadFile.php

 *

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

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

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

 *

 */

classUploadFile {

 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  此数组中存放允计用户上传的文件类型

 */

 functionUploadFile($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表示上传成功的个数。

 */

 functionupload() {

 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);

  }

 }

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

 }

 /**//**

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

 * @access public

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

 */

 functiongetSaveInfo() {

 return$this->save_info;

 }

 /**//**

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

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

 * @access private

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

 */

 functioncheckSize($size) {

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

  returnfalse;

 }

 else{

  returntrue;

 }

 }

 /**//**

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

 * @access private

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

 */

 functioncheckType($extension) {

 foreach($this->allow_typeas$type) {

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

  returntrue;

 }

 returnfalse;

 }

 /**//**

 * 显示出错信息

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

 * @access private

 */

 functionhalt($msg) {

 printf("<b><UploadFile Error:></b> %s <br>\n",$msg);

 }

 /**//**

 * 取文件扩展名

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

 * @access private

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

 */

 functiongetFileExt($filename) {

 $stuff=pathinfo($filename);

 return$stuff['extension'];

 }

 /**//**

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

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

 *

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

 * @access private

 * @return String 返回文件名

 */

 functiongetBaseName($filename,$type) {

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

 return$basename;

 }

}

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

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

<input type="file" name="user_upload_file[]">

<input type="file" name="user_upload_file[]">

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

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 "上传成功<br>";

 //取得文件的有关信息,文件名、类型、大小、路径。用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 "上传失败<br>";

 }

}

*/

?>

小编推荐的这篇文章介绍了PHP验证终端类型是否为手机的简单实例,非常实用,有兴趣的同学快来看看吧。
 代码如下 复制代码

/**

 * 判断当前访问的用户是 PC端 还是 手机端 返回true 为手机端 false 为PC 端

 * @return boolean

 */

functionisMobile(){

  $useragent=isset($_SERVER['HTTP_USER_AGENT']) ?$_SERVER['HTTP_USER_AGENT'] :'';

  //echo $useragent;die;

  $useragent_commentsblock=preg_match('|\(.*?\)|',$useragent,$matches)>0?$matches[0]:'';   

  functionCheckSubstrs($substrs,$text){

    foreach($substrsas$substr)

      if(false!==strpos($text,$substr)){

        returntrue;

      }

      returnfalse;

  }

  $mobile_os_list=array('Google  Wireless Transcoder','Windows  CE','WindowsCE','Symbian','Android','armv6l','armv5','Mobile','CentOS','mowser','AvantGo','Opera  Mobi','J2ME/MIDP','Smartphone','Go.Web','Palm','iPAQ');

  $mobile_token_list=array('Profile/MIDP','Configuration/CLDC-','160&times;160','176&times;220','240&times;240','240&times;320','320&times;240','UP.Browser','UP.Link','SymbianOS','PalmOS','PocketPC','SonyEricsson','Nokia','BlackBerry','Vodafone','BenQ','Novarra-Vision','Iris','NetFront','HTC_','Xda_','SAMSUNG-SGH','Wapaka','DoCoMo','iPhone','iPod');

 

  $found_mobile=CheckSubstrs($mobile_os_list,$useragent_commentsblock) ||

       CheckSubstrs($mobile_token_list,$useragent);

 

  if($found_mobile){

    returntrue;

  }else{

    returnfalse;

  }

}

小编推荐的这篇文章详细介绍了php实现的中文分词类完整实例,非常有用,感兴趣的同学快来看看吧。

 

 代码如下复制代码

classSegmentation {

  var$options=array('lowercase'=> TRUE,

  'segment_english'=> FALSE);

  var$dict_name='Unknown'

  var$dict_words=array();

  functionsetLowercase($value) {

    if($value) {

      $this->options['lowercase'] = TRUE;

    }else{

      $this->options['lowercase'] = FALSE;

    }

    returnTRUE;

  }

  functionsetSegmentEnglish($value) {

    if($value) {

      $this->options['segment_english'] = TRUE;

    }else{

      $this->options['segment_english'] = FALSE;

    }

    returnTRUE;

  }

  functionload($dict_file) {

    if(!file_exists($dict_file)) {

      returnFALSE;

    }

    $fp=fopen($dict_file,'r');

    $temp=fgets($fp, 1024);

    if($temp=== FALSE) {

      returnFALSE;

    }else{

      if(strpos($temp,"\t") !== FALSE) {

        list ($dict_type,$dict_name) =explode("\t", trim($temp));

      }else{

        $dict_type= trim($temp);

        $dict_name='Unknown'

      }

      $this->dict_name =$dict_name;

      if($dict_type!=='DICT_WORD_W') {

        returnFALSE;

      }

    }

    while(!feof($fp)) {

      $this->dict_words[rtrim(fgets($fp, 32))] = 1;

    }

    fclose($fp);

    returnTRUE;

  }

  functiongetDictName() {

    return$this->dict_name;

  }

  functionsegmentString($str) {

    if(count($this->dict_words) === 0) {

      returnFALSE;

    }

    $lines=explode("\n",$str);

    return$this->_segmentLines($lines);

  }

  functionsegmentFile($filename) {

    if(count($this->dict_words) === 0) {

      returnFALSE;

    }

    $lines= file($filename);

    return$this->_segmentLines($lines);

  }

  function_segmentLines($lines) {

    $contents_segmented=''

    foreach($linesas$line) {

      $contents_segmented.=$this->_segmentLine(rtrim($line)) ." \n";

    }

    do{

      $contents_segmented=str_replace(' ',' ',$contents_segmented);

    }

    while(strpos($contents_segmented,' ') !== FALSE);

    return$contents_segmented;

  }

  function_segmentLine($str) {

    $str_final=''

    $str_array=array();

    $str_length=strlen($str);

    if($str_length> 0) {

      if(ord($str{$str_length-1}) >= 129) {

        $str.=' '

      }

    }

    for($i=0;$i<$str_length;$i++) {

      if(ord($str{$i}) >= 129) {

        $str_array[] =$str{$i} .$str{$i+1};

        $i++;

      }else{

        $str_tmp=$str{$i};

        for($j=$i+1;$j<$str_length;$j++) {

          if(ord($str{$j}) < 129) {

            $str_tmp.=$str{$j};

          }else{

            break;

          }

        }

        $str_array[] =array($str_tmp);

        $i=$j- 1;

      }

    }

    $pos=count($str_array);

    while($pos> 0) {

      $char=$str_array[$pos-1];

      if(is_array($char)) {

        $str_final_tmp=$char[0];

        if($this->options['segment_english']) {

          $str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f]+)/"," $1 ",$str_final_tmp);

$str_final_tmp= preg_replace("/([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])([\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\\\]\^\_\`\{\|\}\~\t\f])/"," $1 $2 ",$str_final_tmp);

        }

        if($this->options['lowercase']) {

          $str_final_tmp=strtolower($str_final_tmp);

        }

        $str_final=" $str_final_tmp$str_final";

        $pos--;

      }else{

        $word_found= 0;

        $word_array=array(0 =>'');

        if($pos< 4) {

          $word_temp=$pos+ 1;

        }else{

          $word_temp= 5;

        }

        for($i=1;$i<$word_temp;$i++) {

          $word_array[$i] =$str_array[$pos-$i] .$word_array[$i-1];

        }

        for($i=($word_temp-1);$i>1;$i--) {

          if(array_key_exists($word_array[$i],$this->dict_words)) {

            $word_found=$i;

            break;

          }

        }

        if($word_found) {

          $str_final=" $word_array[$word_found]$str_final";

          $pos=$pos-$word_found;

        }else{

          $str_final=" $char$str_final";

          $pos--;

        }

      }

    }

    return$str_final;

  }

}

?>

 

小编推荐的这篇文章介绍了php加密之discuz内容经典加密方式实例详解,非常实用,有兴趣的同学快来看看吧。

本文实例讲述了php加密之discuz内容经典加密方式。分享给大家供大家参考,具体如下:

导读:有的时候,我们希望对表里的某些敏感字段进行加密,想了好长时间没有比较好的解决方案,后台在网上查了查,放心discuz论坛的这种方案对这种情况解决的不错,特copy过来,给大家分享一下,代码如下:

 

 代码如下 复制代码

header ("Content-type:text/html;charset=UTF-8");

echo$string='花园路888号';

echo'<hr/>加密有效期10秒,密文内容:';

// $string='1111';

$sss=authcode($string,'','',10);

echo$sss;

echo'<hr/>加密后立即解密:...';

echoauthcode($sss);

sleep(6);

echo'<hr/>6秒后解密...';

$aaaa=authcode($sss);

var_dump($aaaa);

sleep(5);

echo'<hr/>再次5秒后解密...';

$aaaa=authcode($sss);

var_dump($aaaa);

/**

 *

 * @param string $string    明文或密文字符串

 * @param string $operation    DECODE表示解密,其它表示加密

 * @param string $key    密钥

 * @param int $expiry    密文有效期,0代码永不过期

 * @return string

 */

functionauthcode($string,$operation='DECODE',$key='',$expiry= 0) {

    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙

    $ckey_length= 4;

    // 密匙

    $key= md5 ($key?$key:$GLOBALS['discuz_auth_key'] );

    // 密匙a会参与加解密

    $keya= md5 (substr($key, 0, 16 ) );

    // 密匙b会用来做数据完整性验证

    $keyb= md5 (substr($key, 16, 16 ) );

    // 密匙c用于变化生成的密文

    $keyc=$ckey_length? ($operation=='DECODE'?substr($string, 0,$ckey_length) :substr( md5 ( microtime () ), -$ckey_length)) :'';

    // 参与运算的密匙

    $cryptkey=$keya. md5 ($keya.$keyc);

    $key_length=strlen($cryptkey);

    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性

    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确

    $string=$operation=='DECODE'?base64_decode(substr($string,$ckey_length) ) : sprintf ('0d',$expiry?$expiry+ time () : 0 ) .substr( md5 ($string.$keyb), 0, 16 ) .$string;

    $string_length=strlen($string);

    $result='';

    $box= range ( 0, 255 );

    $rndkey=array();

    // 产生密匙簿

    for($i= 0;$i<= 255;$i++) {

        $rndkey[$i] = ord ($cryptkey[$i%$key_length] );

    }

    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度

    for($j=$i= 0;$i< 256;$i++) {

        $j= ($j+$box[$i] +$rndkey[$i]) % 256;

        $tmp=$box[$i];

        $box[$i] =$box[$j];

        $box[$j] =$tmp;

    }

    // 核心加解密部分

    for($a=$j=$i= 0;$i<$string_length;$i++) {

        $a= ($a+ 1) % 256;

        $j= ($j+$box[$a]) % 256;

        $tmp=$box[$a];

        $box[$a] =$box[$j];

        $box[$j] =$tmp;

        // 从密匙簿得出密匙进行异或,再转成字符

        $result.=chr( ord ($string[$i] ) ^ ($box[($box[$a] +$box[$j]) % 256]) );

    }

    if($operation=='DECODE') {

        // substr($result, 0, 10) == 0 验证数据有效性

        // substr($result, 0, 10) - time() > 0 验证数据有效性

        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0,

        // 16) 验证数据完整性

        // 验证数据有效性,请看未加密明文的格式

        if((substr($result, 0, 10 ) == 0 ||substr($result, 0, 10 ) - time () > 0) &&substr($result, 10, 16 ) ==substr( md5 (substr($result, 26 ) .$keyb), 0, 16 )) {

            returnsubstr($result, 26 );

        }else{

            return'';

        }

    }else{

        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因

        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码

        return$keyc.str_replace('=','',base64_encode($result) );

    }

}

 

以上代码运行结果:

花园路888号

加密有效期10秒,密文内容:ce9eelLd6jpd7hZJTRg+/fgg8cD9VG+1NsHvkavEKhdvhk7jcfDoQTYSAAw

加密后立即解密:...花园路888号

6秒后解密...

string'花园路888号' (length=15)

再次5秒后解密...

string'' (length=0)

[!--infotagslink--]

相关文章

  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • 借助FileReader实现将文件编码为Base64后通过AJAX上传

    这篇文章主要介绍了借助FileReader实现将文件编码为Base64后通过AJAX上传的方法,包括后端对文件数据解码并保存的PHP代码,需要的朋友可以参考下...2015-12-25
  • jQuery+ajax简单实现文件上传的方法

    这篇文章主要介绍了jQuery+ajax简单实现文件上传的方法,结合实例形式简单分析了jQuery基于ajax的post方法进行文件传输及asp.net后台处理技巧,需要的朋友可以参考下...2016-06-12
  • 适用于初学者的简易PHP文件上传类

    本文实例讲述了PHP多文件上传类,分享给大家供大家参考。具体如下:<&#63;phpclass Test_Upload{ protected $_uploaded = array(); protected $_destination; protected $_max = 1024000; protected $_messages =...2015-10-30
  • js实现上传文件添加和删除文件选择框

    这篇文章主要为大家详细介绍了js实现上传文件添加和删除文件选择框 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-25
  • PHP利用APC模块实现大文件上传进度条的方法

    php 大文件带进度的上传,一直是一个令php程序员很苦恼的问题。查询baidu 、Google ,大体做带进度的上传方式为:flash+php,socket,apc+php等,下面我介绍了apc +php+ajax制作的带进度的上传,并贴出源码,希望对大家有用。 Altern...2015-10-30
  • C#文件上传的简单实现

    这篇文章主要为大家详细介绍了C#文件上传的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • js 实现文件上传样式详情

    这篇文章主要介绍了js 实现文件上传样式,下面文章举例说明js 是如何实现文件上传样式的,附有代码详细解说,需要的朋友可以参考一下,希望对你有所帮助...2021-10-21
  • php需登录的文件上传管理系统

    本文给大家介绍一个不错的需要登录的php 文件上传管理系统,功能简单有需要了解的同学可参考。 代码如下<&#63;php$admin_pw="admin";//管理密码$uploaddir="upload";//上传目录session_start();if($_GET['action']=="g...2015-10-30
  • asp.net html控件的File控件实现多文件上传实例分享

    asp.net中html控件的File控件实现多文件上传简单实例,开发工具vs2010使用c#语言,感兴趣的朋友可以了解下,必定是多文件上传值得学习,或许本文所提供的知识点对你有所帮助...2021-09-22
  • PHP文件上传主要代码讲解

    复制代码 代码如下:<?php if($_FILES['myfile']['name'] != '') { if($_FILES['myfile']['error'] > 0) { echo "错误状态:" . $_FILES['myfile']['error']; } else { move_uploaded_f...2013-10-04
  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    这篇文章主要介绍了使用jQuery.form.jsspringmvc框架实现文件上传功能,非常具有参考借鉴价值,感兴趣的朋友一起学习吧...2016-05-14
  • JQuery异步提交表单与文件上传功能示例

    这篇文章主要介绍了JQuery异步提交表单与文件上传功能,结合实例形式分析了jQuery表单提交及文件传输操作的相关实现技巧,需要的朋友可以参考下...2017-01-16
  • jquery插件uploadify实现带进度条的文件批量上传

    这篇文章主要介绍了jquery插件uploadify实现带进度条的文件批量上传,感兴趣的小伙伴们可以参考一下...2015-12-14
  • C#简单实现文件上传功能

    这篇文章主要介绍了C#简单实现文件上传功能,利用MVC+EF+LigerUI 实现的upload上传功能,感兴趣的小伙伴们可以参考一下...2020-06-25
  • CKEditor配置实现文件上传功能

    CKEditor是新一代的FCKeditor,是一个重新开发的版本。CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站。而CKFinder是...2016-09-20
  • PHP的文件上传处理验证示例

    文件上传中有一块非常重要的就是安全验证了,如果验证不合理就很容易给一些人把此利用上传非常的黑客文件了,那么对于新学php新手文件上传验证有多了解呢?如果不懂可以看...2016-11-25