首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 圖片上傳保存路徑至數據庫完整實現

     編輯:PHP 相關知識

本文提供一個完整的 PHP 圖片上傳系統示例,涵蓋數據庫連接、文件上傳處理、隨機重命名、類型驗證、預覽展示、數據庫存儲等全流程代碼,適合初學者參考學習。

系統架構

  • conn.php:數據庫連接配置
  • upload.php:上傳表單與入口邏輯
  • uploadclass.php:上傳核心處理類
  • MySQL 數據庫表結構

核心代碼模塊

1. 數據庫連接

<?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。

2. 上傳入口與表單

<?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>

3. 上傳核心處理類

<?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 "上傳失敗!";
}
?>

4. 數據庫表結構

-- 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;

安全與改進建議

  1. 防止 SQL 注入:使用預處理語句
    $stmt = $mysqli->prepare("INSERT INTO upload (title, pic) VALUES (?, ?)");
    $stmt->bind_param("ss", $title, $pic);
    $stmt->execute();
  2. 文件類型二次驗證:檢查 MIME 類型與文件頭
    $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("文件類型不合法");
  3. 限制上傳大小:php.ini + 代碼雙重限制
  4. 存儲路徑分離:上傳目錄置於 Web 根目錄外,通過腳本讀取輸出
  5. 使用 PDO/MySQLi:替換棄用的 mysql_* 函數

現代化重構方向

  • 採用 PSR-4 自動加載 + Composer 依賴管理
  • 使用 League/Flysystem 統一存儲抽層(本地/S3/FTP)
  • 引入圖片處理庫 Intervention/Image 實現縮圖、水印
  • 實現分塊上傳/斷點續傳支持大文件

此示例展示核心流程,生產環境務必加強安全防護與錯誤處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved