用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

php文件上传之原理分析与上传类代码

时间:2015-01-23  来源:西部数据  作者:西部数据

今天研究PHP注册POST/GET大变量的时候,看到了关于这块的一些东西,跟踪了半天,先记录下来,免得以后再如此麻烦的跟踪.

处理器注册:

  1. [mod_php5.c, mod_php5模块初始化] 
  2. php_init_handler(server_rec *s, pool *p) 
  3.     ->[main/SAPI.c]sapi_startup(&apache_sapi_module) 
  4.         ->[main/SAPI.c] 
  5. sapi_globals_ctor(&sapi_globals) 
  6.             ->[main/php_content_types.c]php_setup_sapi_content_types(TSRMLS_C) 
  7.                 ->[main/php_content_types.c 
  8. php_post_entries如下]sapi_register_post_entries(php_post_entries 
  9. TSRMLS_CC) 
  10.                     ->[main/SAPI.c]sapi_register_post_entry(p 
  11. TSRMLS_CC) 

如下面的代码,共注册了俩个处理器,分别处理post数据和文件上传.

注1:参看在PHP Module中获取$_GET/$_POST/$_COOKIE的方法研究

  1. [main/rfc1867.h] 
  2.       #define 
  3. MULTIPART_CONTENT_TYPE 
  4. "multipart/form-data" 
  5.  
  6. [main/php_content_types.h] 
  7.      #define 
  8. DEFAULT_POST_CONTENT_TYPE 
  9. "application/x-www-form-urlencoded" 
  10.  
  11. [main/SAPI.c] 
  12. struct 
  13. _sapi_post_entry 
  14. char *content_type; 
  15.         uint 
  16. content_type_len; 
  17.         void 
  18. (*post_reader)(TSRMLS_D); 
  19.         void 
  20. (*post_handler)(char *content_type_dup, void *arg 
  21. TSRMLS_DC); 
  22.     }; 
  23.   [main/php_content_types.c] 
  24. static 
  25. sapi_post_entry 
  26. php_post_entries[] = { 
  27. DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler 
  28. }, 
  29.         { 
  30. MULTIPART_CONTENT_TYPE,    sizeof(MULTIPART_CONTENT_TYPE)-1,    NULL,                         rfc1867_post_handler 
  31. }, 
  32.         { 
  33. NULL, 0, NULL, NULL 
  34. }; 
  1. <?php 
  2. #********************************************************* 
  3. #文件名称: yl_upload.class.php 
  4. #功能描述: 印像上传类 
  5. #程序制作:留印(adleyliu) 
  6. #联系qq  :14339095 
  7. #联系邮箱:adleyliu@163.com 
  8. #最后更新:     2007-11-11 
  9. #注:转发时请保留此声明信息,这段声明不并会影响你的速度! 
  10. #如有修改请将修改后的文件以邮件形式发送给作者一份,谢谢! 
  11. #********************************************************* 
  12. /* 
  13. //使用说明: 
  14. //声明一个上传类 
  15.    $yl_upload = new yl_upload_class();  
  16. //设置参数 
  17.    global $yl_filedata,$yl_directroy,$file_urldirectroy,$yl_settingsnew; 
  18.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext; 
  19.    $yl_filedata = 'filedata';//表单名 
  20.    $yl_directroy = '../upload_file';//上传主目录 
  21.    $file_urldirectroy = 'upload_file';//文件url(在编辑器KindEditor中用到,请查看upload.php实例) 
  22.    $yl_settingsnew = 'month_'.date('Ym');//上传主目录1按版块存入不同目录,2按月份存入不同目录,3按天存入不同目录 
  23.    $yl_maxsize = 2097152;  //这里以字节为单位(1024*2)*1024=2097152 = 2M 
  24.    $yl_sizeformat = 'k';   //显示文件大小单位b,k,m 
  25.    $yl_arrext = array('gif','jpg','jpeg','png','bmp');//允许上传文件类型 
  26.    $yl_ext = 0;  //0原文件类型上传,1统一为存为jpg 
  27. //上传 
  28.    $yl_upload -> yl_uploadfile(); 
  29. */ 
  30. class yl_upload_class 
  31. #********************************************************* 
  32. #创建目录函数 
  33. #********************************************************* 
  34. function createfolder($yl_path
  35.    if (!file_exists($yl_path)) 
  36.    { 
  37.     $this -> createfolder(dirname($yl_path)); 
  38.     @mkdir($yl_path, 0777); 
  39.    } 
  40.    return $this -> createfolder; 
  41. #********************************************************* 
  42. #获取文件名称,大小,类型,临时文件名 
  43. #********************************************************* 
  44. function yl_getfilename($yl_type
  45.    global $yl_filedata,$yl_directroy,$yl_settingsnew
  46.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  47.    return $_FILES[$yl_filedata][$yl_type]; 
  48. #********************************************************* 
  49. #获取文件大小 
  50. #********************************************************* 
  51. function yl_getfilesize() 
  52.    global $yl_filedata,$yl_directroy,$yl_settingsnew
  53.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  54.    if($this -> yl_getfilename('size') == 0){ 
  55.       $this -> alert("请选择上传文件!"); 
  56.       exit
  57.    } 
  58.    if($this -> yl_getfilename('size') > $yl_maxsize){ 
  59.          $yl_maxsizek=$yl_maxsize/1024; 
  60.       $this -> alert("上传文件超出限制范围$yl_maxsizek.K!"); 
  61.       exit
  62.    } 
  63.    switch (strtolower($yl_sizeformat)){ 
  64.    case 'b'
  65.    return $this -> yl_getfilename('size') . ' B'
  66.    break
  67.    case 'k'
  68.    return ($this -> yl_getfilename('size')/1024) . ' K'
  69.    break
  70.    case 'm'
  71.    return ($this -> yl_getfilename('size'))/(1024*1024) . ' M'
  72.    } 
  73. #********************************************************* 
  74. #获得文件扩展名 
  75. #********************************************************* 
  76. function yl_getfiletype() 
  77.    global $yl_filedata,$yl_directroy,$yl_settingsnew
  78.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  79.      $yl_temp_arr = explode("."$this -> yl_getfilename('name')); 
  80.      $yl_file_ext = array_pop($yl_temp_arr); 
  81.       $yl_file_ext = trim($yl_file_ext); 
  82.      $yl_file_ext = strtolower($yl_file_ext); 
  83.      //检查扩展名 
  84.      if (in_array($yl_file_ext$yl_arrext) === false) { 
  85.         $this -> alert("上传文件类型被限制!"); 
  86.         exit
  87.      } 
  88.      return $yl_file_ext
  89. #********************************************************* 
  90. #上传 
  91. #********************************************************* 
  92. function yl_uploadfile() 
  93.    global $yl_filedata,$yl_directroy,$file_urldirectroy,$yl_settingsnew
  94.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  95.    $yl_file_nameold = $this -> yl_getfilename('name');//原文件名 
  96.    $yl_file_namenews = date('Ymd').'_'.md5(date('YmdHis'));//重命名 
  97.    if($yl_ext == 0){ 
  98.       $yl_file_names = $yl_file_namenews.'.'.$this -> yl_getfiletype();//改名 
  99.    }elseif ($yl_ext == 1){ 
  100.       $yl_file_names = $yl_file_namenews.'.jpg';//统一改名为jpg 
  101.       } 
  102.    $yl_tmp_name = $this -> yl_getfilename('tmp_name');//服务器上临时文件名 
  103.    $yl_file_size = $this -> yl_getfilesize();//获取文件大小 
  104.    $yl_file_type = $this -> yl_getfiletype();//获取文件类型 
  105.    $yl_file_path = $yl_directroy.'/'.$yl_settingsnew;//建立一个目录 
  106.      //检查目录是否存在,不存在则创建 
  107.      if(@is_dir($yl_file_path) === false) { 
  108.       $this -> createfolder(''.$yl_file_path.'');//创建目录 
  109.      } 
  110.      //检查是否已上传 
  111.    if(@is_uploaded_file($yl_tmp_name) === false) { 
  112.         $this -> alert("文件已上传!"); 
  113.         exit
  114.    } 
  115.      //检查目录写权限 
  116.      if (@is_writable($yl_file_path) === false) { 
  117.           $this -> alert("上传目录没有写权限!"); 
  118.           exit
  119.      } 
  120.    $yl_doupload = @copy($yl_tmp_name''.$yl_file_path.'/'.$yl_file_names.''); 
  121.    if($yl_doUpload === false) 
  122.    { 
  123.     $this -> alert("上传失败!"); 
  124.    }else
  125.     echo '上传成功'
  126.     echo '<br>'
  127.     echo '文件目录:'.$yl_file_path.''
  128.     echo '<br>'
  129.     echo '原文件名:'.$yl_file_nameold.''
  130.     echo '<br>'
  131.     echo '新文件名:'.$yl_file_names.''
  132.     echo '<br>'
  133.     echo '文件大小:'.$yl_file_size.''
  134.     echo '<br>'
  135.     echo '文件类型:'.$yl_file_type.''
  136.    } 
  137.     return
  138. #********************************************************* 
  139. #*删除文件  
  140. #********************************************************* 
  141. function delfile() 
  142.    global $yl_filedata,$yl_directroy,$yl_settingsnew
  143.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  144.    $yl__dir = dirname(trim($yl_directroy)); 
  145.    if$this->_isDel( $yl__dir ) ) 
  146.    { 
  147.       return @unlink( $yl_directroy ) ? true : false; 
  148.    }else
  149.    return false; 
  150.    } 
  151. #********************************************************* 
  152. #删除目录 目录下如果有文件不能删除 
  153. #********************************************************* 
  154. function deldir( ) 
  155.    global $yl_filedata,$yl_directroy,$yl_settingsnew
  156.    global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext
  157.    if$this->_isdel($yl_directroy) && is_dir$yl_directroy ) ) 
  158.    { 
  159.       return @rmdir$yl_directroy ) ? true : false; 
  160.    }else
  161.       return false; 
  162.    } 
  163. #********************************************************* 
  164. #提示 
  165. #********************************************************* 
  166. function alert($yl_msg
  167.     echo '<html>'
  168.     echo '<head>'
  169.     echo '<title>error</title>'
  170.     echo '<meta http-equiv="content-type" c>'
  171.     echo '</head>'
  172.     echo '<body>'
  173.     echo '<script type="text/网页特效">alert("'.$yl_msg.'");;</script>'
  174.     echo '</body>'
  175.     echo '</html>'
  176.     exit
  177. ?> 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门