單張圖片上傳相對簡單,但實際項目中往往需要支持多圖片同時上傳,並嚴格驗證文件格式,防止惡意文件上傳到服務器造成安全隱患。本文將詳細講解 PHP 多圖片上傳的核心邏輯、代碼實現及關鍵安全要點。
多圖片上傳的基本算法是利用數組形式處理:前端表單通過 name="imgfile[]" 將多個文件作為數組提交,後端遍歷 $_FILES['imgfile'] 數組,對每個元素逐一進行驗證、移動和記錄。
<?php
// 圖片存儲目錄(需確保可寫權限)
$img_dir = "../upload/";
// 初始化統計變量
$uploaded = 0;
$unuploaded = 0;
$results = [];
// 限制最多上傳 5 張圖片
$max_files = 5;
for ($i = 0; $i < $max_files; $i++) {
// 獲取當前文件信息
$file_name = $_FILES['imgfile']['name'][$i] ?? '';
// 跳過空文件
if (empty($file_name)) {
continue;
}
// 記錄文件基本信息
$file_size_kb = round($_FILES['imgfile']['size'][$i] / 1024, 2);
$file_type = $_FILES['imgfile']['type'][$i];
$results[$i] = "{$file_name} | {$file_size_kb}K | {$file_type} | ";
// 1. 驗證 MIME 類型(僅允許圖片格式)
$allowed_types = [
'image/jpeg', 'image/pjpeg', // JPG
'image/gif', // GIF
'image/png', 'image/x-png', // PNG
'image/bmp' // BMP
];
if (!in_array($file_type, $allowed_types)) {
$results[$i] .= "失敗:不支持的文件類型";
$unuploaded++;
continue;
}
// 2. 防止文件名衝突:生成唯一文件名
$ext = pathinfo($file_name, PATHINFO_EXTENSION);
$new_name = uniqid('img_', true) . ".{$ext}";
$dest_path = $img_dir . $new_name;
// 3. 移動臨時文件到目標目錄
if (move_uploaded_file($_FILES['imgfile']['tmp_name'][$i], $dest_path)) {
$results[$i] .= "成功";
$uploaded++;
} else {
$results[$i] .= "失敗:文件移動失敗";
$unuploaded++;
}
}
// 輸出結果
echo "上傳成功:{$uploaded} 張
";
echo "上傳失敗:{$unuploaded} 張
";
foreach ($results as $msg) {
echo $msg . "
";
}
?>
getimagesize() 或 exif_imagetype() 驗證文件真實內容location ~ \.php$ { deny all; })upload_max_filesize、post_max_size)和代碼中三重限制對於新項目,建議使用成熟庫(如 league/flysystem)或框架內置組件(Laravel Filesystem、Symfony HttpFoundation),它們提供更完善的存儲抽象、雲存儲支持和安全機制。