本文提供一個完整的 PHP 圖片上傳系統示例,涵蓋數據庫連接、文件上傳處理、隨機重命名、類型驗證、預覽展示、數據庫存儲等全流程代碼,適合初學者參考學習。
conn.php:數據庫連接配置upload.php:上傳表單與入口邏輯uploadclass.php:上傳核心處理類<?php
// conn.php
$host = "localhost";
$user = "root";
$pwd = "1721";
$conn = mysql_connect($host, $user, $pwd);
mysql_query("SET character_set_connection=gb2312, character_set_results=gb2312, character_set_client=binary", $conn);
if (!$conn) {
die("服務器連接失敗!");
}
$dbName = "database";
mysql_select_db($dbName, $conn) or die("打開數據庫失敗!");
?>
注意:mysql_* 函數 PHP 7.0+ 已移除,生產環境請使用 mysqli 或 PDO。
<?php
// upload.php
if ($_GET['action'] == "save") {
include_once('conn.php');
include_once('uploadclass.php');
$title = $_POST['title'];
$pic = $uploadfile; // 由 uploadclass.php 產生
if (empty($title)) {
echo "<script>alert('信息不完整!');history.back()</script>";
exit;
}
$sql = "INSERT INTO upload (title, pic) VALUES ('$title', '$pic')";
mysql_query($sql, $conn);
// echo "<script>alert('成功');location.href='upload.php'</script>";
}
?>
<html>
<form method="post" action="?action=save" enctype="multipart/form-data">
標題:<input name="title" type="text" id="title"><br>
文件:<input name="file" type="file">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="submit" value="上傳" name="upload">
</form>
</html>
<?php
// uploadclass.php
$uploaddir = "upfiles/"; // 必須以 / 結尾,且目錄可寫
$allowTypes = ["jpg", "gif", "bmp", "jpeg", "png"];
// 獲取副檔名
function fileext($filename) {
return substr(strrchr($filename, '.'), 1);
}
// 生成隨機文件名
function random($length) {
$hash = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for ($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
// 類型驗證
$ext = strtolower(fileext($_FILES['file']['name']));
if (!in_array($ext, $allowTypes)) {
die("僅允許上傳: " . implode(", ", $allowTypes));
}
// 生成唯一文件名
$filename = explode(".", $_FILES['file']['name']);
do {
$filename[0] = random(10);
$name = implode(".", $filename);
$uploadfile = $uploaddir . $name;
} while (file_exists($uploadfile));
// 移動文件
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
// 此處邏輯原代碼有誤,正確應為:
echo "<center>上傳成功!預覽: <br><img src='$uploadfile'></center>";
echo "<br><center><a href='upload.htm'>繼續上傳</a></center>";
}
} else {
echo "上傳失敗!";
}
?>
-- upload 表
CREATE TABLE `upload` (
`uploadid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
`pic` varchar(50) NOT NULL,
PRIMARY KEY (`uploadid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
$stmt = $mysqli->prepare("INSERT INTO upload (title, pic) VALUES (?, ?)");
$stmt->bind_param("ss", $title, $pic);
$stmt->execute();
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowedMimes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($mime, $allowedMimes)) die("文件類型不合法");
此示例展示核心流程,生產環境務必加強安全防護與錯誤處理。