PHP文件上傳實例詳解!!!

首先看官方文檔
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

 

首先來看下上傳部分的表單代碼:  javascript

複製代碼代碼以下:
     <form method="post" action="upload.php" enctype="multipart/form-data">   
     <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">   
      <tr>    
        <td width=55 height=20 align="center"><input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD>   
        <td height="16">    
        <input name="file" type="file"  value="瀏覽" >              
        < input type="submit" value="上傳" name="B1">   
        </td>   
      </tr>   
     </table>   
     </form> 

 

這裏有幾個要注意的地方,首先看這句<form method="post" action="upload.php" enctype="multipart/form-data">,這裏咱們採用POST方法,個別瀏覽器還支持PUT方法,固然這須要對腳本進行修改,我並不建議這麼作。表單中必須設置enctype="multipart/form-data,這樣,服務器就知道上傳文件帶有常規表單信息,記住,這個是必須設置的。此外還須要一個隱藏域來限制上傳文件的最大長度:<input type="hidden" name="MAX_FILE_SIZE" value="2000000">,這裏name必須設置成MAX_FILE_SIZE,其值就是上傳文件的最大長度,單位是B,這裏我限制成2M。再看這句:<input name="file" type="file"  value="瀏覽" >,type="file"說明了文件類型,這樣一個基本的上傳文件接口就完成了,接下來說講如何用PHP來處理上傳的文件,此外你的php.ini中設置的上傳文件最大長度可能會影響到你的實際上傳,請根據實際狀況修改,另PHP的上傳是先傳到臨時目錄,在移至指定目錄的,了;臨時目錄的可根據須要修改,也可以使用默認值。  
   好的,表單提交upload.php,來看看這個頁面都有什麼:  
PHP代碼以下:  php

複製代碼代碼以下:
<?php   
 /*****************************************   
   Title :文件上傳詳解   
   Author:leehui1983(輝老大)   
   Finish Date  :2006-12-28   
  *****************************************/   
   $uploaddir = "./files/";//設置文件保存目錄 注意包含/       
   $type=array("jpg","gif","bmp","jpeg","png");//設置容許上傳文件的類型    
   $patch="http://127.0.0.1/cr_downloadphp/upload/files/";//程序所在路徑   

   //獲取文件後綴名函數   
      function fileext($filename)   
    {   
        return substr(strrchr($filename, '.'), 1);   
    }   
   //生成隨機文件名函數       
    function random($length)   
    {   
        $hash = 'CR-';   
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';   
        $max = strlen($chars) - 1;   
        mt_srand((double)microtime() * 1000000);   
            for($i = 0; $i < $length; $i++)   
            {   
                $hash .= $chars[mt_rand(0, $max)];   
            }   
        return $hash;   
    }   
   $a=strtolower(fileext($_FILES['file']['name']));   
   //判斷文件類型   
   if(!in_array(strtolower(fileext($_FILES['file']['name'])),$type))   
     {   
        $text=implode(",",$type);   
        echo "您只能上傳如下類型文件: ",$text,"<br>";   
     }   
   //生成目標文件的文件名       
   else{   
    $filename=explode(".",$_FILES['file']['name']);   
        do   
        {   
            $filename[0]=random(10); //設置隨機數長度   
            $name=implode(".",$filename);   
            //$name1=$name.".Mcncc";   
            $uploadfile=$uploaddir.$name;   
        }   
   while(file_exists($uploadfile));   
        if (move_uploaded_file($_FILES['file']['tmp_name'],$uploadfile)){   

            if(is_uploaded_file($_FILES['file']['tmp_name'])){   
                //輸出圖片預覽   
                echo "<center>您的文件已經上傳完畢 上傳圖片預覽: </center><br><center><img src='$uploadfile'></center>";   
                echo"<br><center><a href='javascript:history.go(-1)'>繼續上傳</a></center>";   
              }   
              else{   
                echo "上傳失敗!";   
              }   
        }   
   }    
?> 

  
剛看這些你可能有點暈~~,不過沒關係,聽我講完,你就會發現其實這玩意SO EASY!!首先我講下原理,該程序以上傳圖片爲例,先判斷文件類型是否爲圖片格式,如果則上傳文件,以隨機數和時間的組合從新命名文件(避免上傳文件重名,這樣作頗有必要!),接着上傳文件到指定目錄,成功上傳則輸出上傳的圖片預覽。這裏要對程序中一些函數做些解釋。先看return substr(strrchr($filename, '.'), 1), strrchar()函數有什麼做用呢,我舉個例子你們就知道,好比一個圖片文件 pic.jpg,咱們用 strrchr處理,strrchr(pic.jpg,'.'),它將返回.jpg,明白了嗎?該函數返回指定字符在該字符串最後出現的位置後的字符。配合 substr() 咱們就能夠取到jpg,這樣咱們就獲得了文件的後綴名,來判斷上傳文件是否符合指定格式。本程序把指定的格式放在一個數組中,實際使用時可根據須要添加。  
    接下來看產生隨機數文件名部分, 咱們看到mt_srand()這個函數,手冊上叫他「播下一個更好的隨機數發生器種子」,其實就是初始化一個隨機數的函數,參數是(double)microtime() * 1000000,這裏若是不這是參數就會自動設置個隨機數,固然這不符合咱們的須要,如此一來,隨機數就具有必定的長度,保證了上傳文件不重名。接着,咱們調用判斷文件類型的函數,並將其轉化爲小寫strtolower(fileext($_FILES['file']['name'])),這裏有個很關鍵的東東$_FILES ,這是個超級全局數組,保存了須要處理的表單數據,若是開啓了register_globals,也能夠直接訪問,但這是不安全的。看剛纔那個上傳接口<input name="file" type="file"  value="瀏覽" >,根據這個表單名稱,咱們能夠獲得不少信息:  
    $_FILES['file']['name']--  獲得文件名稱  
    $_FILES['file']['tmp_name']--獲得臨時存儲位置  
    $_FILES['file']['size']--獲得文件大小  
    $_FILES['file']['type']--獲得文件MIME類型  
獲得這些信息,咱們就能夠輕鬆判斷文件的信息了,是否是很方便?^_^,接下來還有一些函數須要瞭解,file_exists()--判斷指定目錄是否存在,不存在咱們固然不能上傳(好像是廢話!),move_uploaded_file--將上傳文件移至指定目錄,is_uploaded_file--判斷文件是否已經經過HTTP POST上傳。成功上傳,咱們就輸出預覽,不然輸出上傳失敗!大功告成  
   你們可根據這個進行擴展,好比配合JS實現多文件上傳,如DZ的上傳效果,再深一點結合AJAX實現無刷新上傳,不少博客都有采用,最後播放下下兩篇原創文章的預告  
1  我將把這個例子擴展,增長後臺和數據庫部分,實現上傳文件管理,審覈,將發佈在原創區。  
2  利用目錄函數實現文件管理,將發佈在新手區  
但願感興趣的朋友屆時觀看~~~,謝謝!!!!!!java

相關文章
相關標籤/搜索