文件上傳包含兩部分:前端 HTML 表單 讓用戶選擇文件,後端 PHP 腳本 接收、驗證、移動文件至永久目錄。
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="img" />
<input type="submit" name="submit" value="上傳" />
</form>
enctype="multipart/form-data":必須,否則 $_FILES 為空。type="file":瀏覽器顯示文件選擇框。<?php
$DST_DIR = '/data/upload/'; // 需寫入權限
if (!empty($_FILES['img']['name'])) {
if ($_FILES['img']['error'] > 0) {
die("上傳失敗,錯誤碼: {$_FILES['img']['error']}");
}
$src = $_FILES['img']['tmp_name'];
$dst = $DST_DIR . basename($_FILES['img']['name']);
if (move_uploaded_file($src, $dst)) {
echo "上傳成功:$dst";
} else {
echo "移動文件失敗,請檢查目錄權限";
}
} else {
echo "請選擇文件";
}
| 鍵名 | 說明 |
|---|---|
name | 客戶端原始文件名 |
type | MIME 類型 (瀏覽器提供,不可信) |
size | 文件大小 (位元組) |
tmp_name | 伺服器臨時儲存路徑 |
error | 錯誤碼 (0=成功,1=超過 php.ini upload_max_filesize,2=超過表單 MAX_FILE_SIZE,3=部分上傳,4=無文件,6=無臨時目錄,7=寫入失敗) |
move_uploaded_file() 內建檢查文件是否真經由 HTTP POST 上傳,防止惡意腳本利用 copy() 讀取任意伺服器文件 (如 /etc/passwd)。這是安全基線,請務必使用。
$ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); in_array($ext, ['jpg','png','gif','pdf'])finfo_file(finfo_open(FILEINFO_MIME_TYPE), $tmp) 對比白名單。$_FILES['img']['size'] <= 2 * 1024 * 1024 (2MB)。$newName = uniqid() . '.' . $ext; 避免覆蓋、路徑遍歷。imagecreatefromstring(file_get_contents($tmp)) 再存,剝離潛在惡意代碼。file_uploads = On
upload_max_filesize = 8M
post_max_size = 10M ; 必須 > upload_max_filesize
max_file_uploads = 20
upload_tmp_dir = /tmp/php_upload
大文件建議採用 Plupload、Uppy 等前端庫配合 PHP 分塊合併,超出本文範圍,請參考專門教程。