首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 多圖片上傳與格式驗證完整實作

     編輯:PHP 相關知識

需求分析

  • 支援單次上傳多張圖片(範例限制 5 張)
  • 驗證檔案型態僅允許 JPEG、GIF、PNG、BMP
  • 防止同名檔案覆蓋
  • 回傳上傳結果清單(檔名、大小、類型、狀態)

HTML 表單(重點:name 陣列寫法)

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="imgfile[]" /><br/>
  <input type="file" name="imgfile[]" /><br/>
  <input type="file" name="imgfile[]" /><br/>
  <input type="file" name="imgfile[]" /><br/>
  <input type="file" name="imgfile[]" /><br/>
  <input type="submit" value="上傳" />
</form>

PHP 處理程式 (upload.php)

<?php
$uploadDir = "../uploads/";
$maxFiles  = 5;
$allowedTypes = array(
    "image/pjpeg", "image/jpeg", 
    "image/gif", 
    "image/x-png", "image/png",
    "image/bmp"
);

$results = array();
$success = $fail = 0;

for ($i = 0; $i < $maxFiles; $i++) {
    if (!isset($_FILES['imgfile']['name'][$i]) || $_FILES['imgfile']['name'][$i] == '') continue;

    $name = $_FILES['imgfile']['name'][$i];
    $type = $_FILES['imgfile']['type'][$i];
    $size = $_FILES['imgfile']['size'][$i];
    $tmp  = $_FILES['imgfile']['tmp_name'][$i];
    $err  = $_FILES['imgfile']['error'][$i];

    $result = "<tr><td>$name</td><td>" . round($size/1024,2) . " KB</td><td>$type</td><td>";

    if ($err !== UPLOAD_ERR_OK) {
        $result .= "<font color='red'>上傳錯誤 (code: $err)</font>";
        $fail++;
    } elseif (!in_array($type, $allowedTypes)) {
        $result .= "<font color='red'>檔案類型不允許</font>";
        $fail++;
    } elseif (file_exists($uploadDir . $name)) {
        $result .= "<font color='red'>檔案已存在</font>";
        $fail++;
    } else {
        if (move_uploaded_file($tmp, $uploadDir . $name)) {
            $result .= "成功";
            $success++;
        } else {
            $result .= "<font color='red'>移動檔案失敗</font>";
            $fail++;
        }
    }
    $result .= "</td></tr>";
    $results[] = $result;
}

if (empty($results)) {
    die("未選擇任何檔案");
}
?>
<table border="1" cellpadding="4" cellspacing="0">
<tr><th>檔名</th><th>大小</th><th>類型</th><th>結果</th></tr>
<?php foreach ($results as $r) echo $r; ?>
<tr><td colspan="4">共  個,成功 ,失敗 </td></tr>
</table>

安全性強化建議

  1. 二次驗證:使用 getimagesize() 或 finfo_file() 檢測真實 MIME 型態,防止偽裝副檔名
  2. 重新命名:以 uniqid() 或雜湊值重新命名,避免同名衝突與惡意腳本執行
  3. 儲存路徑:上傳目錄設為不可執行(Nginx/Apache 設定 php_flag engine off)
  4. 大小限制:php.ini 設定 upload_max_filesize、post_max_size;程式中再次檢查
  5. 權限控制:目錄權限 755,檔案 644,擁有者為 Web 使用者

進階:AJAX 非同步上傳

搭配 FormData + XMLHttpRequest 或 fetch API 可實現無刷新上傳與進度條顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved