【问题标题】:Reading image from MS-Access database in Classic ASP在经典 ASP 中从 MS-Access 数据库中读取图像
【发布时间】:2015-02-14 23:26:36
【问题描述】:

我正在尝试使用经典 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 视觉 FoxPro。这两个应用程序都将 OLE 标头保存在 BLOB 中 字段以及实际的二进制数据。

)

我的问题是如何在没有 MS-Access 保存的额外数据/标题的情况下从 BLOB 读取 RAW 图像数据?

谢谢。

【问题讨论】:

    标签: ms-access asp-classic blob


    【解决方案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 字段中保存为长二进制数据。读取时会作为可读的图片数据发布到浏览器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多