




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.net上传文件,大文件及下载方式汇总(转) 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1、如何解决文件上传大小的限制 2、以文件形式保存到服务器 3、转换成二进制字节流保存到数据库以及下载方法 4、上传Internet上的资源 第一部分: 首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,可以采用更改web.config和 machine.config文件对网站和网站目录进行配置,web.config文件包含了某一个具体应用所需的一些特殊的配置信息,比如会话状态设置和身份验证设置,machine.config文件包含了整个服务器的配置信息.web.config可以从 machine.config继存或者重写部分配置信息.针对一个具体的网站可以配置两部分信息,一是针对整个服务器的machine.config配置,另外一个是针对望站的 web.config配置.web.config文件一般存在于网站的根目录下,他包含的配置信息对该目录和目录下的子目录起作用 (1)修改web.config文件 在web.config文件中添加<httpRuntime/>配置可以自定义上传文件的大小限制.添加的设置代码如下. <configuration> <system.web> <httpRuntime maxRequestLength=4096 /此大小为默认值,可以根据需要修改 executionTimeout=600 /此值指定上传文件的有效时间为分钟 /> </system.web> </configuration> (2)修改machine.config文件 在 %Microsoft.NETFramework v1.0.3705config(1.0版本或%Microsoft.NET Frameworkv1.1.4322config (1.1版本machine.config文件打开machine.config文件可以看到如下设置代码 <!- httpRuntime Attributes: executionTimeout=seconds -time in seconds before request is automatically timed out maxRequestLength=KBytes-KBytes size of maximum request length to accept useFullyQualifedREdirectUrl=true|false-fully qualifiy the URL for client redirects minFreeThreads=count-minmum number of free thread to allow execution of new requests minLocalRequestFreeThreads=count -minmum number of free thread to allow execution of new local requests appRequestQueueLimit=count -maxmum number of Requests queued for the application -> < httpRuntime executionTimeout=90 maxRequestLength=4096 useFullyQualifiedRedirectUrl=false minFreeThreads=8 minLocalRequestFreeThreas=4 appRequestQueueLimit=100/> 上面的代码中executionTimeout属性用于指定上传操作的有效时间(单位秒)maxRequestLength属性用于指定上传文件的最大字节数,单位,此属性默认大小为()通过修改此属性可以设置上传文件的大小。这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下:IServiceProvidERProvider=(IServiceProvider)HttpContext.Current; HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest); bytebs=wr.GetPreloadedEntityBody(); . if(!wr.IsEntireEntityBodyIsPreloaded() intn=1024; bytebs2=newbyten; while(wr.ReadEntityBody(bs2,n)>0) . 这样就可以解决了大文件的上传问题了。 第二部分:下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。 首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。public class FileUpLoad public FileUpLoad() /*/ / 上传文件名称 / public string FileName get return fileName; set fileName = value; private string fileName; /*/ / 上传文件路径 / public string FilePath get return filepath; set filepath = value; private string filepath; /*/ / 文件扩展名 / public string FileExtension get return fileExtension; set fileExtension = value; private string fileExtension; 另外我们还可以在配置文件中限制上传文件的格式(App.Config):?XML version=1.0 encoding=gb2312 ?> Application> FileUpLoad>Format>.jpg|.gif|.png|.bmp /FileUpLoad> /Application>这样我们就可以开始写我们的上传文件的方法了,如下:public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom) FileUpLoad fp = new FileUpLoad(); string fileName,fileExtension; string saveName; / /建立上传对象 / HttpPostedFile postedFile = InputFile.PostedFile; fileName = System.IO.Path.GetFileName(postedFile.FileName); fileExtension = System.IO.Path.GetExtension(fileName); / /根据类型确定文件格式 / AppConfig app = new AppConfig(); string format = app.GetPath(FileUpLoad/Format); / /如果格式都不符合则返回 / if(format.IndexOf(fileExtension)=-1) throw new ApplicationException(上传数据格式不合法); / /根据日期和随机数生成随机的文件名 / if(myfileName != string.Empty) fileName = myfileName; if(isRandom) Random objRand = new Random(); System.DateTime date = 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; string phyPath = HttpContext.Current.Request.MapPath(filePath); /判断路径是否存在,若不存在则创建路径 DirectoryInfo upDir = new DirectoryInfo(phyPath); if(!upDir.Exists) upDir.Create(); / /保存文件 / try postedFile.SaveAs(phyPath + fileName); fp.FilePath = filePath + fileName; fp.FileExtension = fileExtension; fp.FileName = fileName; catch throw new ApplicationException(上传失败!); /返回上传文件的信息 return fp; 然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。 第三部分:这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:public byte UpLoadFile(HtmlInputFile f_IFile) /获取由客户端指定的上传文件的访问 HttpPostedFile upFile=f_IFile.PostedFile; /得到上传文件的长度 int upFileLength=upFile.ContentLength; /得到上传文件的客户端MIME类型 string contentType = upFile.ContentType; byte FileArray=new ByteupFileLength; Stream fileStream=upFile.InputStream; fileStream.Read(FileArray,0,upFileLength); return FileArray; 这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个 aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法: 首先,在Web.config中加入:add verb=* path=openfile.aspx type=RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web/>这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:using System; using System.Data; using System.Web; using System.IO; using Ruixin.WorkFlowDB; using RXSuite.Base; using RXSuite.Component; using RuixinOA.BusinessFacade; namespace RuixinOA.Web.BaseClass /*/ / NetUFile 的摘要说明。 / public class OpenFile : IHttpHandler public void ProcessRequest(HttpContext context) /从数据库中取出要下载的文件信息 RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager(); EntityData data = os.GetFileDetail(id); if(data != null && data.TablesRX_OA_File.Rows.Count >0) DataRow dr = (DataRow)data.TablesRX_OA_File.Rows0; context.Response.Buffer = true; context.Response.Clear(); context.Response.ContentType = drCContentType.ToString(); context.Response.AddHeader(Content-Disposition,attachment;filename= + HttpUtility.UrlEncode(drCTitle.ToString(); context.Response.BinaryWrite(Byte)drCContent); context.Response.Flush(); context.Response.End(); public bool IsReusable get return true; 执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。 第四部分:这一部分主要说如何上传一个Internet上的资源到服务器。 首先需要引用 System.Net 这个命名空间,然后操作如下:HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create(http:/localhost/pwtest/webform1.aspx); HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse(); byte bytes = new bytehwr.ContentLength; Stream stream = hwr.GetResponseStream(); stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength); /HttpContext.Current.Response.BinaryWrite(bytes); HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。 第五部分:总结今天简单的介绍了几种文件上传与下载的方法,都是在实际的项目开发中经常需要用到的,可能还有不完善的地方,希望大家可以互相交流一下项目开发中的经验。 这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的 组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客堂中所说的办法 /saucer/archive/2004/03/16/16225.aspx,两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。 Lion.Web.UpLoadModule和AspnetUpload两个.NET组件都是利用的这个方案。 当上传单文件时,两个软件的方法是一样的,继承HttpModule HttpApplication application1 = sender as HttpApplication; HttpWorkerRequest request1 = (HttpWorkerRequest) (IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest); try if (application1.Context.Request.ContentType.IndexOf(multipart/form-data) <= -1) return; /Check The HasEntityBody if (!request1.HasEntityBody() return; int num1 = 0; TimeSpan span1 = DateTime.Now.Subtract(this.beginTime); string text1 = application1.Context.Request.ContentType.ToLower(); byte buffer1 = Encoding.ASCII.GetBytes(rn- + text1.Substring(text1.IndexOf(boundary=) + 9).ToCharArray(); int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11); Progress progress1 = new Progress(); application1.Context.Items.Add(FileList, new Hashtable(); byte buffer2 = request1.GetPreloadedEntityBody(); num1 += buffer2.Length; string text2 = this.AnalysePreloadedEntityBody(buffer2, UploadGUID); if (text2 != string.Empty) application1.Context.Items.Add(LionSky_UpLoadModule_UploadGUID, text2); bool flag1 = true; if (num2 > this.UpLoadFileLength() && (0 > span1.TotalHours) | (span1.TotalHours > 3) flag1 = false; if (0 > span1.TotalHours) | (span1.TotalHours > 3) flag1 = false; string text3 = this.AnalysePreloadedEntityBody(buffer2, UploadFolder); ArrayList list1 = new ArrayList(); RequestStream stream1 = new RequestStream(buffer2, buffer1, null, RequestStream.FileStatus.Close, RequestStream.ReadStatus.NoRead, text3, flag1, application1.Context, string.Empty); list1.AddRange(stream1.ReadBody); if (text2 != string.Empty) progress1.FileLength = num2; progress1.ReceivedLength = num1; progress1.FileName = stream1.OriginalFileName; progress1.FileCount = (Hashtable) application1.Context.ItemsFileList).Count; application1.Application_UploadGUID_ + text2 = progress1; if (!request1.IsEntireEntityBodyIsPreloaded() byte buffer4; ArrayList list2; int num3 = 204800; byte buffer3 = new bytenum3; while (num2 - num1) >= num3) if (!application1.Context.Response.IsClientConnected) this.ClearApplication(application1); num3 = request1.ReadEntityBody(buffer3, buffer3.Length); num1 += num3; list2 = stream1.ContentBody; if (list2.Count > 0) buffer4 = new bytelist2.Count + buffer3.Length; list2.CopyTo(buffer4, 0); buffer3.CopyTo(buffer4, list2.Count); stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName); else stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName); list1.AddRange(stream1.ReadBody); if (text2 != string.Empty) progress1.ReceivedLength = num1; progress1.FileName = stream1.OriginalFileName; progress1.FileCount = (Hashtable) application1.Context.ItemsFileList).Count; application1.Application_UploadGUID_ + text2 = progress1; buffer3 = new bytenum2 - num1; if (!application1.Context.Response.IsClientConnected && (stream1.FStatus = RequestStream.FileStatus.Open) this.ClearApplication(applicat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 池州2025年安徽池州石台县级公立医院急缺人才招聘10人笔试历年参考题库附带答案详解
- 六年级道德与法治上册 第三单元 我们的国家机构 7 权力受到制约和监督说课稿2 新人教版
- 2025年银行从业资格(中级)公司信贷考试必刷题库附答案
- 汉中市2025年公需课考试题库及答案
- 2025年基础护理出科试题题库及答案
- 第二节 物联网在生活中的应用教学设计初中信息技术(信息科技)九年级上粤教B版(第4版)
- 2.4《神奇的纸》教学设计-教科版小学科学二年级上册
- 本章复习与测试教学设计高中生命科学沪科版拓展型课程-沪科版
- 单件裁剪教学设计中职专业课-服装结构制图-服装设计与工艺-轻工纺织大类
- 2025中医伤寒考试题目及答案
- 2025年教育系统学校中层后备干部选拔考试题(含答案)
- DB32-T 5192-2025 工业园区碳排放核算指南
- 湖南省九校联盟2026届高三上学期9月第一次联考日语试题(含答案)
- 时事政治讲座课件
- 四次侵华战争课件
- 2025年上海市公安辅警、法检系统辅助文员招聘考试(职业能力倾向测验)历年参考题库含答案详解
- XX园项目销售手册
- 锅炉工安全培训知识课件
- 机电安装样板施工方案
- 2025年全国新闻记者职业资格考试新闻采编实务试题及答案
- 陕煤招聘考试题库及答案
评论
0/150
提交评论