首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 直接存儲二進制文件(圖片/HTML)完整實戰指南

     編輯:MySQL 資料庫相關知識

前言

將圖片、HTML 等二進制文件直接存入 MySQL 資料庫,雖非主流架構(通常建議存檔案系統、資料庫存路徑),但在特定場景(如小型應用、數據完整性要求高、避免文件遺失)下極具價值。本文完整演示:建庫建表、PHP 上傳存儲、讀取顯示三大步驟。

一、建立資料庫與資料表

-- 進入 MySQL 控制台
CREATE DATABASE binary_data;
USE binary_data;

CREATE TABLE binary_data (
    id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    description CHAR(50),
    bin_data LONGBLOB,
    filename CHAR(50),
    filesize CHAR(50),
    filetype CHAR(50)
);

關鍵點: LONGBLOB 支援最大 4GB 二進制數據,滿足大多數文件存儲需求。

二、PHP 上傳存儲程式 (store.php)

<?php
// 連接資料庫配置
$host = 'localhost';
$user = 'root';
$pass = 'password';
$db   = 'binary_data';

if (isset($_POST['submit'])) {
    $conn = mysqli_connect($host, $user, $pass, $db);
    if (!$conn) die('連接失敗: ' . mysqli_connect_error());

    // 取得上傳文件資訊
    $file      = $_FILES['form_data'];
    $data      = addslashes(file_get_contents($file['tmp_name']));
    $name      = $file['name'];
    $size      = $file['size'];
    $type      = $file['type'];
    $desc      = $_POST['form_description'];

    $sql = "INSERT INTO binary_data (description, bin_data, filename, filesize, filetype)
            VALUES ('$desc', '$data', '$name', '$size', '$type')";
    if (mysqli_query($conn, $sql)) {
        $id = mysqli_insert_id($conn);
        echo "<p>檔案已存儲,資料庫 ID: <b>$id</b></p>";
    } else {
        echo '存儲失敗: ' . mysqli_error($conn);
    }
    mysqli_close($conn);
} else {
?>
    <form method="post" action="" enctype="multipart/form-data">
        檔案描述: <br>
        <input type="text" name="form_description" size="40"><br>
        <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
        選擇檔案: <br>
        <input type="file" name="form_data" size="40"><br>
        <input type="submit" name="submit" value="上傳存儲">
    </form>
<?php } ?>

安全提醒: 實務務必使用 mysqli_real_escape_string 或預處理語句防止 SQL 注入;限制上傳文件類型與大小。

三、PHP 讀取顯示程式 (view.php)

<?php
$host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'binary_data';
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) die('連接失敗');

$id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
if ($id > 0) {
    $sql = "SELECT bin_data, filetype, filename FROM binary_data WHERE id = $id";
    $result = mysqli_query($conn, $sql);
    if ($row = mysqli_fetch_assoc($result)) {
        header('Content-Type: ' . $row['filetype']);
        header('Content-Disposition: inline; filename="' . $row['filename'] . '"');
        echo $row['bin_data'];
    } else {
        echo '找不到指定檔案';
    }
}
mysqli_close($conn);
?>

前端調用:<img src="view.php?id=1"> 即可直接顯示資料庫中的圖片。

四、優缺點權衡與最佳實踐

優點缺點
資料完整性高,備份還原單一文件即可資料庫體積膨脹快,備份/還原耗時長
避免文件系統權限、路徑、遺失問題大量二進制讀寫影響資料庫效能、連接佔用
事務一致性:文件與業務數據同進同出不利於 CDN 加速、靜態資源緩存

建議: 小型應用、文件較小(<1MB)、數量有限(<10萬)可直接存庫;大型系統建議「物件存儲(S3/MinIO/OSS)+ 資料庫存路徑」架構。

五、總結

本文提供了 MySQL 存儲二進制文件的完整可執行代碼,涵蓋建表、上傳、讀取全流程。掌握此技能後,您可根據業務場景靈活選擇「存庫」或「存路徑」策略,並在存庫方案中規避 SQL 注入、大文件阻塞等常見坑點。

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