0%

媒体文件上传

同学们在开发asp.net作品的时候经常会用到要把一些文件上传到服务器上,但是这里的迷惑就是这些文件在服务器中是如何存在的?是在文件系统中还是在数据库?如果在文件系统中该如何提取?如果是在数据库中该如何存取?

我的建议是如果是小文件,而且数量有限可以放到数据库中,如果文件很大,同时数量非常多(随着系统的使用越来越多)还是存到文件系统中,然后把访问路径存到数据库中。

但是不管怎样,作为学习我们还是要学会这两种存取文件的方式。下面我们以用户头像文件为例来说明这两种方法。

1.存放到文件系统中

这种方式比较简单,主要是把头像文件上传到特定的文件夹中,同时把它的url相对路径存到数据库中就好了。代码如下

    if (fuAvart.FileContent != null)
    {
        //文件存取路径,存放在avart目录下以用户名命名的目录下
        string path = Server.MapPath("~/avart/" + HttpContext.Current.User.Identity.Name) + "\\";
        //图片的url相对路径
        string url = "~/avart/" + HttpContext.Current.User.Identity.Name + "/" + fuAvart.FileName;
        //如果路径不存在要先创建
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        //文件保存到相关路径下
        fuAvart.SaveAs(path + fuAvart.FileName);
        //把路径保存到数据库中
        string sql = "update users set avarturl='" + url + "' where username='" + HttpContext.Current.User.Identity.Name + "'";
        DataBase.RunSQL(sql);
        iAvart.ImageUrl = url;
    }

这种方式的提取也很简单,就是直接把图片的url值赋值给image控件就行了。一句话iAvart.ImageUrl = reader["avarturl"].ToString();

本部分数据库字段avarturl的类型为nvarchar(256)。

2.存放到数据库中

把图片存放到数据库中需要有一个image类型的字段,
在上传过程中,把图片文件转化成文件流,并把它作为sql命令的参数来执行

    if (fuAvart.FileContent != null)
    {
        string sql = "update users set avart=@avart where username=@username";
        SqlParameter[] prams = new SqlParameter[]{
            new SqlParameter("@avart",System.Data.SqlDbType.Image,fuAvart.FileBytes.Length),
            new SqlParameter("@username",System.Data.SqlDbType.VarChar,50)
        };
        prams[0].Value = fuAvart.FileBytes;
        prams[1].Value = HttpContext.Current.User.Identity.Name;
        DataBase.RunSQL(sql, prams);
        iAvart.ImageUrl = "avart.aspx";
    }

因为图片的显示需要一个新的页面,所以新创建一个文件avart.aspx,page_load中的代码如下:

    string sql = "select * from users where username='" + HttpContext.Current.User.Identity.Name + "'";
    SqlDataReader reader = null;
    DataBase.RunSQL(sql, out reader);
    //设置页面缓冲输出
    Response.Buffer = true;
    //清除缓冲区中的所有内容
    Response.Clear();
    if (reader.Read() && reader["avart"] != DBNull.Value)
    {
        byte[] file = (byte[])reader["avart"];
        //把二进制字符串写入HTTP输出流
        Response.OutputStream.Write(file,0,file.Length); 
    }
    reader.Close();
    //向客户端发送所有缓冲的内容
    Response.Flush();
    ////将当前所有缓冲的输出发送到客户端,并停止该页的执行
    Response.End();

需要显示头像的地方 iAvart.ImageUrl = "avart.aspx";

本部分数据库字段avart,类型image