簡體   English   中英

在PHP中從MySQL中提取BLOB圖像數據

[英]Pulling BLOB image data from MySQL in PHP

我正在閱讀一些關於如何將我的圖像上傳到數據庫中作為二進制文件的教程,而不是將它們放在服務器本身,我得到它的工作原理如下:

PHP:

$image = chunk_split(base64_encode(file_get_contents($tmpfile)));
    mysql_query("INSERT INTO images (`img_location`, `caption`, `user`, `genre`, `when`) VALUES ('$image', '$caption', '$id', '$genre', '$when')");

我的問題是你現在如何從數據庫中提取它,我已經閱讀了幾種方法,嘗試了所有方法,無法搞清楚,我沒有得到MySQL錯誤,這就是我如何嘗試它:

$get_pics = mysql_query("SELECT * FROM images WHERE user='$id' ");
while($get_pics2 = mysql_fetch_array($get_pics))
{
$sixfour_enc = base64_decode($get_pics2['img_location']);

$new .= "<img src=\"".$sixfour_enc."\" >";
}

這樣做......有點,正在發生的是它在IMG標簽中打印出原始二進制文件。

如何將其再次編譯為可讀圖像? 另外,將數據存儲在數據庫中是愚蠢的嗎? 我應該只做我通常做的事情並將它們存儲在服務器上嗎?

謝謝你 - 米克

如果您願意,可以將圖像存儲在數據庫中(盡管將它們存儲為文件也沒有任何問題,選擇適合您情況的任何內容),但是將原始二進制數據存儲在BLOB中(即不要對其進行編碼) BASE64)。 您可以直接在查詢中嵌入從file_get_contents獲取的二進制數據,前提是您首先使用正確的轉義函數(在您的情況下為mysql_real_escape_string )。

至於圖像的輸出,您可以按照現在的方式進行,但是您必須輸出base64編碼並使用如下data URI方案:

echo '<img alt="embedded image" src="data:image/png;base64,' . chunk_split(base64_encode($get_pics2['img_location'])) . '">';

注意,嵌入圖像數據有一些優點和缺點。 需要注意的一些重要缺點是base64編碼的嚴重開銷(比原始編碼大約33%)和潛在的緩存問題。

如果您沒有任何特殊原因將圖像數據存儲在數據庫中,那么我強烈建議您以正常方式執行此操作。

這是因為,您的數據庫引擎將受到重大的性能影響,因為您將獲得並放置超過必要的數據。

此外,MySQL表上的BLOB字段在大小方面明顯大於其他表,並且在大多數情況下執行速度較慢。

實現這一點后,想象一下服務器上的開銷會給我帶來寒意。 ;)

我想這一切都歸結為可擴展性 一旦數據庫填滿,您的服務器響應速度就會降低,最終會變成真正的生豬。 您的下一個選擇是增加服務器RAM或修改代碼以適應更大的負載。

只需2美分,希望這有幫助!

祝好運!

實際上,最好的方法是使用PHP腳本輸出帶有正確標題的圖像二進制文件(例如getimage.php),用於生成HTML的腳本將具有如下代碼:

$get_pics = mysql_query("SELECT id FROM images WHERE user='$userid' ");
while($imglist = mysql_fetch_array($get_pics))
{
    $new .= '<img src="getimage.php?id='.$imglist['id'].'" title="'.$imglist['caption'].'" />';
}

所以HTML看起來像:

<img src="getimage.php?id=12345" title="the caption of" />

你必須在表格images上有一個主鍵(為什么不是?),比方說id

getimage.php ”腳本應提取二進制文件並輸出內容(假設字段img_location包含圖像的實際內容:

<?php
// this will output the RAW content of an image with proper headers
$id=(int)$_GET['id'];

$get_img = @mysql_fetch_assoc(@mysql_query("SELECT img_location FROM images WHERE id='$id' "));

$image = imagecreatefromstring(base64_decode($get_img['img_location']));
if ($image){
    //you may apply here any transformations on the $image resource
    header("Content-Type: image/jpeg"); //OR gif, png, whatever
    imagejpeg($image,null,75);          //OR imagegif, imagepng, whatever, see PHP doc.
    imagedestroy($image);               //dump the resource from memory
}
exit();
@mysql_close();
?>

這種方法將為您提供靈活性。 但是,您可能需要檢查並清理變量並選擇另一種連接到MySQL的方法,如MYSQLi或PDO。 另一個好主意是使用預准備語句來防止SQL注入。

暫無
暫無

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

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