文件管理 · 2022年7月26日

aspnet一次上传多个文件|C#winform用webclient的 uploadfile方法上传文件多个客服端同时上传文件怎样处理并发问题怎样排队

❶ 上传的大文件

基于WEB的文件上传可以使用FTP和HTTP两种协议,用FTP的话虽然传输稳定,但安全性是个严重的问题,而且FTP服务器读用户库获取权限,这样对于用户使用来说还是不太方便。 剩下只有HTTP。在HTTP中有3种方式,PUT、WEBDAV、RFC1867,前2种方法不适合大文件上传,基本上我们使用的web上传都是基于RFC1867标准的HTML中基于表单的文件上传。RFC1867:1.HTML表单现有的HTML规范为INPUT元素的TYPE属性定义了八种可能的值,分别是:CHECKBOX, HIDDEN,MAGE,PASSword,RADIO,RESET,SUBMIT,TEXT。 另外,当表单采用POST方式的时候,表单默认的具有“application/x-www-form-urlencoded”的ENCTYPE属性。RFC1867标准对HTML做出了两处修改:(1)为INPUT元素的TYPE属性增加了一个FILE选项。(2)INPUT标记可以具有ACCEPT属性,该属性能够指定可被上传的文件类型或文件格式列表。另外,本标准还定义了一种新的MIME类型:multipart/form-data,以及当处理一个带有ENCTYPE=multipart/form-data 并且/或含有<INPUT type=file>的标记的表单时所应该采取的行为。举例来说,当HTML表单作者想让用户能够上传一个或更多的文件时,他可以这么写:<FORM ENCTYPE=multipart/form-data ACTION=_URL_ METHOD=POST>File to process:<INPUT NAME=userfile1 TYPE=file><INPUT TYPE=submit VALUE=Send File></FORM>HTML DTD里所需要做出的改动是为InputType实体增加一个选项。此外,我们也建议用一系列用逗号分隔的文件类型来作为INPUT标记的ACCEPT属性。… (其他元素) …<!ENTITY % InputType (TEXT | PASSWORD | CHECKBOX |RADIO | SUBMIT | RESET |IMAGE | HIDDEN | FILE )><!ELEMENT INPUT – 0 EMPTY><!ATTLIST INPUTTYPE %InputType TEXTNAME CDATA #IMPLIED — required for all but submit and resetVALUE CDATA #IMPLIEDSRC %URI #IMPLIED — for image inputs –CHECKED (CHECKED) #IMPLIEDSIZE CDATA #IMPLIED –like NUMBERS,but delimited with comma, not spaceMAXLENGTH NUMBER #IMPLIEDALIGN (top|middle|bottom) #IMPLIEDACCEPT CDATA #IMPLIED –list of content types>… (其他元素) …2.文件传输延迟在某些情况下,在确实准备接受数据前,服务器先对表单数据中的某些元素(比如说用户名,账号等)进行验证是推荐的做法。但是,经过一定的考虑后,我们认为如果服务器想这样做的话,最好是采用一系列的表单,并将前面所验证过的数据元素作为“隐藏”字段传回给客户端,或者是通过安排表单使那些需要验证的元素先显示出来。这样的话,那些需要做复杂的应用的服务器可以自己维持事务处理的状态,而那些简单的应用的则可以实现得简单些。HTTP协议可能需要知道整个事务处理中的内容总长度。即使没有明确要求,HTTP客户端也应该提供上传的所有文件的内容总长度,这样一个繁忙的服务器就能够判断文件的内容是否是过大以至于将不能完整地处理,从而返回一个错误代码并关闭该连接,而不用等到接受了所有的数据才进行判断。一些现有的CGI应用对所有的POST事务都需要知道内容总长度。如果INPUT标记含有一个MAXLENGTH属性,客户端可以将这个属性值看作是服务器端所能够接受的传送文件的最大字节数。在这种情况下,服务器能够在上传开始前,提示客户端在服务器上有多少空间可以用来进行文件上传。但是应该引起注意的是,这仅仅是一个提示,在表单被创建后和文件上传前,服务器的实际需求可能会发生改变。在任何情况下,如果接受的文件过大的话,任何一个HTTP服务器都有可能在文件传输的过程中中断传输。3.传输二进制数据的其他解决办法有些人曾经建议使用一种新的MIME类型aggregate,比如说aggregate/mixed 或是content-transfer-encoding 包来描述那些不确定长度的二进制数据,而不是靠分解为多个部分来表示。虽然我们并不反对这么做,但这需要增加额外的设计和标准化工作来让大家接受并理解aggregate。 从另一方面来说,分解为多部分的机制工作得很好,能够非常简单的在客户发送端和服务器接受端加以实现,而且能像其他一些综合处理二进制数据的方式一样高效率地工作。RFC上传1.一次性得到上传的数据,然后分析处理。看了N多代码之后发现,无组件程序和一些COM组件都是使用Request.BinaryRead方法。一次性得到上传的数据,然后分析处理。这就是为什么上传大文件很慢的原因了,IIS超时不说,就算几百M文件上去了,分析处理也得一阵子。2.一边接收文件,一边写硬盘。了解了一下国外的商业组件,比较流行的有Power-Web,AspUpload,ActiveFile,ABCUpload,aspSmartUpload,SA-FileUp。其中比较优秀的是ASPUPLOAD和SA-FILE,他们号称可以处理2G的文件(SA-FILE EE版甚至没有文件大小的限制),而且效率也是非常棒,难道编程语言的效率差这么多?查了一些资料,觉得他们都是直接操作文件流。这样就不受文件大小的制约。但老外的东西也不是绝对完美,ASPUPLOAD处理大文件后,内存占用情况惊人。1G左右都是稀松平常。至于SA-FILE虽然是好东西但是破解难寻。然后发现2款.NET上传组件,Lion.Web.UpLoadMole和AspnetUpload也是操作文件流。但是上传速度和CPU占用率都不如老外的商业组件。做了个测试,LAN内传1G的文件。ASPUPLOAD上传速度平均是4.4M/s,CPU占用10-15,内存占用700M。SA-FILE也差不多这样。而AspnetUpload最快也只有1.5M/s,平均是700K/s,CPU占用15-39,测试环境: PIII800,256M内存,100M LAN。我想AspnetUpload速度慢是可能因为一边接收文件,一边写硬盘。资源占用低的代价就是降低传输速度。但也不得不佩服老外的程序,CPU占用如此之低…..。上传问题我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题,因为会block直到把整个文件载入内存后,再加以处理。实际上,如果文件很大的话,我们经常会见到Internet Explorer显示 The page cannot be displayed – Cannot find server or DNS Error,好像是怎么也catch不了这个错。为什么?因为这是个client side错误,server side端的Application_Error是处理不到的。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpMole),该方案除了允许你上传大文件外,还能实时显示上传进度。Lion.Web.UpLoadMole和AspnetUpload 两个.NET组件都是利用的这个方案。方案原理:利用HttpHandler实现了类似于ISAPI Extention的功能,处理请求(Request)的信息和发送响应(Response)。方案要点:1. httpHandler or HttpMolea.分块读取和写入数据b.实时跟踪上传进度更新meta信息2. 利用隐含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法处理文件流3. 自定义Multipart MIME 解析器。自动截获MIME分割符。将文件分块写如临时文件。实时更新Appliaction 状态(ReceivingData, Error, Complete) 。

❷ c#.net如何实现在gridview里保存路径的多个文件上传

不需要知道上传文件的原始路径。你用这种方式不可能实现文件的批量上传。一个FileUpload只对应一个文件 ,你在页面里放一个FileUpload,只可能上传一个文件,就是你最后点击浏览时的那个文件

❸ C# 上传 FTP 多个文件 当上一调用正在进行时,不能重新调用 BeginGetRequestStream/BeginGetResponse

一个FTP连接同时只能传一个文件,你必须保证上一个文件传完了再传下一个,而且在传文件的同时不能执行其它命令。你想同时传多个文件只能多线程,每个线程建一个连接来传。

❹ C#winform用webclient的 uploadfile方法上传文件,多个客服端同时上传文件,怎样处理并发问题,怎样排队

只要 保证 newFilename 不重复即可, 其他无需考虑

❺ C#中如何批量上传图片或者是文件

——–没看你的代码啊!多个文件得使用多个asp:FileUpload控件,后台收到使用System.Web.HttpFileCollection files = System.Web.HttpContext.Current.Request.Files;for (int ifile = 0; ifile < files.Count; ifile++){}循环获取。

❻ C# winform如何实现批量上传文件到远程服务器

批量上传 就是多线程同时开启多文件上传咯。我想是否可以是: C#的多线程 + webclient类(或许要用更复杂的类代替)。

❼ FtpWebRequest 多个文件同时上传。求C#代码,举个栗子就好。

#usingSystem;usingSystem.IO;usingSystem.Net;namespaceFtp{classProgram{staticvoidMain(string[]args){DirectoryInfodir=newDirectoryInfo("upload");//上传文件所在的目录FileInfo[]fileInfos=dir.GetFiles();foreach(FileInfoiteminfileInfos)//遍历目录下的所有文件{UploadFile(item);//开始上传}Console.WriteLine("done!");}privatestaticvoidUploadFile(FileInfofi){FileStreamfs=fi.OpenRead();longlength=fs.Length;FtpWebRequestreq=(FtpWebRequest)WebRequest.Create(newUri("ftp://192.168.56.1/"+fi.Name));req.Credentials=newNetworkCredential("name","password");req.Method=WebRequestMethods.Ftp.UploadFile;req.UseBinary=true;req.ContentLength=length;req.Timeout=10*1000;try{Streamstream=req.GetRequestStream();intBufferLength=2048;byte[]b=newbyte[BufferLength];inti;while((i=fs.Read(b,0,BufferLength))>0){stream.Write(b,0,i);}stream.Close();stream.Dispose();}catch(Exceptionex){Console.WriteLine(ex.ToString());}}}}

❽ 怎么样通过c#net上传多个文件

想要想上传大文件,必须在web.config文件中进行配置。在<system.web>节点中添加如下代码即可:<httpRuntime maxRequestLength="2097151"/>这个代码就是表示设置最大请求值,上传文件也就相当于请求。maxRequestLength单位为KB,最大值为:2097151.如果不设置,默认为4096 KB (4 MB)。也就是说上传的文件最大可以上传2G以内的文件。一般没有配置的话,默认只能上传4M以内的文件。配置了的话就可以上传更大的文件。