PHP上傳檔案(附帶原始碼)

2020-07-16 10:05:13
將 input 表單的 type 屬性設定為file即可向伺服器上傳檔案,伺服器端使用 PHP 接收檔案資料和接收普通表單元素資料的處理方法稍有不同,下面我們來演示一下:

form 表單的寫法:
<form action="user.php" enctype="multipart/form-data" method="post" name="upvideo">
    上傳檔案:<input type="file" name="video" />  <!-- 將 type 屬性設定為 file -->
    <input type="submit" value="上傳" />
</form>
上傳檔案的表單必須在 form 中定義 enctype="multipart/form-data"。

此時用於接收檔案資訊的 PHP 程式碼如下:
<?php
    var_dump($_POST);
    var_dump($_FILES);
    if ($_FILES["video"]["error"] > 0){
        echo "Error: " . $_FILES["video"]["error"] . "<br />";
    } else {
        print_r($_FILES["video"]);
        if(is_uploaded_file($_FILES['video']['tmp_name'])){
        $upfile=$_FILES["video"];
        //獲取陣列裡面的值
        $name=$upfile["name"];//上傳檔案的檔名
        $type=$upfile["type"];//上傳檔案的型別
        $size=$upfile["size"];//上傳檔案的大小
        $tmp_name=$upfile["tmp_name"];//上傳檔案的臨時存放路徑
        // 移動上傳的檔案到指定目錄
        move_uploaded_file($tmp_name, '/Library/WebServer/Documents/book/'.$name);
        }
    }
?>
執行上述上傳檔案操作,列印結果如下:

array(0) { }

array(1) {
    ["video"]=> array(5)
    {
        ["name"]=> string(14) "linux icon.gif"
        ["type"]=> string(9) "image/gif"
        ["tmp_name"]=> string(26) "/private/var/tmp/phpyiMCwf"
        ["error"]=> int(0)
        ["size"]=> int(15712)
    }
}

Array
(
    [name] => linux icon.gif
    [type] => image/gif
    [tmp_name] => /private/var/tmp/phpyiMCwf
    [error] => 0
    [size] => 15712
)

第一個陣列為空,表明在使用 file 型別表單提交資料時並不使用 $_POST 接收資料,而是使用全域性變數 $_FILE 來接收。

PHP 中使用 move_uploaded_file 函數將上傳的檔案移動到指定位置。

在 PHP 組態檔 php.ini 中預設上傳檔案的大小只有 2MB,在上傳大檔案時需要對組態檔進行修改。

php.ini 中有關上傳檔案的設定如下:
選項 說明
file_uploads 是否允許 HTTP 檔案上傳,預設值為 On,允許 HTTP 檔案上傳,此選項不能設定為 Off。
upload_tmp_dir 檔案上傳的臨時存放目錄。如果沒指定,那麼 PHP 會使用系統預設的臨時目錄。該選項預設為空,如果不設定這個選項,檔案上傳功能就無法實現。
upload_max_filesize 上傳檔案的最大尺寸。這個選項預設值為 2MB,即檔案上傳的大小為 2MB,如果想上傳一個 50MB 的檔案,就必須設定 upload_max_filesize=50M。

僅設定 upload_max_filesize=50M 還是無法實現大檔案的上傳功能,還必須修改 php.ini 檔案中的 post_max_size 選項。
post_max_size 通過表單 POST 給 PHP 所能接收的最大值,包括表單裡的所有值,預設為 8MB。如果 POST 資料超出限制,那麼 $_POST 和 $_FILES 將會為空。

要上傳大檔案,必須設定該選項值大於 upload_max_filesize 選項的值,例如設定了 upload_max_filesize=50M,這裡就可以設定 post_max_size=100M。

如果啟用了記憶體限制,那麼該值應當小於 memory_limit 選項的值。
max_execution_time 每個 PHP 頁面執行的最大時間值(單位秒),預設為 30 秒。如果設定為 0,就表示無時間限制。

當我們上傳一個較大的檔案時,例如 50MB,很可能要幾分鐘才能上傳完,但 PHP 預設頁面最久執行時間為 30 秒,超過 30秒該指令碼就停止執行,導致出現無法開啟網頁的情況。因此我們可以把值設定得較大些,如 max_execution_time=600。
max_input_time 每個 PHP 指令碼解析請求資料所用的時間(單位秒),預設為 60 秒。當我們上傳大檔案時,可以將這個值設定得較大些。如果設定為 0,就表示無時間限制。
memory_limit 這個選項用來設定單個 PHP 指令碼所能申請到的最大記憶體空間。這有助於防止寫得不好的指令碼消耗光伺服器上的可用記憶體。如果不需要任何記憶體上的限制將其設為 -1。

php.ini 設定上傳檔案功能範例

假設要上傳一個 50MB 的大檔案,php.ini 設定如下:

file_uploads = On
upload_tmp_dir = "/user/file"
upload_max_filesize = 50M
post_max_size = 100M
max_execution_time = 600
max_input_time = 600
max_input_time = 600