【问题标题】:display (not download) image from db从数据库显示(不下载)图像
【发布时间】:2013-12-18 04:59:19
【问题描述】:

我遵循http://www.aspsnippets.com/Articles/How-to-save-insert-Image-in-Database-in-ASPNet-using-C-and-VBNet.aspx 上的代码并设法将图像上传到我的数据库中。

但是当我按照http://www.aspsnippets.com/articles/Display-Images-from-SQL-Server-Database-using-ASP.Net.aspx 上的代码进行操作时,图像被下载而不是显示。


显示图片的页面代码:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="imgTest1.aspx.vb" Inherits="imgTest" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Image ID="Image1" runat="server" ImageUrl="imgTest1.aspx?id=1" />
        </div>
    </form>
</body>
</html>



Imports System.IO
Imports System.Data
Imports System.Data.SqlClient

Partial Class imgTest
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        If Request.QueryString("id") IsNot Nothing Then

            Dim strQuery As String = "select name, contentType, data from [imageTest] where id=1"
            Dim cmd As SqlCommand = New SqlCommand(strQuery)
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = Convert.ToInt32("1")

            Dim dt As DataTable = GetData(cmd)

            If dt IsNot Nothing Then
                Dim bytes() As Byte = CType(dt.Rows(0)("data"), Byte())
                Response.Buffer = True
                Response.Charset = ""
                Response.Cache.SetCacheability(HttpCacheability.NoCache)
                Response.ContentType = dt.Rows(0)("ContentType").ToString()
                Response.AddHeader("content-disposition", "attachment;filename=" & dt.Rows(0)("name").ToString())
                Response.BinaryWrite(bytes)
                Response.Flush()
                Response.End()
            End If

        End If

    End Sub

    Public Function GetData(ByVal cmd As SqlCommand) As DataTable
        Dim dt As New DataTable
        Dim strConnString As String = System.Configuration.ConfigurationManager.ConnectionStrings("CapstoneConnectionString1").ConnectionString
        Dim con As New SqlConnection(strConnString)
        Dim sda As New SqlDataAdapter
        cmd.CommandType = CommandType.Text
        cmd.Connection = con
        Try
            con.Open()
            sda.SelectCommand = cmd
            sda.Fill(dt)
            Return dt
        Catch ex As Exception
            Response.Write(ex.Message)
            Return Nothing
        Finally
            con.Close()
            sda.Dispose()
            con.Dispose()
        End Try
    End Function

End Class

图片上传到数据库就好了。

问题在于从数据库显示图像,图像被下载而不是显示。

【问题讨论】:

  • 尝试删除“附件;”来自 content-disposition 标头。
  • HTTP 处理程序是提供图像的更有效方式support.microsoft.com/kb/307997
  • @David 尝试了您的建议,现在图像正在显示。但是该页面仅显示图像,该页面上的所有其他标签、文本等都不存在。哦,好吧...是时候提出另一个问题了。

标签: asp.net vb.net image


【解决方案1】:

您是将图像作为 BLOB 或 VARBINARY 存储在数据库中,还是将图像的路径存储在数据库中?

如果您要存储路径,那么您只需设置&lt;asp:Image&gt; 控件的ImageURL 属性:

Image1.ImageURL = [column in database];

如果将图像作为 VARBINARY 存储在数据库中,请参阅以下答案: https://stackoverflow.com/a/8084628/117658

【讨论】:

  • 如果您将帖子中的第一个链接视为 varbinary(MAX),则 OP 将存储在数据库中
  • 以varbinary(max)的形式在数据库中存储图像,而不是url。
【解决方案2】:

尝试改为写入输出流(注意不是 100% 确定 VB.NET 语法):

Imports System.IO
Imports System.Data
Imports System.Data.SqlClient

Partial Class imgTest
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

        If Request.QueryString("id") IsNot Nothing Then

            Dim strQuery As String = "select name, contentType, data from [imageTest] where id=1"
            Dim cmd As SqlCommand = New SqlCommand(strQuery)
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = Convert.ToInt32("1")

            Dim dt As DataTable = GetData(cmd)

            If dt IsNot Nothing Then
                Dim bytes() As Byte = CType(dt.Rows(0)("data"), Byte())
                Response.Buffer = True
                Response.Cache.SetCacheability(HttpCacheability.NoCache)
                Response.ContentType = dt.Rows(0)("ContentType").ToString()
                Response.OutputStream.Write(bytes(), 0, bytes().Length);
                Response.Flush()
                Response.End()
            End If

        End If

    End Sub

    Public Function GetData(ByVal cmd As SqlCommand) As DataTable
        Dim dt As New DataTable
        Dim strConnString As String = System.Configuration.ConfigurationManager.ConnectionStrings("CapstoneConnectionString1").ConnectionString
        Dim con As New SqlConnection(strConnString)
        Dim sda As New SqlDataAdapter
        cmd.CommandType = CommandType.Text
        cmd.Connection = con
        Try
            con.Open()
            sda.SelectCommand = cmd
            sda.Fill(dt)
            Return dt
        Catch ex As Exception
            Response.Write(ex.Message)
            Return Nothing
        Finally
            con.Close()
            sda.Dispose()
            con.Dispose()
        End Try
    End Function

End Class

【讨论】:

    【解决方案3】:

    尝试了 David 的“尝试从内容处置标题中删除“附件;”的建议。现在正在显示图像。但与此同时,另一个问题浮出水面,将在另一个问题中解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2012-12-28
      • 1970-01-01
      • 2015-08-08
      • 2021-09-07
      相关资源
      最近更新 更多