我正在尝试使用经典ASP中的以下代码从MS-Access数据库中读取JPG图像:
Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
Response.ContentType = "image/jpg"
Set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("/database/database.mdb")
sqlString = "Select * from tblBusinessImages where fldID = " & request.querystring("id")
Set rs = cn.Execute(sqlString)
Response.BinaryWrite rs("fldImageData")
Response.End
但我一直收到错误消息,说明浏览器无法读取或显示图像。
数据库字段'tblBusinessImages'是一个OLE字段,图像通过复制粘贴保存到其中,此时仅用于测试目的(这可能是错误的方法吗?)
现在我知道MS-Access在BLOB对象中保存了额外的数据(正如MSDN所说here:
如果BLOB数据中包含任何无关信息,则会这样 由此脚本传递,图像将无法正常显示。 当你意识到大多数放置方法时,这变得很重要 图像进入BLOB字段以标题的形式放置额外的信息 与图像。例如Microsoft Access和Microsoft Visual FoxPro。这两个应用程序都在BLOB中保存OLE头 字段以及实际的二进制数据。
)
我的问题是如何在没有MS-Access保存的额外数据/标题的情况下从BLOB读取RAW图像数据?
感谢。
答案 0 :(得分:1)
经过一天的工作后,我意识到问题所在:问题在于图片保存到数据库的方式(手动)。
为了将图像保存到数据库,应使用以下代码:
Dim fileName
Dim conn
Dim rsTemp
Dim fldID
Dim sSQL
Dim mystream
Set mystream = Server.CreateObject("ADODB.Stream")
mystream.Type = 1
mystream.Open
mystream.LoadFromFile "D:\Desktop\My Downloads\compose1.jpg"
Set conn = Server.CreateObject("ADODB.Connection")
Set rsTemp = Server.CreateObject("ADODB.Recordset")
conn.Open "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("/database/database.mdb")
sSQL = "Select fldImageData from tblBusinessImages where fldID = 1;"
rsTemp.Open sSQL, conn, 3, 3
rsTemp.Fields("fldImageData").AppendChunk mystream.Read
rsTemp.Update
rsTemp.Close
set mystream = nothing
为了从MS-Access数据库中读取图像,应使用此代码:
Dim conn
Dim rsTemp
Dim sSQL
Dim fldID
fldID = Request.QueryString("id")
If Not fldID = "" And IsNumeric(fldID) Then
Set conn = Server.CreateObject("ADODB.Connection")
Set rsTemp = Server.CreateObject("ADODB.Recordset")
conn.Open "DRIVER=Microsoft Access Driver (*.mdb);DBQ=" & Server.MapPath("/database/database.mdb")
sSQL = "Select * from tblBusinessImages where fldID = " & request.querystring("id")
rsTemp.Open sSQL, conn, 3, 3
If Not rsTemp.EOF Then
Response.ContentType = "image/jpeg"
Response.BinaryWrite rsTemp("fldImageData")
Else
Response.Write("File could not be found")
End If
rsTemp.Close
conn.Close
Set rsTemp = Nothing
Set conn = Nothing
Else
Response.Write("File could not be found")
End If
这样,图像数据将作为长二进制数据保存在数据库的OLE字段中。阅读时,它将作为可读图像数据发布到浏览器。