2014年7月28日

使用PHP上傳檔案及檔案大小限制設定

使用PHP上傳檔案是個再基礎不過的功能了,而且相當常用。 此外,在php.ini設定檔中,還可以使用upload_max_filesize以及post_max_size兩個參數來設定上傳檔案的大小限制。

上傳檔案簡介

以下先簡單介紹如何使用PHP上傳檔案:
首先,當然是寫個簡單的上傳用網頁:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>

<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">  
    <input type="file" name="file" id="file" /> 
    <input type="submit" name="submit" value="submit" />
    </form>
</body>
</html>
而PHP程式則如下:
<?php
  if ($_FILES["file"]["error"] == UPLOAD_ERR_OK) {

    $html = "Upload(name): " . $_FILES["file"]["name"] . "<br />";
    $html .= "Type: " . $_FILES["file"]["type"] . "<br />";
    $html .= "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    $html .= "Stored in: " . $_FILES["file"]["tmp_name"] . "<br />";

    //將上傳成功的檔案放到指定路徑下
    $moveRes = move_uploaded_file($_FILES["file"]["tmp_name"],
    "/path_for_uploaded_file");

    $html .= "Uploaded file is moved to /path_for_uploaded_file". "<br />";
    echo $html;
  }
  else {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }

?>
程式第一行即檢查檔案是否上傳成功。 UPLOAD_ERR_OK表示上傳成功,而其他錯誤代碼可以參考:http://php.net/manual/en/features.file-upload.errors.php

在php.ini限制上傳檔案的大小

在php.ini設定可以限制上傳檔案的大小: 以下範例設定檔案上傳大小最大不得超過120M。
; Maximum allowed size for uploaded files.
upload_max_filesize = 120M
設定完畢之後,重開httpd伺服器即可生效。
然而,還有另一個地方需要注意的,那就是設定HTTP POST資料量的大小。
; Maximum size of POST data that PHP will accept.
post_max_size = 120M
upload_max_filesizepost_max_size有什麼不同呢? upload_max_filesize是限制一個檔案的大小,而post_max_size是限制一次HTTP POST資料量的大小。
因此,一般來說post_max_size至少要大於等於upload_max_filesize;否則,上傳檔案大小的限制會小於預期。
筆者第一次上傳檔案時,只改了upload_max_filesize(改為120M),卻不知道post_max_size預設只有8M,因此一直遇到「檔案小於120M卻無法正確上傳」的狀況。最後是看了PHP log, 發現PHP警告POST資料超過8M, 上網查詢了一下資料才得以解決。
運用upload_max_filesizepost_max_size兩個參數,還可以設定一些特殊的情況,像是要限制上傳的單一檔案大小10M,不過最多可以一次上傳10個檔案的話,可以這樣設定:
; Maximum allowed size for uploaded files.
upload_max_filesize = 10M

;...

; Maximum size of POST data that PHP will accept.
post_max_size = 100M
即設定post_max_size為100M,而upload_max_filesize為10M就可以了,非常簡單卻實用。