众所周知,如果需要向WEB服务器上传文件,一般选用下列2种方式。
1. 使用HTTP PUT指令
2. 模拟页面的form提交
第一种需要配置服务器,略过。
第二种需要使用WinInet根据HTTP协议,拼除POST BODY后提交。
对于第二种,在ASP.Net里面特麻烦。
1. 需要模拟页面的VIEWSTATE,模拟不成功就不行
2. ASP.Net对每个请求有最大长度限制,这个值默认为4MB,但可以在web.config中修改
3. 文件在上传过程中并没有直接写入磁盘,而是先放入了内存,等到全部上传结束再写入磁盘。所以如果传输超大的文件对服务器性能影响很大
本文的做法是:
客户端不需要模拟form,将大文件分成等大的小块(如64K),使用多线程将这些小块上传到服务器后,服务器再拼合起来。
---------------------------------------------------------
流程:
1. 客户端:需要向服务器上传一个文件,首先调用服务器的某一个页面(如BeginUpload.aspx),通知此文件的大小(bytes)
2.服务器:服务器收到此请求,首先验证客户端权限,然后在自定义的文件夹中按照请求中提供的大小创建一个空文件,并返回一个唯一标示码到客户端。
3.客户端:收到服务器返回成功后,记录下此次上传的唯一标识码。
4.客户端:将需要上传的这个文件分成大小相等的文件块(如64K)。(这个过程只是一个逻辑上的过程,实际的做法并不需要分块,可以直接使用内存映射文件或者将文件直接读入到虚拟内存以加快速度)
5.客户端:开启一个领导者-跟随者线程池。领导者线程负责要上传文件块的调度,而跟随者线程负责自己分配到的文件块上传。
6.客户端,跟随者线程:读取自己分配到的文件块,向服务器的特定路径或者页面POST文件内容。
这个POST的HEADER或者QueryString里面起码要包含这几个参数:唯一标识码、当前文件块的区间。
7.服务端:收到跟随者线程的请求,以共享方式打开临时文件夹中的文件,写入当前文件块。
8.客户端,领导者线程:检测到文件块全部上传完毕,则向服务器某一个页面报告(如EndUpload.aspx),此文件上传结束,清理资源。
9.服务器:收到文件上传结束的通知,将文件从临时文件夹移动到需要的位置。
10. 服务器周期性地清理临时文件夹中的过期文件。
--------------------------------------------------------------------
上面的流程是多线程分块并行上传的基本流程。也可以在此基础上进一步加入CRC32验证文件完整性的功能。如果要简化流程,不需要分块上传,只需要直接进行第6步操作就可以了。
对于第6部,在服务端,可以使用一个*.aspx页面或者一个IHttpHandler来处理请求。
参考下列代码,参数以及其它部分都已经略掉。
对于其它B/S平台,也是类似的方式。
客户端代码,我自己封装了一下,这里只列出关键代码。
调用示例:
分享到:
相关推荐
多线程上传多文件,线程数可以自行确定,可以上传整个目录树,采用的是WinInet编程技术。
wininet上传文件到ftp服务器,代码量很少,已测试成功,使用到项目中。
(1)理解 WinInet API 的基本概念与操作流程。...程序能实现基本的FTP客户端功能,能登陆FTP服务器,显示登录客户目录下的文件和目录名,能从该目录中选择下载服务器的文件,也能向服务器上传文件。
串口,CInternetSession,多线程.用于自动业务办理~~~~~~~~
朋友们对Internet文件下载一定不陌生,如果不讲究下载细节,一个API函数...要实现这些,首先用到的就是多线程技术,把下载线程和界面线程分开;其次,要把下载进度及时反馈给界面进度条,还要用到WinInet提供的接口。
该工具可以用来自动提交web forms、读取web页面内容、在web服务器上放置文件或从web服务器读取文件、安排/检索web页面内容、生成站点树状结构,或者用于需要与web服务器通信的其它应用程序。 用户可以通过HTTP和...
Delphi用WinInet实现服务器信息获取、上传Json信息、文件下载
利用WinInet实现文件下载 利用WinInet实现文件下载 利用WinInet实现文件下载 利用WinInet实现文件下载
VC编程实现使用WinInet通过HTTP协议读取网上文件,成功实现,在visual studio 2005下可用
1、基于wininet的文件上传 2、测试时可使用hfs作为http服务端程序 3、有封装好的类,可直接使用 4、可能因为字符编码问题,需要自行调整
WinInet带进度条下载Http文件 利用wininet API函数来下载web文件并操作进度条
本例程用到4个WinInet接口函数,分别是InternetGetConnectdState、InternetOpen、InternetOpenUrl和HttpQueryInfo,分别用以获取当前网络连接信息、打开网络连接、打开具体URL和查看连接信息。在工程中,我们写一个...
VC编程实现使用WinInet通过HTTP协议读取网上文件
VC 6.0 使用WinInet通过HTTP协议读取网上文件 在一个按钮事件中定义了网络连接Session: CInternetSession httpsession;//定义网络连接Session CString Line; CInternetFile* webfile=NULL;//定义一个文件...
wininet组件,用于通过pb\vb\delphi\.net\java等工具调用,发送邮件
vs2019下使用winInet实现的http客户端。功能实现:实现get、post、post上传文件,basic认证
Wininet SSL 实现http 数据上传,Wininet SSL 实现http 数据上传
把基于WinInet的HTTP文件上传功能小程序的开发过程首先,使用 InternetCrackUrl 函数分解URL,从URL中提取网站的域名、路径以及URL的附加信息等。关于 InternetCrackUrl 分解URL的介绍和实现,可以参考 “URL分解之...
利用WinInet和多线程实现实时显示的下载进度条 vc代码