System.IO之图片的2进制存储

当我问一些开发同伴:StreamReader,FileStream,MemoryStream,这些对象有人知道吗?

基本回答的都是:不是很清楚,用的很少,诸如此类...

我当时想问他们的原因是,我想拓展一下对System.IO这个类的认识。

因为我觉得这个类库真的很强大....

好了,废话不多少,进入正题:

想要获取到文件,必须得获得文件的名称:所以需要一个openfiledialog控件(方便起见)

那想把文件存储到数据库,当然数据库中得有一个数据类型为二进制的字段(binary或image),我用的是oracle,BLOB类型字段存储

那,准备工作完成,直接上码!如果急用的话,可以直接复制该代码进行使用。

'========================================================================================

'浏览图片的按钮点击事件

Private Sub btnSerchImg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSerchImg.Click
        With ofd
            .DefaultExt = ".jpg"
            .Filter = "jpg file(*.jpg)|*.jpg|all file(*.*)|*.*"     '这个可以修改为自己想过滤的图片类型
            .FilterIndex = 1
            .InitialDirectory = "c\"                                     '默认盘符为C盘
            .Title = "打开文件"
        End With
        If ofd.ShowDialog = System.Windows.Forms.DialogResult.OK Then      '表示选中了一个文件

       ’将选中文件以流的方式从读取strFileName中存储到内存中
            Dim strFileName As String = ofd.FileName
            Dim blbImage As System.IO.StreamReader = New System.IO.StreamReader(strFileName)    
            txtImgPath.Text = ofd.FileName
            blbImage.Close()

       '读取完毕后,关闭流对象(任何一个带有.Close()方法的对象,用完以后一定要关上)
            blbImage = Nothing
        End If

    End Sub

'保存图片按钮的点击

Private Sub btnAddImg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAddImg.Click

        Dim FSO As New System.IO.FileStream(ofd.FileName, _
                                System.IO.FileMode.Open, System.IO.FileAccess.Read)               

 ’FSO从内存中读取文件的二进制流(图片的二进制流是一系列二进制数据的数组组成,所以这里需要新建一个byte数组来存放,数据库中也是以这样的方式存储)

        Dim imgArrayByte(CType(FSO.Length() - 1, Integer)) As Byte

        FSO.Read(imgArrayByte, 0, imgArrayByte.Length)
        FSO.Close()  '不要忘了这件事

        Try

           '调用方法将数据保存到数据库中,这里无法用SQL语句保存,写语句的时候,会报一个错误,无法识别二进制类型数据

           '这里将介绍另外一个数据保存方法

            AddRow(id + 1, Me.zid, Me.txtImgName.Text, imgArrayByte, Me.txtRemark.Text, ofd.FileName.Split(".")(1).ToString())  
          '绑定图片到imagelist 或picturesbox之中 

          'bindImg()
        Catch Ex As System.Exception
        Finally

        End Try

    End Sub

'保存数据到数据库中(这里把DBHelper内容拿出来,更容易理解,这里用的还是oracle数据库,语法相同)

 '大致内容就是获取到需要存放的数据表的dataset,为数据表添加新行,将值写入,使用DataAdapter对象的update方法更新dataset中的table即可

 Private Sub AddRow(ByVal AUTOID As Integer, ByVal ZBH As Integer, ByVal NAME As String, ByVal [image] As Byte(), ByVal REMARK As String, ByVal TYPE As String)
        Dim oConn As System.Data.OracleClient.OracleConnection
        oConn = New System.Data.OracleClient.OracleConnection(oraHelper.ConnectionStringFcchtemp)
        Dim oComm As System.Data.OracleClient.OracleCommandBuilder
        Dim datTable As DataTable
        Dim datSet As System.Data.DataSet = New DataSet()

        Dim datAdp As OracleDataAdapter = New OracleDataAdapter("select * from fwzxxb_img", oConn)
      
        oComm = New System.Data.OracleClient.OracleCommandBuilder(datAdp)
        datAdp.Fill(datSet, "FWZXXB_IMG")
        datTable = datSet.Tables(0)
        Dim datRow As DataRow = Nothing
        datRow = datSet.Tables(0).NewRow()

        With datRow
            .Item("AUTOID") = AUTOID
            .Item("ZBH") = ZBH
            .Item("NAME") = NAME
            .Item("IMG") = [image]
            .Item("REMARK") = REMARK
            .Item("TYPE") = TYPE
        End With
        Try
            datSet.Tables(0).Rows.Add(datRow)
            datAdp.Update(datSet, "FWZXXB_IMG")
            MsgBox("添加成功")
        Catch ex As Exception
            MsgBox("Error : " & ex.ToString(), MsgBoxStyle.OkOnly, "Error Occured")
        Finally
            datSet = Nothing
            datTable = Nothing
            datRow = Nothing
            datAdp.Dispose()
            oComm.Dispose()
            oConn.Dispose()
            oConn.Close()
        End Try

    End Sub

'讲了如何存储,现在来讲如何读取二进制流到image中去

Private Sub bindImg()
        Dim imagedata() As Byte                          '声明一个二进制数组(因为数据库中是以二进制数组方式存放)
        Dim imageBytedata As IO.MemoryStream     '声明一个内存流对象,获取数据库中的二进制流
        Dim dt As DataTable = GetDataTable("select img,name from fwzxxb_img where zbh=" & Me.zid)
        If dt.Rows.Count = 0 Then
            Exit Sub
        End If
            imagedata = dtRow.Item("img")
            imageBytedata = New IO.MemoryStream(imagedata)   '将数据库中二进制数据以流的方式存下来

 '用Image类的FormStream()方法将流转为图形,所以这里记得添加一个System.Drawimg名称空间

            picImg.Image = Image.FromStream(imageBytedata)   
    End Subs

posted @ 2011-05-06 10:16  J先生不太忙  Views(193)  Comments(0)    收藏  举报