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

浙公网安备 33010602011771号