国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

php文件上傳之原理分析與上傳類代碼

2024-09-04 11:44:55
字體:
來源:轉載
供稿:網友

今天研究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 '文件大?。?#39;.$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. ?> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临夏县| 密山市| 茌平县| 连云港市| 绥中县| 阿瓦提县| 通城县| 徐汇区| 永宁县| 云南省| 雅江县| 大石桥市| 改则县| 泰顺县| 广灵县| 高淳县| 开江县| 汪清县| 虞城县| 大洼县| 灵璧县| 黄浦区| 格尔木市| 济阳县| 平邑县| 海盐县| 扶风县| 射洪县| 上犹县| 丰原市| 岗巴县| 渑池县| 忻城县| 沁源县| 会理县| 乐山市| 松桃| 杂多县| 秦皇岛市| 新竹市| 江门市|