官术网_书友最值得收藏!

2.2 文件上傳模塊

在PHP文件處理的功能上,還有一個重要的環節就是通過表單上傳本地文件到Web服務器,如訪客上傳照片、管理員上傳文件附件供訪客下載等。

要想上傳本地文件到服務器,必須使用表單POST方法,GET方法是不能實現此功能的,同時表單的enctype屬性也必須設置為“multipart/form-data”。如下一個實現文件上傳的表單。

        <form name="up" action="" enctype="multipart/form-data" method="post">
        <input name="file" type="file" size="60"/>
        <input name="ok" type="submit" value="上傳" />
        </form>

文件上傳到服務器之后,PHP提供了$_FILES全局變量數組來包含所有上傳的文件信息。我們假設上傳文件的<input>控件名稱為“userfile”來說明$_FILES變量的元素:

$_FILES['userfile']['name']:客戶端機器文件的原名稱。

$_FILES['userfile']['type']:文件的MIME類型,如果瀏覽器提供此信息的話。一個例子是“image/gif”。不過MIME類型在PHP端并不檢查,因此不要想當然認為有這個值。

$_FILES['userfile']['size']:已上傳文件的大小,單位為字節。

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

$_FILES['userfile']['error']:和該文件上傳相關的錯誤代碼。此項目是在PHP 4.2.0版本中增加的。

文件被上傳后,默認會被儲存到服務端的臨時目錄中,除非php.ini中的upload_tmp_dir設置為其他的路徑。服務端的默認臨時目錄可以通過更改PHP運行環境的環境變量TMPDIR來重新設置,但是在PHP腳本內部通過運行putenv() 函數來設置是不起作用的。該環境變量也可以用來確認其他的操作,也是在上傳的文件上進行的。

接受上傳文件的PHP腳本為了決定接下來要對該文件進行哪些操作,應該實現任何邏輯上必要的檢查。例如可以用$_FILES['userfile']['size']變量來排除過大或過小的文件,也可以通過 $_FILES['userfile']['type']變量來排除文件類型和某種標準不相符合的文件,要么將該文件從臨時目錄中刪除,要么將其移動到其他的地方。

PHP提供了is_uploaded_file()函數來檢測某個文件是否為通過表單上傳的臨時文件,提供了move_uploaded_file()函數來將某個上傳來的臨時文件移動到其他指定目錄中去。仍舊假設上傳文件的<input>名為userfile:

        <?php
        $uploaddir = '/uploads/';
        $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
        if           (is_uploaded_file($_FILES['userfile']['tmp_name'])           &&
        move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
        {
          echo "文件已經成功上傳";
        }
        else
        {
          echo "上傳文件處理出錯!";
        }
        ?>

如果表單中沒有選擇上傳的文件,則PHP變量$_FILES['userfile']['size']的值將為0,$_FILES['userfile']['tmp_name']將為空。

如果該文件沒有被移動到其他地方也沒有被改名,則該文件將在表單請求結束時被刪除。

如果需要同時上傳多個文件到服務器,我們可以書寫多個文件上傳控件來實現此功能,通過$_FILES[]數組來分別調用這些上傳到服務器臨時目錄中的文件。

有一個竅門就是<input>控件的命名,可以類同checkbox多選框的命名,使用“[]”參與文件上傳控件命名構造一個數組結構方便服務器調用。如:

        <form name="up" action="" enctype="multipart/form-data" method="post">
        <input name="file[]" type="file" size="60"/>
        <input name="file[]" type="file" size="60"/>
        <input name="file[]" type="file" size="60"/>
        <input name="ok" type="submit" value="上傳" />
        </form>

假設用這個表單提交了多張照片到服務器。

        <?php
        foreach ($_FILES["file"]["error"] as $key => $error) {
          if ($error == UPLOAD_ERR_OK) {
              $tmp_name = $_FILES["file"]["tmp_name"][$key];
              $name = $_FILES["file"]["name"][$key];
              move_uploaded_file($tmp_name, "data/$name");
          }
        }
        ?>
主站蜘蛛池模板: 海伦市| 天峨县| 彭州市| 同江市| 色达县| 泰顺县| 聂荣县| 南平市| 景德镇市| 望奎县| 女性| 宜兰县| 黄大仙区| 神木县| 新巴尔虎左旗| 墨脱县| 清新县| 余江县| 视频| 广安市| 达尔| 枣阳市| 阜康市| 阿鲁科尔沁旗| 天台县| 安乡县| 渭南市| 乌拉特前旗| 上蔡县| 静宁县| 中西区| 噶尔县| 南充市| 罗平县| 海安县| 德江县| 铜梁县| 太和县| 石家庄市| 庄浪县| 邛崃市|