萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 儲存二進位檔案 (圖片/文件) 完整實作:BLOB 欄位與 PHP 範例

一、 建立資料庫與資料表

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 二進位資料。

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

<?php
// store.php - 儲存二進位檔案到 MySQL
if ($submit) {
    // 連線資料庫 (請修改主機/帳號/密碼)
    mysql_connect("localhost", "root", "password");
    mysql_select_db("binary_data");

    // 讀取上傳檔案內容並轉義
    $data = addslashes(fread(fopen($form_data, "r"), filesize($form_data)));

    $sql = "INSERT INTO binary_data (description, bin_data, filename, filesize, filetype)
            VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')";
    mysql_query($sql);
    $id = mysql_insert_id();
    echo "<p>檔案已儲存,資料庫 ID: <b>$id</b></p>";
    mysql_close();
} 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">
        <p><input type="submit" name="submit" value="上傳"></p>
    </form>
<?php } ?>

執行後記下回傳的 Database ID,後續讀取需用到。

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

<?php
// getdata.php - 依 ID 讀取並輸出二進位資料
// 用法: getdata.php?id=<id>

if ($id) {
    @mysql_connect("localhost", "root", "password");
    @mysql_select_db("binary_data");

    $query = "SELECT bin_data, filetype FROM binary_data WHERE id=$id";
    $result = @mysql_query($query);
    $data = @mysql_result($result, 0, "bin_data");
    $type = @mysql_result($result, 0, "filetype");

    header("Content-type: $type");
    echo $data;
}
?>

呼叫範例

  • 直接存取:getdata.php?id=2
  • 嵌入圖片:<img src="getdata.php?id=3">

四、 突破 1MB 預設限制 (支援至 24MB)

  1. 修改 store.php 表單:MAX_FILE_SIZE = 24000000
  2. 修改 php.ini:upload_max_filesize = 24M, post_max_size = 24M
  3. 修改 MySQL 封包限制,啟動參數加入:
    mysqld_safe -O max_allowed_packet=24M ...

注意: 資料庫儲存大型二進位檔案會膨脹備份體積、降低查詢效能。生產環境建議儲存檔案路徑,實體檔案放在檔案系統或物件儲存 (S3/OSS) 中。

copyright © 萬盛學電腦網 all rights reserved