PHP文件上傳詳解

上傳文件分爲兩個部分,HTML顯示部分和PHP處理部分,HTML部分主要是讓用戶來選擇所要上傳的文件,而後經過PHP中的$_FILES,咱們能夠把文件上傳到服務器的指定目錄。

先來看一下HTML部分。

?
<form action="upload.php" method="post" enctype="multipart/form-data">
上傳:<input type="file" name="myfile" />
<input type="submit" name="submit" value="上傳" />
</form>

說明:
form標答的action="upload.php"是指點擊這個form中的submit的時候,這個上傳命令會被髮送到這個叫 upload.php的頁面去處理。method="post"是指以post方式去送,enctype="multipart/form-data"屬 性規定了在提交這個表單時要使用哪一種內容類型,在表單須要二進制數據時,好比文件內容,請使用"multipart/form-data",若是要上傳文 件,這個屬性是必要的。input中的type="file"時,規定了應該把輸入做爲文件來處理,而且在input後面會有一個瀏覽的按鈕。 php

咱們再來看一個PHP處理頁面 upload.php

?
<?php
if($_FILES['myfile']['name'] !='') {
  if($_FILES['myfile']['error'] > 0) {
    echo "錯誤狀態:" .$_FILES['myfile']['error'];
  }else {
    move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES['myfile']['name']);
    echo "<script>alert(上傳成功!);</script>";
  }
}else{
  echo "<script>alert(請上傳文件!);</script>";
}
?>

說明:
在解釋這篇代碼前,咱們有必要了解如下知識。 html

$_FILES['myfile']['name']  是指被上傳文件的名稱
$_FILES['myfile']['type']  是指被上傳文件的類型
$_FILES['myfile']['size']  是指被上傳文件的大小,單位爲字節(B)
$_FILES['myfile']['tmp_name']  是指被上傳文件存在服務器中的臨時副本文件名稱,文件被移動到指定目錄後臨文件將被自動消毀。
$_FILES['myfile']["error"]  是指由文件上傳中有可能出現的錯誤的狀態碼,關於各狀態含義後在會說明。

瞭解了這些,咱們再來看一下upload.php的代碼。
首先,$_FILES['myfile']['name']中的myfile是指在上面HTML頁面中上傳文件標籤的name值,根據這個咱們才能知道我 們正在處理的文件是哪個input提交過來的,而後再來判斷一下 $_FILES['myfile']['name'] 不是否爲空,根據這個咱們能夠知道用戶有沒有上傳文件,從而執行不一樣的操做。若是上傳了文件而且狀態是0就說明上傳成功,咱們就能夠用 move_uploaded_file方法把上傳的文件存放到指定目錄,上面這個例子是指把上傳的文件移動到同目錄下的uploads文件夾下,這個路徑 是相對於這個PHP文件(既upload.php)的相對目錄。好比,咱們想把上傳的文件移動到upload.php上一層叫user的文件夾中的話,我 們就能夠這樣寫:move_uploaded_file($_FILES['myfile']['tmp_name'] , "../user/" . $FILES['myfile']['name']),這種方法使用起來很方便、靈活,這樣一個文件就被上傳到服務器中了,能夠打開服務器中的目錄查看該 文件。 瀏覽器

容許用戶上傳文件是一個有巨大的安全風險的行爲,所以,一般狀況下,咱們會對用戶上傳的文件作一些限制,好比常見的限制文件
類型和文件大小,來看一下。
安全

?
<?php
if($_FILES['myfile']['name'] !='') {
  if($_FILES['myfile']['error'] > 0) {
    echo "錯誤狀態:" .$_FILES['myfile']['error'];
  }else {
    if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES['myfile']['type'] =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES['myfile']['size'] < 20480){
      move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES['myfile']['name']);
      echo "<script>alert(上傳成功!);</script>";
    }else {
      echo "<script>alert(請上傳小於2MB的jpeg或Gif類型的附件);<script>";
    }
  }
}else {
  echo "<script>alert(請上傳文件!);</script>";
}
?>

從上面的代碼能夠看出,咱們規定了上傳的文件類型必須是jpeg或者Gif而且必須小於2MB的文件($_FILES['myfile']['size']的默認單位是字節)
這裏必須提到的是,對於IE瀏覽器,它識別jpg文件的類型必須是 pjpeg,而對於 FireFox,則必須是 jpeg,所以,咱們必須對jpeg和pjpeg都做判斷。
這樣一來,咱們能夠限制用戶上傳的一些危險的好比木馬或者病毒腳本,來保證了服務器的安全運行。
如今,一個上傳文件程序就基本成形了。但時在有些時候,考慮到用戶體驗,咱們還能夠對用戶上傳過程當中發生的錯誤做出一些提醒,
讓用戶明白是哪裏出了問題,咱們會對$_FILES['myfile']['error']做出一些說明,先來看一下在PHP中對$_FILES['myfile']['error']常見6種狀態的定義。 服務器

?
$_FILES['teacher_pic']['error'] = 1        文件大小超過了PHP.ini中的文件限制
$_FILES['teacher_pic']['error'] = 2        文件大小超過了瀏覽器限制
$_FILES['teacher_pic']['error'] = 3        文件部分被上傳
$_FILES['teacher_pic']['error'] = 4        沒有找到要上傳的文件
$_FILES['teacher_pic']['error'] = 5        服務器臨時文件夾丟失
$_FILES['teacher_pic']['error'] = 5        文件寫入到臨時文件夾出錯

錯誤信息狀態爲1時說明上傳的文件超過了php.ini中的文件大小限制,咱們能夠打開php.ini這個文件。 post

來找一下; Maximum allowed size for uploaded files.upload_max_filesize = 2M
我這裏是在第516行,這一句說定義了PHP中上傳文件的最大字節數,默認狀況下是2MB,這個設置是PHP全局上傳限 制,權限最高,即便$_FILES['myfile']['size']設爲10MB,也只能上傳2MB如下的文件。好比,在默認狀況下,若是規 定$_FILES['myfile']['size'] < 10MB,在用戶上傳文件大於2MB的狀況下,就會如今$_FILES['teacher_pic']['error'] = 1的狀況,通常來講,咱們需要把$_FILES['myfile']['size']的值設定在upload_max_filesize值之下(設大了也 沒用,呵呵)。固然,你徹底能夠把php.ini中的upload_max_filesize值調的更大,但實際應用中,咱們考慮到服務器的負載能力,不 建議upload_max_filesize的值超過20MB,這樣會形成網站附件增大,這在論壇社區上能夠很明顯的看出來。
瞭解了這些,咱們就能夠對錯誤狀態做出定義,咱們再來完善一下代碼,來看一下。 網站

?
<?php
if($_FILES['myfile']['name'] !=''){
  if($_FILES['myfile']['error'] > 0){
    switch($_FILES['myfile']['error']){
      case 1:
        echo "文件大小超過了PHP.ini中的文件限制!";
        break;
      case 2:
        echo "文件大小超過了瀏覽器限制!";
        break;
      case 3:
        echo "文件部分被上傳!";
        break;
      case 4:
        echo "沒有找到要上傳的文件!";
        break;
      case 5:
        echo "服務器臨時文件夾丟失,請從新上傳!";
        break;
      case 6:
        echo "文件寫入到臨時文件夾出錯!";
        break;
    }
  }else {
    if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES['myfile']['type'] =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES['myfile']['size'] < 20480) {
      move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES['myfile']['name']);
      echo "<script>alert(上傳成功!);</script>";
    }else {
      echo "<script>alert(請上傳小於2MB的jpeg或Gif類型的附件);<script>";
    }
  }
}else {
  echo "<script>alert(請上傳文件!);</script>";
}
?>

能夠看出,咱們使用了switch語句來對6種錯狀態做出定義,這樣來下,在發生錯誤的時間,用戶就會明白,是哪裏出了問題。
可是還有一種狀況就是,用戶上傳的文件在指定的目錄中已經存在,這裏咱們可使用file_exists方法來判斷一下: spa

?
<?php
if($_FILES['myfile']['name'] !=''){
  if($_FILES['myfile']['error'] > 0){
    switch($_FILES['myfile']['error']){
      case 1:
        echo "文件大小超過了PHP.ini中的文件限制!";
        break;
      case 2:
        echo "文件大小超過了瀏覽器限制!";
        break;
      case 3:
        echo "文件部分被上傳!";
        break;
      case 4:
        echo "沒有找到要上傳的文件!";
        break;
      case 5:
        echo "服務器臨時文件夾丟失,請從新上傳!";
        break;
      case 6:
        echo "文件寫入到臨時文件夾出錯!";
        break;
    }
  }else {
    if($_FILES['myfile']['type'] =='image/jpeg' or $_FILES['myfile']['type'] =='image/pjpeg' or $_FILES['myfile']['type'] =='image/gif' &&$_FILES['myfile']['size'] < 20480) {
      if (!file_exists("uploads/" .$_FILES["myfile"]["name"]))
        move_uploaded_file($_FILES['myfile']['tmp_name'] ,"uploads/" .$FILES['myfile']['name']);
        echo "<script>alert(上傳成功!);</script>";
      }else{
        echo "<script>alert(您上傳的文件已經存在!);</script>";
      }
    }else {
      echo "<script>alert(請上傳小於2MB的jpeg或Gif類型的附件);<script>";
    }
  }
}else {
  echo "<script>alert(請上傳文件!);</script>";
}
?>

個人個娘呀,終於寫完了,一個完整的上傳程序終於完成了,這只是上傳文件最原始的方法,這樣更容易本身理解,使用時你們能夠考慮把它寫成類
如今咱們再來總結一下上傳中的邏輯判斷順吧。 orm


1. 先判斷是否上傳文件
2. 若是有再來判斷上傳中是否出錯
3. 若是出錯,則提示出錯信息
4. 如查沒出錯,再判斷文件類型
5. 若是類型符合條件,再判斷指定目錄中有沒有存在該文件
6. 若是沒有就把該文件移至指定目錄
htm


原文件地址:http://www.thenbsp.com/archives/111.html

相關文章
相關標籤/搜索