原理
將客戶端文件上傳至服務器端,在服務器端臨時存儲,再將服務器端臨時存儲的文件移至指定位置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; } } }
在實踐時遇到了各類各樣的問題,會在另外一篇文章中單獨說明