同学们在开发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