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

PHP 將圖片等二進位檔案儲存至 MySQL:LONGBLOB 完整實作範例

     編輯:MySQL 資料庫相關知識

資料庫直接儲存二進位檔案(圖片、HTML、PDF)便於備份與交易一致性。本文提供完整流程:建立資料表、上傳儲存腳本、讀取輸出腳本,採用 LONGBLOB 欄位。

1. 建立資料庫與資料表

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

2. 儲存腳本

<?php
// store.php
if (isset($_POST['submit'])) {
  $conn = mysql_connect("localhost", "root", "password");
  mysql_select_db("binary_data", $conn);

  $fp = fopen($_FILES['form_data']['tmp_name'], 'rb');
  $data = fread($fp, $_FILES['form_data']['size']);
  fclose($fp);
  $data = addslashes($data);  // 轉義二進位資料

  $sql = "INSERT INTO binary_data (description, bin_data, filename, filesize, filetype)
          VALUES ('{$_POST['form_description']}', '$data',
                  '{$_FILES['form_data']['name']}', '{$_FILES['form_data']['size']}',
                  '{$_FILES['form_data']['type']}')";
  mysql_query($sql, $conn);
  $id = mysql_insert_id($conn);
  echo "檔案已儲存,資料庫 ID: $id";
  mysql_close($conn);
} else {
?>
  <form enctype="multipart/form-data" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
    檔案: <input type="file" name="form_data"><br>
    說明: <input type="text" name="form_description"><br>
    <input type="submit" name="submit" value="上傳">
  </form>
<?php } ?>

3. 讀取輸出腳本

<?php
// getdata.php?id=123
$id = (int)$_GET['id'];
if ($id > 0) {
  $conn = @mysql_connect("localhost", "root", "password");
  mysql_select_db("binary_data", $conn);
  $sql = "SELECT filetype, bin_data, filename FROM binary_data WHERE id = $id";
  $result = mysql_query($sql, $conn);
  if ($row = mysql_fetch_assoc($result)) {
    header("Content-Type: " . $row['filetype']);
    header("Content-Disposition: inline; filename=\"" . $row['filename'] . "\"");
    echo $row['bin_data'];
  } else {
    header("HTTP/1.0 404 Not Found");
    echo "檔案不存在";
  }
  mysql_close($conn);
}
?>

⚠️ 重要限制與現代改寫

議題舊版 (mysql_*)現代建議 (mysqli/PDO)
API已移除 (PHP 7+)mysqli / PDO
SQL 注入addslashes 不完整Prepared Statement
大檔案受限 memory_limit分塊讀寫 / LOB 流
max_allowed_packet預設 4MB/16MB調大至 > 最大檔案

現代 mysqli 版儲存範例

$stmt = $mysqli->prepare("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param("ssbis", $desc, $data, $fname, $fsize, $ftype);
$stmt->send_long_data(1, $data);  // 分塊發送 BLOB
$stmt->execute();

結語

資料庫存檔適合小檔案、低併發、需交易一致性場景(如文檔管理、憑證備份)。大型系統建議:物件儲存 (S3/MinIO) + 資料庫存路徑,分離靜態資產與關係資料。

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