PHP 文件上傳的原理及案例分析

原理

將客戶端文件上傳至服務器端,在服務器端臨時存儲,再將服務器端臨時存儲的文件移至指定位置php


實現文件上傳須要的知識點:

  • 前端頁面

1.form表單必須是用post發送方式,由於get會將參數帶到url中,而上傳的文件轉換後字符會很長,並且也是爲了安全性前端

2.form表單須要使用enctype=「multipart/form-data」屬性,form表單默認的enctype屬性值是application/x-www-form-urlencoded,該屬性在發送前編碼全部字符,而multipart/form-data屬性後端

不會編碼字符,在使用包含文件上傳控件的表單時,必須使用該值。數組

3.input 中用到了type="file"屬性瀏覽器

  • 後端php頁面

1.$_FILES:經過 HTTP POST 方式上傳到當前腳本的項目的數組,也就是實現文件上傳的數組,它的本質是一個數組,在PHP文檔中咱們能夠看到它有如下幾個內容,假設文件上傳字段的名稱爲 userfile(此名稱可隨意命名的)安全

$_FILES['userfile']['name'] :客戶端機器文件的原名稱,也就是即將上傳的文件的名稱服務器

$_FILES['userfile']['type']:文件的 MIME 類型,若是瀏覽器提供此信息的話。一個例子是「image/gif」。不過此 MIME 類型在 PHP 端並不檢查,所以不要想固然認爲有這個值。app

$_FILES['userfile']['size']:已上傳文件的大小,單位爲字節。在限定用戶上傳文件的大小時將用到。函數

$_FILES['userfile']['tmp_name']:文件被上傳後在服務端儲存的臨時文件名。post

$_FILES['userfile']['error']:和該文件上傳相關的錯誤代碼。

文件被上傳後,默認地會被儲存到服務端的默認臨時目錄中。

2.move_uploaded_file( 臨時文件名 , 指定目錄文件名) :此函數將上傳的文件移動到新位置,也就是實現文件上傳的基本函數,檢查並確保由 filename 指定的文件是合法的上傳文件,若是文件合法,則將其移動爲指定的文件。

3.in_array(‘value’,array,type) :‘value’是要搜索的值,array是要搜索的數組,type是不是要求全等,此參數可選,若是爲true,要求搜索的結果不只是值相等,類型也要相等

4.file_exists(path)檢查文件或目錄是否存在

5.pathinfo(path,options):以數組的形式分解文件路徑的信息,其中options有如下幾個參數: . PATHINFO_DIRNAME - 只返回 dirname . PATHINFO_BASENAME - 只返回 basename . PATHINFO_EXTENSION - 只返回 extension


實現上傳流程

1.form表單提交 2.使用$_FILE獲取上傳內容的信息 3.校驗上傳內容是否符合規定的文件類型以及大小 4.經過檢驗後使用move_uploaded_file函數,將臨時存儲文件移至指定位置


案例代碼

前端,請忽略樣式

<form action="up.php" method="post" name="upform" enctype="multipart/form-data">
      <input type="hidden" name="MAX_FILE_SIEZ" value="200000" /> <!-設置上傳最大文件爲2M->
     上傳文件<input type="file" name="upfile" />
      <input type="submit" name="submit" value="上傳" />
</form>

php代碼

if( isset($_POST['submit']) ){
    var_dump($_FILES['upfile']);
    //將得到的數據存儲在變量中
    $name = $_FILES['upfile']['name'];
    $type = $_FILES['upfile']['type'];
    $tmp_name = $_FILES['upfile']['tmp_name'];
    $error = $_FILES['upfile']['error'];
    $size = $_FILES['upfile']['size'];

    //提取文件的擴展名,爲從此類型判斷作準備
    $ext = pathinfo($name,PATHINFO_EXTENSION); 
    $type_array = array('jpeg','pjeg','gif','png');
    //echo $ext;

    //設置上傳文件後服務器存儲位置,若是建立未成功,則說明沒有權限
     $path = "uploads";
    if ( !file_exists( $path) ) {
            mkdir($path,0777,true);
            chmod($path,0777);
        }
    //當#error爲0時進行大小,格式的判斷
    if( $error == 0 ) {
            if ( $size > 200000) {
                exit('上傳文件太大!');
            }
            if ( !in_array($ext,$type_array) ) {
                exit('非法文件類型');
            }
            if ( move_uploaded_file($tmp_name,'uploads/'.$name)) {
                echo '文件上傳成功!';
            }else{
                echo '文件上傳失敗';
            }
    } else {
        switch ($error) {
            case 1 :
             echo "超過上傳文件最大值,請上傳2M之內的文件";
             break;
            case 2:
                echo "文件過多,只能上傳一個";
                break;
            case 3:
                echo "文件沒有徹底上傳,請重試";
                break;
             case 4:
                echo "未選擇上傳文件";
                break;
            case 7:
                echo "沒有臨時文件夾";
                break;
        }
    }
}

在實踐時遇到了各類各樣的問題,會在另外一篇文章中單獨說明

相關文章
相關標籤/搜索