从经典ASP中的MS-Access数据库中读取图像

时间:2015-02-12 22:59:12

标签: ms-access asp-classic blob

我正在尝试使用经典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图像数据?

感谢。

1 个答案:

答案 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字段中。阅读时,它将作为可读图像数据发布到浏览器。