php上傳文件詳解

openkk 13年前發布 | 19K 次閱讀 PHP開發 PHP

上傳文件功能由兩個部分組成HTML頁面PHP處理部分HTML頁面主要是讓用戶選擇所要上傳的文件php部分讓我們可以把文件存儲到服務器的指定目錄。

一.HTML部分

upload.html

<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    </head>
    <body>
        上傳Demo:
        <form action="upload.php" method="post" enctype="multipart/form-data">
            <input type="file" name="img" />
            <input type="submit" name="submit" value="上傳" />
        </form>
    </body>
</html>

說明:
1.Input標簽中type="file"表明把輸入作為文件來處理
2.Enctype規定了在提交這個表單時要使用哪種內容類型在表單需要二進制數據時,比如文件內容,請使用"multipart/form-data",如果要上傳文件,這個屬性是必要的。
更多關于enctype的內容參見《HTML <form> 標簽的 enctype 屬性》

二.php部分

upload.php

<?php 
$DST_DIR = '/data/upload/';
if ($_FILES['img']['name'] != '') {
    if ($_FILES['img']['error'] > 0) {
        echo "上傳失敗";
    }
    else {
        if (move_uploaded_file($_FILES['img']['tmp_name'], $DST_DIR.$_FILES['img']['name'])) {
            echo "上傳成功";
        }
        else {
            echo "上傳失敗";
        }
    }
}
else {
    echo "請上傳文件";
}

說明:
1. 全局變量$_FILE
此數組包含有所有上傳的文件信息。
以我們假設文件上傳字段的名稱如上例所示,為 img。則
$_FILES['img']['name']
客戶端上傳的文件的原名稱。
$_FILES['img']['type']
文件的 MIME 類型,如果瀏覽器提供此信息的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端并不檢查,因此不要想當然認為有這個值。$_FILES['img']['size']:已上傳文件的大小,單位為字節。
$_FILES['img']['size']
已上傳文件的大小,單位為字節。
$_FILES['img']['tmp_name']
文件被上傳后在服務端儲存的臨時文件名。
$_FILES['img']['error']
和該文件上傳相關的錯誤代碼。

2. 關于錯誤碼
$_FILES['img']['error']有以下幾種類型
UPLOAD_ERR_OK
其值為 0,沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE
其值為 1,上傳的文件超過了 php.ini 中 upload_max_filesize選項限制的值。
UPLOAD_ERR_FORM_SIZE
其值為 2,上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL
其值為 3,文件只有部分被上傳。
UPLOAD_ERR_NO_FILE
其值為 4,沒有文件被上傳。
UPLOAD_ERR_NO_TMP_DIR
其值為 6,找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。
UPLOAD_ERR_CANT_WRITE
其值為 7,文件寫入失敗。PHP 5.1.0 引進。

3.move_uploaded_file
文件被上傳后,默認地會被儲存到服務端的默認臨時目錄中(除非 php.ini 中的 upload_tmp_dir設置為其它的路徑),文件名是隨機的。如果該文件沒有被移動到其它地方也沒有被改名,則該文件將在表單請求結束時被刪除。因此需要通過move_uploaded_file移動臨時文件。
經實驗copy也能完成move_uploaded_file的功能,為啥要用move_uploaded_file呢?有說法是move_uploaded_file會對上傳文件做一些檢查,防止copy引起的一些安全漏洞。但具體copy會帶來什么問題呢?我并沒有查到。有知道的同學,歡迎留言。
Anyway,既然php給了特定的函數,必然有一定道理,先這么用吧。


三.安全檢查
可以考慮通過$_FILES['img']['size']和$_FILES['img']['type']對上傳的文件做一些安全檢查,比如限定上傳類型,上傳文件的大小等。

附:
《與文件上傳有關的php配置參數》

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!