資料表設計
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(20),
filetype CHAR(50),
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
LONGBLOB:最大 4GB,適用圖片、PDF、HTML 等二進位資料。
- 建議另存
filename、filesize、filetype 便於下載/瀏覽。
PHP 上傳儲存 (store.php)
<?php
$host='localhost'; $user='root'; $pass='pass'; $db='binary_data';
$conn = mysqli_connect($host, $user, $pass, $db) or die('連線失敗');
if (isset($_POST['submit'])) {
$desc = mysqli_real_escape_string($conn, $_POST['description']);
$file = $_FILES['form_data'];
// 讀取二進位內容
$data = file_get_contents($file['tmp_name']);
$data = mysqli_real_escape_string($conn, $data);
$sql = "INSERT INTO binary_data (description, bin_data, filename, filesize, filetype)
VALUES ('$desc', '$data', '{$file['name']}', '{$file['size']}', '{$file['type']}')";
mysqli_query($conn, $sql) or die('寫入失敗: '.mysqli_error($conn));
$id = mysqli_insert_id($conn);
echo "儲存成功,資料庫 ID: $id";
mysqli_close($conn);
} else {
?>
PHP 讀取輸出 (getdata.php)
<?php
$host='localhost'; $user='root'; $pass='pass'; $db='binary_data';
$conn = mysqli_connect($host, $user, $pass, $db) or die('連線失敗');
$id = (int)$_GET['id'];
$sql = "SELECT bin_data, filetype FROM binary_data WHERE id=$id";
$res = mysqli_query($conn, $sql) or die('查詢失敗');
$row = mysqli_fetch_assoc($res);
if ($row) {
header("Content-Type: {$row['filetype']}");
header("Content-Length: " . strlen($row['bin_data']));
echo $row['bin_data'];
} else {
header("HTTP/1.0 404 Not Found");
echo "File not found";
}
mysqli_close($conn);
?>
前端引用範例
<!-- 直接當圖片來源 -->
<img src="getdata.php?id=3" alt="資料庫圖片">
<!-- 下載連結 -->
<a href="getdata.php?id=5" download>下載檔案</a>
大檔案 (>1MB) 設定調整
| 層級 | 設定 | 建議值 (24MB 範例) |
| HTML 表單 | <input type="hidden" name="MAX_FILE_SIZE" value="24000000"> | 24000000 |
| PHP.ini | upload_max_filesize = 24M
post_max_size = 24M
memory_limit = 64M | 24M / 24M / 64M |
| MySQL | max_allowed_packet = 24M (my.cnf [mysqld]) | 24M |
| MySQL 啟動 | mysqld --max_allowed_packet=24M | 臨時生效 |
架構建議
- 優點:資料與檔案原子性、備份單一化、權限集中控管。
- 缺點:資料庫膨脹、備份/還原慢、記憶體壓力大、無法 CDN 加速。
- 生產環境推薦:檔案存物件存儲 (S3/MinIO/OSS),資料庫僅存
URL、MD5、Metadata。