對象|資料|資料庫|顯示 在 ASP 中, 我們經常需要在 Web 頁面上顯示以二進位方式儲存在資料庫中的圖片。 一般的圖片顯示沒有什麼問題, 因為這方面的文章已經很多了, 我就不再闡述。 但有時候資料庫中的圖片是通過其他辦公軟體輸入的, 或者通過其他方式, 比如在 Access 中直接添加。 這時, 圖片以 OLE 對象的方式儲存在資料庫中, 在圖片真實內容的前面, 還儲存了一些其他的資訊, 比如圖片的路徑和檔案名稱,等等。 如果我們還用一般的輸出方式的話, 就會出錯, 導致圖片不能顯示。
幸好 jpeg, bmp 等圖象格式中在圖片內容的開頭都有一個 SOI marker,這個 marker 對於 jpeg 來說是 FFD8, 而對於 bmp 是 424D. 這樣一來, 我們只要找到這個 marker 的位置, 就可以忽略前面的內容而直接從這裡開始輸出圖片。以 SQL server 為例,代碼如下:
<%
'-------------------------------------------------------------------------------------
' 函數:function ShowJpegField(field)
' 作者: inelm(Archimond【阿克蒙德】) from csdn
' Date: 2003-12-6 更新
' 功能: 取得儲存 jpeg 圖片的位元組數組中的 SOI marker 開始位置, 並從該位置輸出真正的圖片資訊
' 註: jpeg 格式的 SOI marker : FFD8
' bmp 格式:424D
' 參數: 圖片欄位
' 傳回值: 無
' 調用範例:ShowJpegField(rs("picture1"))
' 注意: 調用此函數之前, 需要先申明 response.write 的 MIME 類型為 "image/jpeg"
'-------------------------------------------------------------------------------------
function ShowJpegField(field)
dim size, i, j
'要輸出欄位的總位元組數
size = field.ActualSize
'迴圈找到 SOI marker 的位置
for i = 1 to size
if AscB(MidB(field, i, 1)) = &HFF and AscB(MidB(field, i + 1, 1)) = &HD8 then
exit for
end if
next
'忽略前面的無用資訊, 從 SOI marker 開始輸出真正的圖片資訊
for j = i to size
response.BinaryWrite MidB(field, j, 1)
next
end function
%>
<%
'-------- 主程式開始 ------------------------------
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open("Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=123;Data Source=MARK")
sql = "select * from xinxi_mishuchu"
set rs = conn.execute(sql)
'聲明輸出類型, 清空輸出緩衝區
response.buffer = true
response.clear
response.ContentType = "image/jpeg"
'調用函數輸出圖片
ShowJpegField(rs("picture1"))
'打完收功!
rs.close : set rs = nothing
conn.close : set conn = nothing
%>
如果是其他格式的圖片, 如 bmp, gif 等, 輸出方法類似, 只不過是 SOI marker 不同而已。
由於作者水平有限, 錯誤之處在所難免,歡迎大家批評指正。