簡體   English   中英

如何使用 PHP 從 MySQL 數據庫中存儲和檢索圖像?

[英]How can I store and retrieve images from a MySQL database using PHP?

如何在 MySQL 中插入圖像,然后使用 PHP 檢索它?

我在這兩個領域的經驗都有限,我可以使用一些代碼讓我開始弄清楚這一點。

首先,您創建一個 MySQL 表來存儲圖像,例如:

create table testblob (
    image_id        tinyint(3)  not null default '0',
    image_type      varchar(25) not null default '',
    image           blob        not null,
    image_size      varchar(25) not null default '',
    image_ctgy      varchar(25) not null default '',
    image_name      varchar(50) not null default ''
);

然后您可以將圖像寫入數據庫,例如:

/***
 * All of the below MySQL_ commands can be easily
 * translated to MySQLi_ with the additions as commented
 ***/ 
$imgData = file_get_contents($filename);
$size = getimagesize($filename);
mysql_connect("localhost", "$username", "$password");
mysql_select_db ("$dbname");
// mysqli 
// $link = mysqli_connect("localhost", $username, $password,$dbname); 
$sql = sprintf("INSERT INTO testblob
    (image_type, image, image_size, image_name)
    VALUES
    ('%s', '%s', '%d', '%s')",
    /***
     * For all mysqli_ functions below, the syntax is:
     * mysqli_whartever($link, $functionContents); 
     ***/
    mysql_real_escape_string($size['mime']),
    mysql_real_escape_string($imgData),
    $size[3],
    mysql_real_escape_string($_FILES['userfile']['name'])
    );
mysql_query($sql);

您可以在網頁中顯示數據庫中的圖像:

$link = mysql_connect("localhost", "username", "password");
mysql_select_db("testblob");
$sql = "SELECT image FROM testblob WHERE image_id=0";
$result = mysql_query("$sql");
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
mysql_close($link);

不是將圖像存儲在數據庫中,而是將它們存儲在磁盤中的文件夾中,並將它們的位置存儲在數據庫中。

請注意,從數據庫提供圖像通常比從磁盤提供圖像要慢得多

您將啟動一個 PHP 進程,打開一個數據庫連接,讓數據庫從與文件系統相同的磁盤和 RAM 中讀取圖像數據以進行緩存,將其傳輸到少數套接字和緩沖區,然后通過 PHP 推出,默認情況下使它不可緩存並增加了分塊 HTTP 編碼的開銷。

OTOH 現代網絡服務器只需幾個優化的內核調用(內存映射文件和傳遞給 TCP 堆棧的內存區域)即可提供圖像,因此它們甚至不會復制內存並且幾乎沒有開銷。

這就是能夠在一台機器上並行處理 20 或 2000 張圖像的區別。

所以不要這樣做,除非你絕對需要事務完整性(實際上甚至可以通過數據庫和文件系統清理例程中的圖像元數據來完成)並且知道如何改進 PHP 對 HTTP 的處理以適合圖像。

我的看法是,與其將圖片直接存入數據庫,不如將圖片位置存入數據庫。 當我們比較這兩個選項時,出於安全目的,將圖像存儲在數據庫中是安全的。 缺點是

  1. 如果數據庫損壞,則無法檢索。

  2. 與其他選項相比,從 db 檢索圖像文件的速度很慢。

另一方面,將圖像文件位置存儲在 db 中將具有以下優點。

  1. 很容易找回。

  2. 如果存儲了多個圖像,我們可以輕松檢索圖像信息。

我還建議您考慮這一點,然后選擇將圖像存儲在您的文件系統而不是 DB 中。請參見此處: 在 DB 中存儲圖像 - 是還是不是?

就我個人而言,我不會將圖像存儲在數據庫中,而是將其放在無法從外部訪問的文件夾中,並使用數據庫來跟蹤其位置。 減少數據庫大小,您可以使用 PHP 將其包含在內。 沒有 PHP 就無法訪問該圖像

不要將圖像存儲在數據庫中,而是將其存儲在您的手機和電腦中,然后使用它的路徑,因為它將保存您的數據庫

我同意@Andomar 的基本概念,但會將實際圖像存儲在磁盤上以避免在 SQL 中存儲大量數據。 請記住,SQL 中的一個大字段是 255 個字符。 因此,您需要將圖像文件存儲在 Blob 中,當您只有少量行時(想想:數百,而不是數百萬),它會很好地工作。 推理很復雜,但這是一種很好的做法。 我是這樣知道的:

我寫了一個存儲大量(和大量)圖像的大型項目。 始終將它們存儲在磁盤上,以免為 SQL 頭疼。 如果您擔心數據庫損壞會留下無法“重建”到數據庫中的圖像,那么有一個簡單的修復方法(除了備份您的 SQL 表)

將圖像存儲在目錄樹中,目錄名稱對人類和解析有意義。 所以按時間存儲它可能看起來像“/year/month/day/picture.jpg”或用戶“/user_id/picture.jpg”。 以此為概念,只需將路徑存儲在 SQL 中。 這將使您的 SQL 表變小並且通常可緩存,並允許您的 SQL 表位於一台服務器上,而您的圖像可以存儲在另一台“服務器”上,例如 AWS 的 S3。

如果你真的很偏執,你可以將一個名為“{image_name)_meta.json”的文件存儲在與圖像本身相同的目錄中。 用您通常存儲在數據庫表中的圖像的元數據填充它。 如果表損壞,您可以編寫一個遍歷樹並從 JSON 文件重建表的小函數。 這當然會占用更多的磁盤空間,但它非常便宜(想想:AWS 的 S3)。

有很多方法可以解決這個問題,但是在任何 SQL 類型的表中存儲大量圖像並不是一個好主意。 例外情況是一次顯示數百個,或者可能是閃電般的快速檢索時間(而不是亞秒級)。

祝你的項目好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM