資料庫直接儲存二進位檔案(圖片、HTML、PDF)便於備份與交易一致性。本文提供完整流程:建立資料表、上傳儲存腳本、讀取輸出腳本,採用 LONGBLOB 欄位。
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)
);
<?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 } ?>
<?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 | 調大至 > 最大檔案 |
$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) + 資料庫存路徑,分離靜態資產與關係資料。