一、上傳文件實現基礎
文件上傳是網站開發中常用的功能之一,通過上傳文件可以實現一些互動式的操作,如用戶頭像,文件分享,圖片上傳等。在PHP中,通過$_FILES超全局變數可以實現文件上傳功能。該變數是一個數組,包含上傳文件的各種信息,如文件名,文件類型,文件臨時存儲路徑等。
如上所示,通過HTML表單中添加type=”file”的input標籤,用戶可以選擇本地文件進行上傳。在form表單中設置enctype=”multipart/form-data”,告訴伺服器該表單中包含二進位數據,而非普通字元數據。在表單提交後,可以通過isset函數判斷是否選擇了文件,然後通過$_FILES[‘file’]獲取上傳文件的信息。將文件從臨時目錄移動到指定的目錄,就可以完成文件上傳操作。
if (isset($_POST["submit"]) && isset($_FILES["file"])) {
$file = $_FILES["file"];
if ($file["error"] === UPLOAD_ERR_OK) {
$name = $file["name"]; // 上傳文件的文件名
$type = $file["type"]; // 文件類型
$tmp_name = $file["tmp_name"]; // 文件被上傳到伺服器上的臨時文件名
$size = $file["size"]; // 文件大小
$upload_dir = "/var/www/upload/"; // 上傳目錄
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0777, true);
}
$dest = $upload_dir . $name;
move_uploaded_file($tmp_name, $dest);
echo "上傳成功";
} else {
echo "上傳失敗";
}
}
二、文件上傳的安全性問題
在實現文件上傳功能時,應該考慮到其中的安全性問題,防止出現文件被上傳到伺服器後,被誤用或成為安全漏洞的情況。
1、文件類型檢查
用戶上傳的文件類型由瀏覽器來檢測,但是有時候瀏覽器並不能完全判斷文件類型,很容易被偽裝成其他文件類型,導致安全隱患。因此,在伺服器端對上傳文件的MIME類型進行檢查是很必要的。可以通過使用PHP提供的finfo_file函數來獲取上傳文件的MIME類型。
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);
$type = finfo_file($fileinfo, $tmp_name);
if ($type !== "image/png") {
echo "不支持的文件類型";
exit;
}
2、文件大小限制
為了防止用戶上傳過大的文件,導致伺服器資源消耗過度,應該對上傳文件大小進行限制,一般情況下文件大小不應該超過2MB。可以通過設置php.ini或使用ini_set函數來修改文件大小限制。
ini_set("upload_max_filesize", "2M"); // 上傳文件的最大尺寸為2MB
ini_set("post_max_size", "2M"); // POST請求的最大尺寸為2MB
3、文件名檢查
用戶上傳的文件名可能含有特殊字元,如空格、斜杠等,容易造成路徑穿越攻擊,應該對文件名進行過濾和檢查。可以使用preg_match函數和正則表達式對文件名進行校驗。
if (!preg_match('/^[a-zA-Z0-9]+[a-zA-Z0-9\._-]*$/', $name)) {
echo "非法的文件名";
exit;
}
三、文件上傳進度顯示
在文件上傳過程中,如果上傳的文件過大,可能需要一些時間才能完成上傳,為了更好的用戶體驗,可以在上傳過程中顯示上傳進度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254704.html