表單 `` 提交後,`$_FILES['myFile']` 為關聯數組:
| 鍵名 | 含義 | 示例 |
|---|---|---|
| name | 客戶端原始文件名 | photo.jpg |
| type | 瀏覽器報告 MIME (不可信) | image/jpeg |
| size | 文件大小 (字節) | 245760 |
| tmp_name | 服務器臨時文件路徑 | /tmp/phpXyZ123 |
| error | 錯誤碼 (0=成功) | 0 |
``
$_FILES['photos'] = [
'name' => ['a.jpg', 'b.png'],
'type' => ['image/jpeg', 'image/png'],
'tmp_name' => ['/tmp/php1', '/tmp/php2'],
'size' => [10000, 20000],
'error' => [0, 0],
];
// 處理需遍歷索引
foreach ($_FILES['photos']['name'] as $i => $name) {
$single = [
'name' => $name,
'type' => $_FILES['photos']['type'][$i],
'tmp_name' => $_FILES['photos']['tmp_name'][$i],
'size' => $_FILES['photos']['size'][$i],
'error' => $_FILES['photos']['error'][$i],
];
// 處理 $single
}
<?php
$allowedExt = ['gif', 'jpeg', 'jpg', 'png'];
$maxSize = 200 * 1024; // 200KB
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$file = $_FILES['file'] ?? null;
if (!$file || $file['error'] !== UPLOAD_ERR_OK) {
die('上傳失敗: ' . ($file['error'] ?? '無文件'));
}
$ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowedExt)) {
die('非法擴展名');
}
if ($file['size'] > $maxSize) {
die('文件過大');
}
// 真實 MIME 驗證
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($file['tmp_name']);
if (!in_array($mime, ['image/gif','image/jpeg','image/png'])) {
die('非法文件類型');
}
$dest = 'uploads/' . bin2hex(random_bytes(8)) . ".{$ext}";
if (move_uploaded_file($file['tmp_name'], $dest)) {
echo "上傳成功: {$dest}";
} else {
echo "移動失敗";
}
}
?>