麻辣家族討論版版's Archiver

小誌 發表於 2010-6-14 01:20

資料庫圖片存取

不知道為什麼,大家似乎對於如何將如片檔案塞到資料庫很感興趣!因為一旦將圖片檔放入資料庫後,不僅資料庫的負擔變的很重,而且,若要對圖片檔加以編修是很困難的。

既然大家想知道,小誌就介紹如何將圖片檔存入資料庫吧!

本範例將圖片檔資料建立於SQL資料庫中,這個「圖片」資料庫我們定名為「pic」,而在資料庫中用來圖片檔案資料的資料表則定名為「myimage」。

在「myimage」資料表中,我們建立了五個欄位:idno、filename、filesize、filetype、filepic,其欄位設定說明如下:

[table]
[tr][td=1,1,103][size=2][font=細明體]欄位名稱[/font][color=white][/color][/size][/td][td=1,1,103][size=2][font=細明體]資料型態[/font][color=white][/color][/size][/td][td=1,1,103][size=2][font=細明體]資料長度[/font][color=white][/color][/size][/td][td=1,1,103][size=2][font=細明體]允許[/font][color=white][font=Courier New]Null[/font][/color][/size][/td][td=1,1,103][size=2][font=細明體]說明[/font][color=white][/color][/size][/td][/tr]
[tr][td=1,1,103][font=Courier New][color=#000000][size=2]idno[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]int[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]4[/size][/color][/font][/td][td=1,1,103][color=#000000][size=2][font=細明體]否[/font][/size][/color][/td][td=1,1,103][color=#000000][size=2][font=細明體]資料序號[/font][font=Courier New]([/font][font=細明體]自動遞增[/font][font=Courier New])[/font][/size][/color][/td][/tr]
[tr][td=1,1,103][font=Courier New][color=#000000][size=2]filename[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]varchar[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]50[/size][/color][/font][/td][td=1,1,103][color=#000000][size=2][font=細明體]是[/font][/size][/color][/td][td=1,1,103][color=#000000][size=2][font=細明體]檔案名稱[/font][/size][/color][/td][/tr]
[tr][td=1,1,103][font=Courier New][color=#000000][size=2]filesize[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]int[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]4[/size][/color][/font][/td][td=1,1,103][color=#000000][size=2][font=細明體]是[/font][/size][/color][/td][td=1,1,103][color=#000000][size=2][font=細明體]檔案大小[/font][/size][/color][/td][/tr]
[tr][td=1,1,103][font=Courier New][color=#000000][size=2]filetype[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]varchar[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]50[/size][/color][/font][/td][td=1,1,103][color=#000000][size=2][font=細明體]是[/font][/size][/color][/td][td=1,1,103][color=#000000][size=2][font=細明體]檔案類型[/font][/size][/color][/td][/tr]
[tr][td=1,1,103][font=Courier New][color=#000000][size=2]filepic[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]text[/size][/color][/font][/td][td=1,1,103][font=Courier New][color=#000000][size=2]16[/size][/color][/font][/td][td=1,1,103][color=#000000][size=2][font=細明體]是[/font][/size][/color][/td][td=1,1,103][font=細明體][size=2][color=#000000]檔案內容[/color][/size][/font][/td][/tr]
[/table]

[attach]1275[/attach]
放置圖片檔案內容的欄位「filepic」,其資料型別可以是Image或Text,兩者皆可放置大型的二進制資料檔,在本例中,小誌選擇使用Text資料型別。

以下是上傳圖片檔案的網頁內容,小誌應該不用多做解釋了吧!
upload_pic.php[code]<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>圖片檔案上傳</title>
</head>
<BODY>
<H3>圖片檔案上傳:(存入資料庫)<HR></H3>

<Form Action="mygetfile_pic.php" Method="POST"
Enctype="multipart/form-data">
<Input Type="File" Name="upfile" ><br>
<Input Type="Submit" value=" 開始上傳 ">
</Form>

</BODY></HTML>[/code][attach]1276[/attach]

小誌 發表於 2010-6-14 01:32

[color=DarkOrange][size=4][b]處理上傳的圖片檔案:[/b][/size][/color]

上傳檔案的基礎處理大家看清楚了,第一個重點是如何讀取圖片檔案內的資料,要讀取圖片檔案資料,首先的使用檔案處理函數群:fopen()、fread()、filesize()、fclose()等函數:[code]//開啟圖片檔
$file = fopen($_FILES["upfile"]["tmp_name"], "rb");
// 讀入圖片檔資料
$fileContents = fread($file, filesize($_FILES["upfile"]["tmp_name"]));
//關閉圖片檔
fclose($file);[/code]第二個重點是:讀取出來的圖片資料必須使用base64_encode()函數加以編碼:[code]// 圖片檔案資料編碼
  $fileContents = base64_encode($fileContents);[/code]編碼的目的在確保圖片資料的正確性。

那如何將上傳檔案的資訊寫入資料庫?不需特別處理,依照我們之前學過的,利用Insert Into命令寫入即可:[code]//連結SQL Server
$dbnum=mssql_connect("127.0.0.1","sa","12345");
//選取資料庫
mssql_select_db("pic");
//組合查詢字串
        $SQLSTR="Insert into myimage (filename,filesize,filetype,filepic) values('"
                  . $_FILES["upfile"]["name"] . "',"
                  . $_FILES["upfile"]["size"] . ",'"
                  . $_FILES["upfile"]["type"] . "','"
                  . $fileContents . "')";[/code]別忘了還要檢查一下上傳的圖片檔案大小是否為0,不然可是會發生錯誤喔!
mygetfile_pic.php[code]<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>圖片檔案上傳</title>
</head><BODY><H3>圖檔存入相關資訊:<HR></H3>

<?
      echo "<BLOCKQUOTE>";
      echo "檔案名稱:" . $_FILES["upfile"]["name"] . "<BR>";
      echo "檔案大小:" . $_FILES["upfile"]["size"] . "<BR>";
      echo "檔案類型:" . $_FILES["upfile"]["type"] . "<BR>";
      echo "暫存檔名:" . $_FILES["upfile"]["tmp_name"] . "<BR>";
      if ( $_FILES["upfile"]["size"] > 0 )
        {
         //開啟圖片檔
         $file = fopen($_FILES["upfile"]["tmp_name"], "rb");
         // 讀入圖片檔資料
         $fileContents = fread($file, filesize($_FILES["upfile"]["tmp_name"]));
         //關閉圖片檔
         fclose($file);

         // 圖片檔案資料編碼
         $fileContents = base64_encode($fileContents);

         //連結SQL Server
         $dbnum=mssql_connect("127.0.0.1","sa","12345");
         //選取資料庫
         mssql_select_db("pic");
         //組合查詢字串
         $SQLSTR="Insert into myimage (filename,filesize,filetype,filepic) values('"
                  . $_FILES["upfile"]["name"] . "',"
                  . $_FILES["upfile"]["size"] . ",'"
                  . $_FILES["upfile"]["type"] . "','"
                  . $fileContents . "')";
         //將圖片檔案資料寫入資料庫
         if(!mssql_query($SQLSTR)==0)
           {
            echo "您所上傳的檔案已儲存進入資料庫<a href=\"showpic.php?filename="
                 . $_FILES["upfile"]["name"] . "\">"
                 . $_FILES["upfile"]["name"] . "</a>";
           }
         else
           {
            echo "您所上傳的檔案無法儲存進入資料庫";
           }
        }
      else
        {
         echo "圖片上傳失敗";
        }
      echo "</BLOCKQUOTE>";
?>

<HR></BODY></HTML>[/code]為了能讓使用者能看到自己上傳的圖片檔,我們還加了一個超連結連結到圖片顯示網頁去,程式碼38~40行,超鏈結的「filename」參數就是用來提取圖片的依據。

[attach]1277[/attach]

小誌 發表於 2010-6-14 01:36

[color=DarkOrange][size=4][b]瀏覽資料庫的圖片檔案:[/b][/size][/color]

要顯示圖片第一重要的是設定網頁的MIME類型,也就是網頁顯示的資料格式為何,如我們上傳的圖片檔案為*.gif,則我們要設定網頁資料的格式類型為「image/gif」,要如何設定網頁資料的格式類型?使用header()就行了:[code]//設定網頁資料格式
header("Content-Type: 格式類型");[/code]可是,我們怎知道要顯示出來的圖片資料是哪一種資料類型?別擔心!我們在將圖片檔案存入資料庫時不是有一個欄位「filetype」,其內容不是就是上傳檔案的資料類型($_FILES["upfile"]["type"])嗎?直接拿來用就是了!

第二個要注意的是:當我們將圖片檔案內容存入資料庫時,使用base64_encode()函數加以編碼,因此,在取出圖片檔資料後,顯示圖片檔之前,要先用base64_decode()函數將資料還原!

showpic.php[code]<?
$dbnum=mssql_connect("127.0.0.1","sa","12345");
//選取資料庫
mssql_select_db("pic");
//組合查詢字串
$SQLSTR="select filepic,filetype from myimage where filename='"
         . $_REQUEST["filename"] . "'";
//
$cur=mssql_query($SQLSTR);
//取出資料
$data=mssql_fetch_array( $cur );

//設定網頁資料格式
header("Content-Type: $data[1]");
// 輸出圖片資料
echo base64_decode($data[0]);
?>[/code][attach]1278[/attach]


[color=RoyalBlue][size=4][b]完整 資料庫圖片存取範例壓縮檔下載:[/b][/size][/color][attach]1280[/attach]

jacky790325 發表於 2011-7-11 15:28

大部分看得懂版主的話....但是在2樓的 處理上傳的圖片檔案 中...3個步驟是寫在前一個php裡面嗎?
我感覺怪怪的...不清楚要另外include到另一個檔是不是...
debug中

c_c_lai 發表於 2012-4-30 07:42

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=2176&ptid=581]3#[/url] [i]小誌[/i] [/b]
[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=22870&ptid=581]4#[/url] [i]jacky790325[/i] [/b]
根據程式的執行順序應該是:
Upload_Pic.php  ->  mygetfile_pic.php  -> show.php  (可能改名稱了 > ShowPic.php)

thunder5288 發表於 2013-11-10 11:26

請問您~
如果要點一次瀏覽就選擇很多張圖片再上傳到mysql
而不是像那種很多個瀏覽,要一次選一張,選很多次再傳的那種
這樣要怎麼做呢?拜託幫忙一下!!!!!

wendy13231 發表於 2014-1-22 02:50

感謝分享,給了我很大的幫助

但是如果是要將已經上傳到資料庫中的圖片刪除的話
要如何做呢?
我是新手不好意思@@

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供