首页  ·  知识 ·  云计算
ASP.NET中实现文件在数据库中的存取
张丽 白浩  万方数据  综合  编辑:dezai  图片来源:网络
上传到服务器上的文件有两种存储形式,一种是存储在服务器的文件系统中,另一种就是存储在数据库中。两种形式各有优缺点,但从实际应用分析,文件上传到服务器
上传到服务器上的文件有两种存储形式,一种是存储在服务器的文件系统中,另一种就是存储在数据库中。两种形式各有优缺点,但从实际应用分析,文件上传到服务器的文件系统,存在很多管理和安全等方面的问题,例如文件重名、数据不一致和缺乏安全性等。而把文件数据与其它数据一起存储在数据库中,则可以很容易解决以上问题。因此在大多数情况下,最好把文件数据与其它数据一起存储到数据库。本文就介绍了一种在ASP.NET中用C#实现文件在SQL Server数据库中存取的方法。在该方法中主要用到了.NET框架中的System.IO.FileStream类。运用该类,以图像数据文件为例,给出了图像文件上传到数据库和从数据库中读取图像文件到客户端保存和显示的实现过程。

一、FileStream类简介

    .NET框架中提供了很多文件I/O类,用于对文件进行操作,使用时需要引用System.IO命名空间。其中System.IO.FileStream类主要负责对文件系统上的文件进行读取、写入、打开和关闭操作,对输入输出进行缓冲,从而提高性能。这里主要介绍本文用到的System.IO.FileStream类的几个属性和方法。

    (一)FileStream.Read方法:从流中读取字节块并将该数据写入给定缓冲区中。

    格式:public override int Read(byte[] array,int offset,int count)。

    其中array是接受从当前源中读取的字节流的缓冲区,offset是读取的起始位置,count是最多读取的字节数。

    (二)FileStream.Write方法:将从缓冲区读取的数据字节块写入该流。

    格式:public override void Write(byte[] array,int offset,int count)。

    其中array是待写的字节流所在的缓冲区,offset是写的起始位置,count是最多写的字节数。

    (三)FileStream.Close方法:关闭文件并释放与当前文件流关联的任何资源。

    格式:public override void Close()。

    (四)FileStream.Length属性:获取当前文件流的字节长度。

二、文件上传到数据库

    文件上传到数据库的步骤为:首先需要从客户端获取文件,读取文件流,并写入字节缓冲区,然后打开数据库连接,将文件流写入数据库,最后关闭数据库连接和文件流实例。下面以图像文件为例来说明,假设现有一个数据库表images,有三个字段:imgid、imgname、imgdata,其中imgid为int类型,自动生成,imgname为VarChar类型,imgdata为image类型,另有数据库连接实例conn。则具体上传过程如下:

    try
    {if(imgfile.Value!=null)//imgfile为一个属性rnnat=“gerver”的HtrallnputFile控件,用于选择要上传的文件
    {FileStream fs=am FileStream(imgfile.Value,FileMode.Open,FileAccess.Read);//建立一个FileStream实例fs,并以读的方式打开
    byte[] img=new byte[fs.Length];
    fs.Read(irng,0,(int)fs.Length);//纵文件流fs中读出字节块到img缓冲区中
    conn.0pen();//打开数据库连接
    //将文件流写入数据库
    string insertCmd=“insert into images(irngname,imgdata)values(?,?)”;
    OleDbCommand command=new OleDbCommand(insertCmd,conn);
    OleDbParameter porDatal=new OleDbParameter(“imgname”,OleDbType.VarChar,50,“imgname”);
    parDatal.Value=imgfile.Value.Substring(imgfile.Value.Lastlndexof(“//”)+1).Trim();
    command.Parameters.Add(parData1);
    OleDbParameter parData2=new OleDbParameter(“imgdata”,OleDbType.Binary,(int)fs.Length,“irngdata”);
    parData2.Value=img; command.Parameters.Add(parData2);
    command.ExecuteNonQuery();
    conn.Close();//关闭数据库连接
    fs.Close();//关闭文件流fs}
    }
    catch(Exception ex)
    {Response.Write(“