none
如何显示数据库上的图像文件 RRS feed

  • 问题

  • 我用VS.net2008 VB代码写的网页

    如何显示已经保存在数据库上的二进制图像文件?

    如何单击所显示的图像后,自动打开?(图像文件可能是JPG,TIF,PDF)

    我用的是VB代码哦~请高手帮帮我,C#的我试过转换但总是不能用啊!

    2008年12月23日 7:45

答案

  • Code Snippet

    ShowFile.aspx的完整写法


    <% @Page Language="C#" %>
    <% @Import Namespace="System.IO" %>
    <% @ Import Namespace="System.Data" %>
    <% @ Import Namespace="System.Data.SqlClient" %>
    <script runat="server">
    private void Page_Load(Object sender, EventArgs e) {
    string sql="SELECT * FROM TestFiles WHERE ID = " + Request.QueryString["ID"];
    SqlConnection connection = new SqlConnection("Server=.;uid=sa;pwd=;Database=TestUploadFile");
    SqlCommand command = new SqlCommand(sql, connection);
    connection.Open();
    SqlDataReader dr = command.ExecuteReader();
    if(dr.Read()){
    Response.Clear();
    Response.AddHeader("Content-Type",dr["FileType"].ToString());
    Response.BinaryWrite((byte[])dr["MyFile"]);

    Response.End();
    }
    dr.Close();
    connection.Close();
    }
    </script>




    2008年12月29日 1:09
    版主
  • 其他的任何html标记都是无用的
    完整的例子参见
    http://blog.csdn.net/net_lover/archive/2003/08/11/6940.aspx
    2008年12月29日 1:10
    版主

  • 前台:
    <img src="getPhoto.aspx?id=编号">

    getPhoto.aspx前台:
    只留下
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="getPhoto.aspx.vb" Inherits="agtPrintCard"%> ,把其他的全部删除

    getPhoto.aspx后台:

      Dim bytes() As Byte
                Dim strSql As String
                Dim objCon As New SqlConnection("数据库连接串")
                Dim objCmd As New SqlCommand("", objCon)
                Dim objRdr As SqlDataReader

                strSql = "select 图片字段 from 表 where ID=@ID"
                objCmd.CommandText = strSql
                objCmd.Parameters.Add("@ID", Request("id"))

                objCon.Open()
                objRdr = objCmd.ExecuteReader(CommandBehavior.CloseConnection)
                If objRdr.Read Then
                    bytes = objRdr("图片字段")
                End If
                objRdr.Close()

                Response.BinaryWrite(bytes)


    2008年12月30日 8:01
  • Code Snippet

    VB代码也很多啊


    Dim cnString As String = "Data Source=(local);Initial
    Catalog=Example;Integrated Security=SSPI;"
    Dim cn As New
    System.Data.SqlClient.SqlConnection(cnString)


    Dim cmd As New System.Data.SqlClient.SqlCommand("select img from
    Photos where StudentID = 1", cn)


    Dim da As New System.Data.SqlClient.SqlDataAdapter(cmd)
    Dim ds
    As New DataSet()
    da.Fill(ds, "Photos")
    Dim mrc As DataTable
    mrc = ds.Tables("Photos")
    Dim c As Integer = mrc.Rows.Count
    If c > 0 Then
        Dim byteBLOBData As Byte()
        byteBLOBData = CType(mrc.Rows(0)("img"), Byte())

    Response.BinaryWrite(byteBLOBData )
    End If
    cn.Close()




    2008年12月31日 9:20
    版主
  • 另外,你出现的这是警告,并不是错误。
    而且说的很清楚,已经过时,说明有新的方法提供了,你查一下msdn的sdk就很清楚了,
    另外一个说变量未赋值就使用,你把使用的方法放在判断里面就可以了。

    警告不会影响程序运行的
    2008年12月31日 9:25
    版主

全部回复

  • 一下为伪代码 说说方向  

     

    在绑定的控件  加入  <img src="~\showpic.aspx?id=<%#行ID字段%>" />

    这样 img src可能就是   showpic.aspx?id=1

     

    然后  你在showpic.aspx 根据id 取得数据 byte()

     

    sub page_load()

     

    '取得数据到buffer()先

    response.clear()

    response.binarywrite (buffer())

    response.end()

    end sub

     

     

    2008年12月23日 8:53
  •  

    我之前也试过这种类似的方法~好似不行啊...什么都没有显示出来

     

    网上找的例子

    Public Sub Page_Load(sender As Object, e As EventArgs)
            Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
            Dim myCommand As New SqlCommand("Select * from Person", myConnection)
            Try
                myConnection.Open()
                Dim myDataReader as SqlDataReader
                myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)

                Do While (myDataReader.Read())
                    Response.ContentType = myDataReader.Item("PersonImageType")
                    Response.BinaryWrite(myDataReader.Item("PersonImage"))
                Loop

                myConnection.Close()
                Response.Write("Person info successfully retrieved!")
            Catch SQLexc As SqlException
                Response.Write("Read Failed : " & SQLexc.ToString())
            End Try
        End Sub

    我改了数据库名等后运行不能显示

    我的表是[T - image] 表中图片的字段是"image_ms" 图片ID就叫"ID"

            Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
            Dim myCommand As New SqlCommand("Select * from Person", myConnection)
    这两句我会,其他的你可以帮我改一下吗?我还真是一知半解

    2008年12月23日 9:17
  • 1
    Code Snippet

    1,不要写Response.Write,他们不是图像格式的

    2,一次只能显示一条记录,不要Loop

    3,



    Dim myConnection As New SqlConnection(ConfigurationSettings.AppSettings("ConnectionString"))
            Dim myCommand As New SqlCommand("Select * from Person Where Id=" + Request.QueryString("id"), myConnection)
            Try
                myConnection.Open()
                Dim myDataReader as SqlDataReader
                myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection)

                If myDataReader.Read() Then

                    Response.Clear()
                    Response.ContentType = myDataReader.Item("PersonImageType")
                    Response.BinaryWrite(myDataReader.Item("PersonImage"))

                   
    Response.End()

                End If

                myConnection.Close()
             
            Catch SQLexc As SqlException
                Response.Write("Read Failed : " & SQLexc.ToString())
            End Try


    2008年12月23日 9:41
    版主
  • 为什么还是不能显示图片呢?显示的只是这堆字

    Read Failed : System.Data.SqlClient.SqlException: Invalid column name 'phtotid'. 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) 在 _Default.Page_Load(Object sender, EventArgs e) 位置 C:\Documents and Settings\Kerry\My Documents\WebSite4\Packinglist system.aspx.vb:行号 58

     

     

    我的代碼


       

    Code Snippet

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim myConnection As New SqlConnection("Server='192.3';user id='12';password='123';database='chemical'")
            Dim myCommand As New SqlCommand("Select * from [T - chemical image] Where phtotid = '31'", myConnection)
            Try
                myConnection.Open()
                Dim myDataReader As SqlDataReader
                myDataReader = myCommand.ExecuteReader(Data.CommandBehavior.CloseConnection)

                If myDataReader.Read() Then

                    Response.Clear()
                    Response.ContentType = myDataReader.Item("Type")
                    Response.BinaryWrite(myDataReader.Item("Image_master"))

                    Response.End()

                End If

                myConnection.Close()

            Catch SQLexc As SqlException
                Response.Write("Read Failed : " & SQLexc.ToString())
            End Try

        End Sub

     

     

     

    2008年12月24日 1:31
  • Invalid column name 'phtotid'

    表示你的表里面根本就没有交足哟phtoid的列  是不是打错了'phototid'

    2008年12月24日 1:57
  • 错误提示说的很清楚了

    另外你的photoid不是数字类型的字段吗?如果是数字类型的,sql语句不要加单引号
    2008年12月24日 2:01
    版主
  • 我真粗心......已经更改好了~但还是没成功

     

    无法显示 XML 页。

    使用 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。


    文本内容中发现无效字符。处理资源 'http://localhost:4105/WebSite5/Default.aspx' 时出错。

    2008年12月29日 0:58
  • Code Snippet

    ShowFile.aspx的完整写法


    <% @Page Language="C#" %>
    <% @Import Namespace="System.IO" %>
    <% @ Import Namespace="System.Data" %>
    <% @ Import Namespace="System.Data.SqlClient" %>
    <script runat="server">
    private void Page_Load(Object sender, EventArgs e) {
    string sql="SELECT * FROM TestFiles WHERE ID = " + Request.QueryString["ID"];
    SqlConnection connection = new SqlConnection("Server=.;uid=sa;pwd=;Database=TestUploadFile");
    SqlCommand command = new SqlCommand(sql, connection);
    connection.Open();
    SqlDataReader dr = command.ExecuteReader();
    if(dr.Read()){
    Response.Clear();
    Response.AddHeader("Content-Type",dr["FileType"].ToString());
    Response.BinaryWrite((byte[])dr["MyFile"]);

    Response.End();
    }
    dr.Close();
    connection.Close();
    }
    </script>




    2008年12月29日 1:09
    版主
  • 其他的任何html标记都是无用的
    完整的例子参见
    http://blog.csdn.net/net_lover/archive/2003/08/11/6940.aspx
    2008年12月29日 1:10
    版主
  • C#,JS -- 不明白

    自动结贴-- 为什么?

    2008年12月29日 7:40
  • 哪有js?完整的例子和代码都在上面了,难道你还不明白吗?
    2008年12月30日 4:46
    版主

  • 前台:
    <img src="getPhoto.aspx?id=编号">

    getPhoto.aspx前台:
    只留下
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="getPhoto.aspx.vb" Inherits="agtPrintCard"%> ,把其他的全部删除

    getPhoto.aspx后台:

      Dim bytes() As Byte
                Dim strSql As String
                Dim objCon As New SqlConnection("数据库连接串")
                Dim objCmd As New SqlCommand("", objCon)
                Dim objRdr As SqlDataReader

                strSql = "select 图片字段 from 表 where ID=@ID"
                objCmd.CommandText = strSql
                objCmd.Parameters.Add("@ID", Request("id"))

                objCon.Open()
                objRdr = objCmd.ExecuteReader(CommandBehavior.CloseConnection)
                If objRdr.Read Then
                    bytes = objRdr("图片字段")
                End If
                objRdr.Close()

                Response.BinaryWrite(bytes)


    2008年12月30日 8:01
  •  

    多谢各位~多谢孟先生的热心

    本人比较笨,VB也还没学好,所以C#就更不要说了

     

    刚才用楼上的代码改了一下试试也是出错了

     

    警告 1 “Public Function Add(parameterName As String, value As Object) As System.Data.SqlClient.SqlParameter”已过时:“Add(String parameterName, Object value) has been deprecated.  Use AddWithValue(String parameterName, Object value).  http://go.microsoft.com/fwlink/?linkid=14202”。 C:\Documents and Settings\Kerry\My Documents\WebSite6\Default.aspx.vb 17 9 C:\...\WebSite6\
    警告 2 变量“bytes”在赋值前被使用。可能会在运行时导致 null 引用异常。 C:\Documents and Settings\Kerry\My Documents\WebSite6\Default.aspx.vb 26 30 C:\...\WebSite6\

    2008年12月31日 1:26
  • 不好意思,我的代码是用VS.NET2003写的,你用2005只要改一下代码就可以了。
    在VS.NET2005使用参数是这样的
    objCmd.Parameters.AddWithValue(参数名, 参数值)
    2008年12月31日 7:10
  • 如果不懂C#,而又找不到VB代码,用别人现成的C#代码是没问题的,但个页面用C#代码对其他页面用VB没影响。

    2008年12月31日 8:47
    版主
  • Code Snippet

    VB代码也很多啊


    Dim cnString As String = "Data Source=(local);Initial
    Catalog=Example;Integrated Security=SSPI;"
    Dim cn As New
    System.Data.SqlClient.SqlConnection(cnString)


    Dim cmd As New System.Data.SqlClient.SqlCommand("select img from
    Photos where StudentID = 1", cn)


    Dim da As New System.Data.SqlClient.SqlDataAdapter(cmd)
    Dim ds
    As New DataSet()
    da.Fill(ds, "Photos")
    Dim mrc As DataTable
    mrc = ds.Tables("Photos")
    Dim c As Integer = mrc.Rows.Count
    If c > 0 Then
        Dim byteBLOBData As Byte()
        byteBLOBData = CType(mrc.Rows(0)("img"), Byte())

    Response.BinaryWrite(byteBLOBData )
    End If
    cn.Close()




    2008年12月31日 9:20
    版主
  • 另外,你出现的这是警告,并不是错误。
    而且说的很清楚,已经过时,说明有新的方法提供了,你查一下msdn的sdk就很清楚了,
    另外一个说变量未赋值就使用,你把使用的方法放在判断里面就可以了。

    警告不会影响程序运行的
    2008年12月31日 9:25
    版主