仓酷云

标题: ASP.NET网页设计技能使用:ASP.NET中文件上传下载办法集... [打印本页]

作者: 飘飘悠悠    时间: 2015-1-16 22:49
标题: ASP.NET网页设计技能使用:ASP.NET中文件上传下载办法集...
觉得J2EE好像有很多工具,比如servlet,jboss,tomcat,ejb什么的,可是微软的.NET怎么什么也没有啊?asp.net|汇合|技能|上传|下载|中文  文件的上传下载是我们在实践项目开辟过程当中常常必要用到的手艺,这里给出几种罕见的办法,本文次要内容包含:
  1、怎样办理文件上传巨细的限定
  2、以文件情势保留到服务器
  3、转换成二进制字撙节保留到数据库和下载办法
  4、上传Internet上的资本
  第一部分:
  起首我们来讲一下怎样办理ASP.net中的文件上传巨细限定的成绩,我们晓得在默许情形下ASP.NET的文件上传巨细限定为2M,一样平常情形下,我们能够接纳变动Web.Config文件来自界说最年夜文件巨细,以下:
  如许上传文件的最年夜值就酿成了4M,但如许其实不能让我们无穷的扩展MaxRequestLength的值,由于ASP.NET会将全体文件载进内存后,再加以处置。办理的办法是使用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody办法从IIS为ASP.NET创建的pipe里分块读取数据。完成办法以下:
IServiceProvidERProvider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
 intn=1024;
 byte[]bs2=newbyte[n];
 while(wr.ReadEntityBody(bs2,n)>0)
 {
  ..
 }
}
  如许就能够办理了年夜文件的上传成绩了。
  第二部分:
  上面我们来先容怎样以文件情势将客户真个一个文件上传到服务器并前往上传文件的一些基础信息。
  起首我们界说一个类,用来存储上传的文件的信息(前往时必要)。
publicclassFileUpLoad
{
 publicFileUpLoad()
 {}
 /**////
 ///上传文件称号
 ///
 publicstringFileName
 {
  get
  {
   returnfileName;
  }
  set
  {
   fileName=value;
  }
 }
 privatestringfileName;
 /**////
 ///上传文件路径
 ///
 publicstringFilePath
 {
  get
  {
   returnfilepath;
  }
  set
  {
   filepath=value;
  }
 }
 privatestringfilepath;
 /**////
 ///文件扩大名
 ///
 publicstringFileExtension
 {
  get
  {
   returnfileExtension;
  }
  set
  {
   fileExtension=value;
  }
 }
 privatestringfileExtension;
}
  别的我们还能够在设置文件中限定上传文件的格局(App.Config):
<?XMLversion="1.0"encoding="gb2312"?>
<Application>
<FileUpLoad>
<Format>.jpg|.gif|.png|.bmp
</FileUpLoad>
</Application>
  如许我们就能够入手下手写我们的上传文件的办法了,以下:
publicFileUpLoadUpLoadFile(HtmlInputFileInputFile,stringfilePath,stringmyfileName,boolisRandom)
{
 FileUpLoadfp=newFileUpLoad();
 stringfileName,fileExtension;
 stringsaveName;
 //
 //创建上传工具
 //
 HttpPostedFilepostedFile=InputFile.PostedFile;
 fileName=System.IO.Path.GetFileName(postedFile.FileName);
 fileExtension=System.IO.Path.GetExtension(fileName);
 //
 //依据范例断定文件格局
 //
 AppConfigapp=newAppConfig();
 stringformat=app.GetPath("FileUpLoad/Format");
 //
 //假如格局都不切合则前往
 //
 if(format.IndexOf(fileExtension)==-1)
 {
  thrownewApplicationException("上传数据格局分歧法");
 }
 //
 //依据日期和随机数天生随机的文件名
 //
 if(myfileName!=string.Empty)
 {
  fileName=myfileName;
 }
 if(isRandom)
 {
  RandomobjRand=newRandom();
  System.DateTimedate=DateTime.Now;
  //天生随机文件名
  saveName=date.Year.ToString()+date.Month.ToString()+date.Day.ToString()+date.Hour.ToString()+date.Minute.ToString()+date.Second.ToString()+Convert.ToString(objRand.Next(99)*97+100);
  fileName=saveName+fileExtension;
 }
 stringphyPath=HttpContext.Current.Request.MapPath(filePath);
 //判别路径是不是存在,若不存在则创立路径
 DirectoryInfoupDir=newDirectoryInfo(phyPath);
 if(!upDir.Exists)
 {
  upDir.Create();
 }
 //
 //保留文件
 //
 try
 {
  postedFile.SaveAs(phyPath+fileName);
  fp.FilePath=filePath+fileName;
  fp.FileExtension=fileExtension;
  fp.FileName=fileName;
 }
 catch
 {
  thrownewApplicationException("上传失利!");
 }
 //前往上传文件的信息
 returnfp;
}
  然后我们在上传文件的时分就能够挪用这个办法了,将前往的文件信息保留到数据库中,至于下载,就间接翻开谁人路径就OK了。
  第三部分:
  这里我们次要说一下怎样以二进制的情势上传文件和下载。起首说上传,办法以下:
publicbyte[]UpLoadFile(HtmlInputFilef_IFile)
{
 //猎取由客户端指定的上传文件的会见
 HttpPostedFileupFile=f_IFile.PostedFile;
 //失掉上传文件的长度
 intupFileLength=upFile.ContentLength;
 //失掉上传文件的客户端MIME范例
 stringcontentType=upFile.ContentType;
 byte[]FileArray=newByte[upFileLength];
 StreamfileStream=upFile.InputStream;
 fileStream.Read(FileArray,0,upFileLength);
 returnFileArray;
}
  这个办法前往的就是上传的文件的二进制字撙节,如许我们就能够将它保留到数据库了。上面说一下这类情势的下载,大概你会想到这类体例的下载就是新建一个aspx页面,然后在它的Page_Load()事务里掏出二进制字撙节,然后再读出来就能够了,实在这类办法是不成取的,在实践的使用中大概会呈现没法翻开某站点的毛病,我一样平常接纳上面的办法:
  起首,在Web.config中到场:
<addverb="*"path="openfile.aspx"type="RuixinOA.Web.BaseClass.OpenFile,RuixinOA.Web"/>
  这暗示我翻开openfile.aspx这个页面时,体系就会主动转到实行RuixinOA.Web.BaseClass.OpenFile这个类里的办法,详细完成以下:
usingSystem;
usingSystem.Data;
usingSystem.Web;
usingSystem.IO;
usingRuixin.WorkFlowDB;
usingRXSuite.Base;
usingRXSuite.Component;
usingRuixinOA.BusinessFacade;
namespaceRuixinOA.Web.BaseClass
{
 /**////
 ///NetUFile的择要申明。
 ///
 publicclassOpenFile:IHttpHandler
 {
  publicvoidProcessRequest(HttpContextcontext)
  {
   //从数据库中掏出要下载的文件信息
   RuixinOA.BusinessFacade.RX_OA_FileManageros=newRX_OA_FileManager();
   EntityDatadata=os.GetFileDetail(id);
   if(data!=null&&data.Tables["RX_OA_File"].Rows.Count>0)
   {
    DataRowdr=(DataRow)data.Tables["RX_OA_File"].Rows[0];
    context.Response.Buffer=true;
    context.Response.Clear();
    context.Response.ContentType=dr["CContentType"].ToString();
    context.Response.AddHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(dr["CTitle"].ToString()));
    context.Response.BinaryWrite((Byte[])dr["CContent"]);
    context.Response.Flush();
    context.Response.End();
   }
  }
  publicboolIsReusable
  { 
   get{returntrue;}
  }
 }
}
  实行下面的办法后,体系会提醒用户选择间接翻开仍是下载。这一部分我们就说到这里。
  第四部分:
  这一部分次要说怎样上传一个Internet上的资本到服务器。
  起首必要援用System.Net这个定名空间,然后操纵以下:
HttpWebRequesthwq=(HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
HttpWebResponsehwr=(HttpWebResponse)hwq.GetResponse();
byte[]bytes=newbyte[hwr.ContentLength];
Streamstream=hwr.GetResponseStream();
stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));
//HttpContext.Current.Response.BinaryWrite(bytes);
  HttpWebRequest能够从Internet上读取文件,因而能够很好的办理这个成绩。
  第五部分:总结
  明天复杂的先容了几种文件上传与下载的办法,都是在实践的项目开辟中常常必要用到的,大概另有不完美的中央,但愿人人能够相互交换一下项目开辟中的履历。
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。
作者: 飘飘悠悠    时间: 2015-1-17 12:14
关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。
作者: 变相怪杰    时间: 2015-1-18 11:00
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
作者: 不帅    时间: 2015-1-21 19:15
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
作者: 再见西城    时间: 2015-1-30 21:55
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
作者: 分手快乐    时间: 2015-2-6 16:11
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
作者: 愤怒的大鸟    时间: 2015-2-17 02:54
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
作者: 因胸联盟    时间: 2015-3-5 14:48
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者: 乐观    时间: 2015-3-12 08:18
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
作者: 简单生活    时间: 2015-3-19 19:16
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2