PHP 4.1.0 前使用 $HTTP_POST_FILES 及自動全局變量($userfile_name 等);PHP 4.1.0+ 引入超全局陣列 $_FILES,並默認關閉 register_globals。現代代碼**必須使用 $_FILES**。
| 舊版自動全局變量 | 現代 $_FILES 寫法 | 說明 |
|---|---|---|
$userfile_name | $_FILES['userfile']['name'] | 客戶端原始文件名 |
$userfile_tmp_name | $_FILES['userfile']['tmp_name'] | 服務器臨時存儲路徑 |
$userfile_size | $_FILES['userfile']['size'] | 文件大小(字節) |
$userfile_type | $_FILES['userfile']['type'] | MIME 類型(瀏覽器提供,不可信) |
- | $_FILES['userfile']['error'] | 上傳錯誤碼(關鍵驗證字段) |
<?php
// 兼容舊代碼的過渡寫法(不推薦長期使用)
$userfile_name = $_FILES['userfile']['name'] ?? '';
$userfile_tmp_name = $_FILES['userfile']['tmp_name'] ?? '';
$userfile_size = $_FILES['userfile']['size'] ?? 0;
$userfile_type = $_FILES['userfile']['type'] ?? '';
// 推薦:直接使用 $_FILES 並封裝處理類
class UploadedFile {
public string $name;
public string $tmpPath;
public int $size;
public string $mimeType;
public int $error;
public static function fromArray(array $file): self {
$obj = new self();
$obj->name = $file['name'] ?? '';
$obj->tmpPath = $file['tmp_name'] ?? '';
$obj->size = $file['size'] ?? 0;
$obj->mimeType = $file['type'] ?? '';
$obj->error = $file['error'] ?? UPLOAD_ERR_NO_FILE;
return $obj;
}
public function isValid(): bool {
return $this->error === UPLOAD_ERR_OK;
}
public function moveTo(string $destination): bool {
return move_uploaded_file($this->tmpPath, $destination);
}
}
// 使用示例
$file = UploadedFile::fromArray($_FILES['avatar'] ?? []);
if ($file->isValid()) {
$ext = pathinfo($file->name, PATHINFO_EXTENSION);
$newName = bin2hex(random_bytes(16)) . '.' . $ext;
$file->moveTo("/var/www/uploads/{$newName}");
}
?>
chown www-data:www-data /var/www/uploads && chmod 755 /var/www/uploadsphp.ini 中 upload_tmp_dir 需可寫,或確保系統 /tmp 可寫$_FILES['file']['tmp_name'] 和 ['size']move_uploaded_file() 或 is_uploaded_file() 驗證來源finfo_file(finfo_open(FILEINFO_MIME_TYPE), $tmpPath)php.ini + 代碼雙重限制['name']、['type'] 用於業務邏輯