web应用中文件的存放方式解决方案解决方案A:将附件保存到数据库服务器上,用户访问任何一台Web服务器都是通过连接到数据库,从数据库中读取数据并传输到用户客户端。优点:可以避免文件系统的权限问题,文件全部放在数据库中,非常方便文件的查找、管理和备份。缺点:在数据库中保存和检索能力文件会给服务器端增加压力。如果数据的量过大,速度上也存在弱势。技术储备:①利用FileUpLoad控件的FileBytes属性来获取字节数组。②数据表的设计字段名数据类型说明IDint文件编号FileNameVarchar(50)文件名FileLengthint文件大小FileFiterVarchar(20)文件扩展名FileBytesimage文件字节数组③将文件上传到数据库中protectedvoidbtUp_Click(objectsender,EventArgse){if(fileUp.HasFile){stringstrCon=server=.;database=test;uid=sa;pwd=;SqlConnectionsqlcon=newSqlConnection(strCon);sqlcon.Open();SqlCommandsqlcom=newSqlCommand();sqlcom.Connection=sqlcon;sqlcom.CommandText=insertinto[File]values(@FileName,@FileLength,@FileFiter,@FileBytes);sqlcom.Parameters.Add(@FileName,SqlDbType.VarChar).Value=fileUp.FileName;sqlcom.Parameters.Add(@FileLength,SqlDbType.Int).Value=fileUp.FileBytes.Length;sqlcom.Parameters.Add(@FileFiter,SqlDbType.VarChar).Value=Path.GetExtension(fileUp.FileName);sqlcom.Parameters.Add(@FileBytes,SqlDbType.Image).Value=fileUp.FileBytes;sqlcom.ExecuteNonQuery();sqlcon.Close();}}④上传大文件Asp.net中默认是不能提交大于4M的表单,超过这个值是会报异常,解决方法需要配置web.config文件。system.webhttpRuntimemaxRequestLength=10240requestLengthDiskThreshold=100executionTimeout=600//system.webⅠ.maxRequestLength文件上传的最大字节数,以kb为单位。Ⅱ.requestLengthDiskThreshold文件上传时缓存的大小。Ⅲ.executionTimeout文件上传的最大上传时间以秒为单位。⑤注意点Ⅰ.System.IO.GetExtension()提取指定路径的扩展名。Ⅱ.MapPath()获取指定虚拟路径对应的服务器路径。Ⅲ.为了防止文件名相同,用当前时间作为文件名。解决方案B将文件保存在服务器的文件夹中。优点:速度上有优势,文件上传、下载通过链接读取文件。缺点:不便于文件的管理,比如将文件夹转移位置,或服务器硬盘满了,把文件放到其他地方,就得更新文件的链接。当然也不利于文件资料的备份等,如果有多个WEB服务器,当用户访问其一服务器,却得不到其他服务器文件夹的文件。原理:用SaveAs方法把文件上传到指定的地方。protectedvoidbtUp_Click(objectsender,EventArgse){if(fileUp.HasFile)//判断是否有文件{Literallt=newLiteral();//定义一个Literal用来显示脚本if(CheckFileType(fileUp.FileName))//检查上传文件的类型{stringfilePath=~/file/+fileUp.FileName;fileUp.SaveAs(MapPath(filePath));//把文件上传到服务器的绝对路径上lt.Text=scriptalert('文件上传成功!~')/script;}else{lt.Text=scriptalert('文件类型不正确!~')/script;}this.Controls.Add(lt);}}//用来获取文件类型publicboolCheckFileType(stringfileName){//获取文件的扩展名,前提要用这个方法必须引入命名空间iostringext=Path.GetExtension(fileName);switch(ext.ToLower()){case.gif:returntrue;case.png:returntrue;case.jpeg:returntrue;casejpg:returntrue;default:returnfalse;}}注意事项:为了使文件能上传到服务器,ASP.NET页面关联的Window账户必须有足够的权限来保存文件,设置权限的方法,在要上传的目录中点击右键—选择安全----为NETWORKSERVICE或ASP.NET账户提供该文件夹的写权限。把上传的文件显示到DATAlist中stringupPath=MapPath(~/file/);DirectoryInfodir=newDirectoryInfo(upPath);DataList1.DataSource=dir.GetFiles();DataList1.DataBind();解决方案C采用上传到数据库与服务器文件夹结合的方法。即先把文件放到服务器一个特定的文件夹中,然后再上传到数据库中,这样当用户读取某个文件时,若文件夹中有这个文件,则直接读取,而不用访问数据库。若文件夹中没有这个文件,则从数据库中读取,再放到这个文件夹中,这样,当用户第二次访问同样一个文件,就不需访问数据库,而直接从文件夹中读取。优点:不仅有着文件夹方式的访问效率,而且也有数据库存放方式的便于管理等优势。缺点:上传到数据库的话还是存在速度的上的弱势,也会造成数据冗余。解决方案D针对方案B将文件上传到服务器文件夹,在多台Web服务器上开启文件同步的服务,用户上传了附件到一台服务器上,通过文件同步服务将所有新上传的附件同步其他所有Web服务器上,这样就会在每台服务器上保存一个附件的副本,访问其一服务器,能够获取其他服务器的文件,但是及其浪费空间,而且文件的同步还存在延时和失败的情况。解决方案E文件上传到服务器文件夹,用数据库来进行管理,把文件上传到服务器的同时,将此文件的名字,长度,存储的服务器名称,路径等信息保存到数据库。数据库保存的是路径,通过读取数据库里的路径地址查到要找的文件优点:非常方便文件的查找、管理和备份。数据库的负担也不重,数据量过大时,存储速度也很快。如果换服务器时,只要在数据库里修改名称就可以。缺点:备份和恢复数据的时候比较麻烦,同时还要解决好,删除数据库的文件记录,是否还要删除文件本身。文件读取的时候还要把相对地址转为绝对地址。案例:购物网站商品的信息数据库,数据库一张表,后台上传图片后,图片会保存在服务器的文件夹下,图片的路径保存在商品信息表中。最后,图片在前台从数据库的路径读取服务器的图片显示出来。技术储备:利用FileUpLoad控件protectedvoidButton1_Click(objectsender,EventArgse){//判断上传格式是否符合boolflag=false;if(fileuploadPic.HasFile){//获取当前文件的格式stringfileExtension=System.IO.Path.GetExtension(fileuploadPic.FileName).ToUpper();//只允许上传格式string[]allowExtension={.JPG,.GIF,.PNG,.BMP,.JPEG,.SWF};for(inti=0;iallowExtension.Length;i++){if(fileExtension==allowExtension[i])flag=true;}}//如果符合上传模式if(flag){stringname=fileuploadPic.FileName;//获取文件名stringnewname=Session[photos1].ToString()+_+name;//重命名文件名,以免跟文件夹现有的文件重名stringipath=Server.MapPath(Photos)+\\+newname;//指定文件在服务器上的保存路径DateTimedate=System.DateTime.Now;//获取当前时间fileuploadPic.SaveAs(ipath);//将选定在控件上的文件保存到服务器指定的目录stringsql=insertintoBookPhoto(Bookimage)values('+ipath+');//把文件在服务器上的路径保存到数据//调用数据库的类,添加到数据库中。DBdb=newDB();SqlConnectioncnn=db.ConnectionCnnString1;inti=db.AddTable(sql);//把执行结果强制转换为int型数据if(i==1){Response.Write(scriptlanguage=javascriptalert('上传成功!')/script);}else{Response.Write(scriptlanguage=javascriptalert('上传失败!')/script);}}else{Response.Write(scriptlanguage=javascriptalert('文件格式不正确,请检查...')/script);}}FileUpLoad控件:如果要删除文件删除数据库中的信息,也要删除服务器文件下的对应的文件。可以用file类来实现删除,File.Delete();