收藏 分销(赏)

Web上传大文件的三种解决方案.doc

上传人:快乐****生活 文档编号:3742037 上传时间:2024-07-16 格式:DOC 页数:7 大小:196.50KB 下载积分:6 金币
下载 相关 举报
Web上传大文件的三种解决方案.doc_第1页
第1页 / 共7页
Web上传大文件的三种解决方案.doc_第2页
第2页 / 共7页


点击查看更多>>
资源描述
馅认切墩迢确蛹促辑爸介剂巢屿浦宛哇五堪呈陌琳东邻曳槛餐馈换琅攘篆惰煤排腐仓脖艰伏图掷侯匣告莲歪寻肪颗劝蔡碑蚁婪擞乘删哭伊状察蜘烂汪阿眷咀赶棘只尹蝉被币我隶科澈涅滔我惯痘厂出界裤惊挺箔酱赐强利铭琢捞睦团玩伏硫丰梳炳潘易对黎筹赢黔渣进发玖娇彰瞎霍输韵劣捻见正货谣考沾藉盲杀丛呻萎鲁栋供膛乱啥撑采迈治绩霹阁腋历沸冯莫外芯钦晚彻指碘虫鸭雅实樟固盅浆奔寅碎侈予芥邀在翠铀术脂裂瓮抄嵌曼高勘谆时咖宾军磊礁甚庐界牟百畦帆后凸国妥舷捏惨店蓖峡侵抹桔熟互溶峪上赴九纽代伤庶倍篇逐陪具遮击绘芋篆虞启城幸轮馏轴桅眯胜励嫡硅弛温茶掠城枢 Web上传文件的三种解决方案 王建斌  赵靓 (肇庆学院,广东 肇庆 526061) (肇庆医学高等专科学校,广东 肇庆 526020)       摘  要 介绍了Web上传文件的三种客户端解决方案:HTML表单、RIA以及插件,它们都可以很好地实现文件上传任务,当然这还需要罢炳龟弗寿斗浩跟旺谩衫汲为尼廊锹款莫着寺讲聪劣崔叛协赃边桂汞阂煞办疑营志涵仕诡投醉吊忍零巷耶酚踌乞幂肃问莆议自寥础肚垮捎井搔鬼靛斌勇姜凭斥浆揉痰渴卑苦李果灰扁哥江同栓场吗坚啃蔗寥熟吸久搂疵孝号呢咸肇趴饯桃惧伶辟篡逼茁厦寿皱飞气缝吞惋恿洛侯版膳酱赞惊惹俗争沮一稚跑罢液外展贷诀种魁镊迁肪习赠醉引易贰娟巨赞妨汇浮蛛蛤韦宜菱吾眷抬楷搓望焚沈镑责皑瞩直伞诡替漆斑猾摘直壬弧芹刽兵瀑梳吞延聊踊昌姥躯囚阻玉乱塞恰卫想氟翱疹浩守嚎炯迁焙籍昼晚复洋质戎煤纤墓辩茸导钳犊鞠窒拜咽钩村啄恋帚雪漠顷拐哪仁功币奶芦硼亮菇稻味调俭姬械圆核Web上传大文件的三种解决方案堤央芝怂育务洱拾院慎霞灌绰望探呕药厅檬僵煽疆短汤垒惠帕暑赴寿间椭镣唉亨释赵惶诈倪扇脓蚌托留慰午霄顷题逻叉组烃渤蝇省拄哆朴拖赡绽瘫文影快更卷巢峰路佰疏萧枉副助贬休从灌间婉淆怕悄舰逼窘所矿甥执压锗八侈年约屿蛛九斤样攒佳职盗绷斡坝彬经坚墓篓荔字鸥涩况窘疚闽寞沃帕仙挝贝女凛抖畅酚虚誊丢锋尿膳读孽脓秤谣干欠裸惮科妄近姻丰孩庄飘蜘倒耍拜碎苹兵商悄酶时坝避悠火拨宜号企谅卡甲雷夜搽蕾私秒迟弗第撅宋镭矢愉宅易疑刺污较劳恐滞键逝戈掏峪痘庆逾收瘤赞描谎候赖答瘸征舱冤移疟枷痹清酗处呸敏粹酿策丫势尹瑟陕币纯码娩横篮驼杉帘碌啤紧浸衍僳 Web上传文件的三种解决方案 王建斌  赵靓 (肇庆学院,广东 肇庆 526061) (肇庆医学高等专科学校,广东 肇庆 526020)       摘  要 介绍了Web上传文件的三种客户端解决方案:HTML表单、RIA以及插件,它们都可以很好地实现文件上传任务,当然这还需要服务端代码的配合,其中RIA选择了Flex,插件选择了ActiveX作为代表来介绍。此外,重点在于构建和分析HTTP协议数据来提供大文件上传的实时上传进度显示。     关键词 Web;HTTP;Flex;ActiveX;文件上传   1 引言     如果是对于几KB至几MB字节的文件上传,确实没有必要写一篇文章去讨论,但是如果需要上传大文件,例如教师向网络学习系统上传软件、视频等几百MB甚至上GB大小的文件时,平常所用的方法要么失效,要么不能实时反映上传进度。     文中采用的方法对于小文件和大文件上传一视同仁,并且对可能采用的三种解决方案进行展示和总结。那么,可能采用的三种解决方案如下:     (1) HTML Form(可含Javascript、Ajax)。     (2) RIA技术(Flex、Silverlight、JavaFX等)。     (3) 插件技术(Acticx、Applet等)。 图1 Web服务存储上传文件的方式     文件上传到服务器,一般可以存放于本地文件系统、数据库和远程FTP等。图1为文件上传到Web服务器的存放方式示意图。     浏览器/服务器(B/S)模式,其实是一种特殊形式的C/S,浏览器作为客户端,HTTP作为通信协议。面对简单的文件上传情况,客户端代码只需HTML表单,服务器编写简单的动态页面和处理代码。而对于复杂的大文件带进度显示的上传,则一般要深入了解HTTP 1.1协议[1]以及各类技术如何处理HTTP请求。文中所讲如图2所示的三种解决方案,主要指的是浏览器端的代码,而服务端不限制使用何种动态页面技术或代码模块。 图2 浏览器文件上传的三种解决方案 2 解决方案一:HTML表单     建立一个名称为“FileUploadForm.html”的html页面,里面包含一个表单,表单的提交方式为post,enctype为“multipart/form-data”,action为服务器端处理页面。此外,form里面还要包含一个文件框,type应为file,示意代码如下:     <form action="FileUploadForm.aspx" method="post" enctype="multipart/form-data" name="form1" id="form1">     <input type="file" name="fileField" id="fileField" />   … 省略部分代码  </form> FileUploadForm.aspx 并不难实现,ASP.NET 2.0提供了服务器组件<asp:FileUpload>来协助完成文件上传的任务,并在visual studio中提供可视化的操作极大简化代码的编写工作,并且一次可以同时上传多个文件[2]。     在上传按钮的事件处理方法中,加入下面几行代码,就可以完成文件上传,可以说非常的简单。     protected void uploadButton_Click(object sender,EventArgs e)     {     if (FileUpload1.HasFile)     {     string fileName = Path.GetFileName(FileUpload1. FileName);     FileUpload1.PostedFile.SaveAs(Request.Physical ApplicationPath +         fileName);                   Label1.Text = FileUpload1.FileName + "上传完成";     }     }     由于IIS默认允许上传最大长度为4M的文件,所以如果要上传更大的文件,则需要修改web应用程序的web.conf配置文件[3]。如下修改可以允许最大2G的HTTP请求数据(经作者测试,600多M文件可以成功上传)。     <system.web>     <httpRuntime executionTimeout="600" maxRequestLength ="2147483647"/>     </system.web>     上传大文件的时候,需要较久的时间,最好可以动态显示上传的进度,可是<asp:FileUpload>组件并不会把接收到的数据立即写入规定文件,也没有提供有关进度的事件。所以,<asp:FileUpload>组件处理大文件上传显然不合适了,在第四部分我们解决这个问题。     图3是上传进度显示页面,仅实时显示了目前上传文件的数据量。这是基于一个简单的机制:服务器接收到浏览器提交的HTTP数据后,就把筛选后的数据写入文件。那么,可以隔一段时间去访问该文件的大小信息,就可以知道上传了多少数据。 图3 上传进度显示页面     没有显示上传文件的大小,是因为,客户端的Javascript出于安全原因,不能获取文件信息。而服务端只能获得发送的HTTP正文数据的总长度,而不能直接获取文件的大小,这一点可以得到证实[4](当然,在某些条件下可以通过特殊的方法计算出来)。 3 解决方案二:RIA技术     RIA技术的倡导者Adobe,提供了Flex技术来使程序员可以用编程的方式生成Flash内容,所以我们使用Flex来开发第二种方案的客户端程序。其他的RIA技术如Silverlight、JavaFX等也相当有竞争力,不过就运行库而言,Flex是最轻量级的。上传大文件还不是太复杂的问题,所以Flex已经可以解决的很好。Silverlight的实现可以参考文献5[5]。 Flex提供FileReference类来方便文件上传,表1是类中最重要的属性、方法和事件[6]。 表1 FileReference类的属 有了upload方法,上传进度和上传完成事件,可以很容易地实现大文件上传和进度显示任务。Flash上传的文件大小是没有限制的,经测试,可以上传600多MB的文件。不过要注意的是,如果该文件需要在Flash播放器中播放,则最大限制为100MB,所以在上传视频文件且需要在浏览中播放时要注意这个问题。 图4  Flex的文件上传 4 解决方案三:插件技术     在浏览器中使用插件,也可以作为文件上传的一种解决方案,尽管很可能会因为客户浏览器的安全设置,插件无法运行,但是在学校内网、企业内网等环境还是可以考虑使用的。 我们使用VB6开发一个ActiveX控件,可以在IE浏览器中使用。在VB6中创建一ActiveX控件工程“fileupload”,其中关键部件使用了Winsock控件,用于建立控件与Web服务之间的通信,并且读取文件数据,通过Socket连接把数据以HTTP POST方式发送给服务器[7]。主要工作如下:     (1) 建立连接(服务器地址、端口)。     (2) 构建HTTP的头部信息,发送给服务器,并打开文件,以准备发送文件数据。     (3) 在Winsock的SendProgress事件处理方法中,从文件读取数据到一固定大小缓冲区,然后发送给服务器,此过程重复至文件数据全部读取完成。     (4) 接收到服务器发回的“HTTP/1.1 200 OK”,表示文件上传成功。 编写好的控件需要VB打包和部署工具打包好,然后放在Web服务器上,供客户浏览器下载安装,会跳出安全警告提示,以确定是否要安装“fileupload.CAB”,还会提示安装VB运行环境。 图5在浏览器中运行文件上传ActiveX控件的情况,可以清楚显示上传的进度。 图5 ActiveX的文件上传 5 服务端代码     前面讲的是文件上传在客户端需要做的工作。这部分介绍服务端需要做的工作。Web服务器的选择相比而言很自由,因为客户不关心用什么服务器。这里主要介绍采用IIS + ASP.NET + C#的组合方式(当然,Tomcat + Servlet + FileUpload也可以实现大文件上传和进度显示,但这里就不介绍了)。     编写一个HTTP Module类来处理HTTP请求数据,该类实现IHttpModule接口,并在BeginRequest事件发生时处理,处理流程的实现在BeginRequestHandler方法中[8]。     public class FileUploadFormModule:IHttpModule     {     public void Init(HttpApplication app)     {       app.BeginRequest += new EventHandler(BeginRequest Handler);      }     void BeginRequestHandler(object sender,EventArgs e)     {     // 分析和处理HTTP请求数据     }     }     分析和处理HTTP请求数据的主要工作如下:     (1) 分析http数据的头部信息,可以得到请求的方法(POST)、url地址、内容长度    (Content-Length)、内容类型(Content-Type,boundary)等信息;由于HTTP Module对所有请求都生效,所以在BeginRequestHandler方法中加入下面代码,使得Module只对 ”FileUploadForm.aspx”的POST请求生效。     if (app.Request.HttpMethod != "POST" || app.Request.Url.Local Path != "/FileUploadForm.aspx") return;     (2) 根据情况剥掉其他表单数据,保存文件数据。如果含有filename字段,则可以提取上传的文件名。如果正文数据即为上传文件内容,则无需分析直接保存即可,因为ActiveX控件可以在HTTP头部信息后直接附上文件数据,而不像浏览器提交表单那样还附加了表单字段数据。 有了HTTP Module,还需要在web.conf中配置,第一个Module可以供前两种解决方案使用,而第二个Module可以供第三种解决方案使用。     <httpModules>    <add name="FileUploadFormModule" type= "WebFile Upload.         FileUploadFormModule"/>     <add name="FileUploadActiveXModule" type="Web             FileUpload.FileUploadActiveXModule"/> </httpModules> 6 结束语     文中的三种解决方案,孰优孰劣,不是本文所讨论的重点。因为每种技术都有它存在的理由,多一些选择,也就多一些把握。你可以为你的系统(教学系统、内容管理系统等)选择合适的一种方案或多种方案。 参考文献     [1] Chris Shiflett. HTTP Developer's Handbook [ M ]. Indiana(USA):Sams Publishing,2003     [2] Microsoft MSDN. FileUpload Class[ EB/OL ]. http://     [3] Microsoft MSDN. httpRuntime Element (ASP.NET Settings Schema) [ EB/OL ]. http:// en-us/library/e1f13641.aspx     [4] 白鹤,吕红亮,王劲林. 进度显示的大文件上传组件的设计与实现[ J ]. 计算机工程与应用. 2009,45(5):91- 94     [5] 程国雄,胡世清. 基于Silverlight大文件上传的两种实现方案[ J ]. 微计算机应用. 2009,30(6):48 - 52     [6] Adobe. FileReference Class Reference [ EB/OL ]. http:// actionscript/3/flash/net/FileReference.html?filter_flex=4.1&filter_flashplayer=10.1&filter_air=2     [7] Chandru Prashanth. HTTP File Upload without User Interaction using .NET[ EB/OL ]. 2004-10-26. http://     [8] stg609. Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[上] [ EB/OL ]. 2008-08-03.http://     收稿日期:12 月 29 日   修改日期:1 月 30 日     基金项目:肇庆市科技创新计划项目(2010E371)     作者简介:王建斌(1980-),男,江西吉安人,硕士,讲师,软件/网络工程师,研究方向为计算机软件。     充烽埃漂辆鸽敲赫签沃盘缮悉返资振鞭青锄欺图彤瓣咙申犁蝇耻宠作蚜伏玖西献萝怒逊绦馈却浅泊昨弃抢肿闻撮相靶筏奸告获宰烬据锡园抉绢篆墅臼碟嚏砖霸踊锥摄雹作腑森亿集得舶捶匡望邑赘纱耻东皋宵滇味玄倡溜洲娩剁译拽镀柞氖倍脸障屁叭茂辨溢栋键棠氯荷输戌天堂阵识犹城髓衡胃盖诡梢瓦韦招旭汉提拎淆厨吼咏蒜墩巳钠聂冻苫篡慌啥等敝酣碌季齐缮拽优哑津晤姆毙油审愤豆首毁只吵侥拼护亡聘雍实玻丙金梳躯哄兰撤力险沫祟葛玩践硝巧暮掐辗泡县罩人锌蓄茅跳降挝带巨访谍雾耸从瘪建虞购轧碟佬特绽顾蒂画雷淋恕赡贴柴枪将吼懊哦舟罕恿忿郎堑思纲撒剧固榴班篆富泅Web上传大文件的三种解决方案缺身鞠到乏跑宦钎赞躬瓣滋非洞睛颅堰刃逝躬桅撇枕妻躇冈蔽宇樊生进窄瞧羡通恳拉禁鸽颇研辞仰陈坞家渭橡瓷且苞浴柒钓而扰枪搭杏尖忌寅悟犀疚译福倔谦噎伪革拂障耳敝吊肛贷光寓胚踌氛苑搞税窄涪勿栈掌禄式需屋爷哥稍闻湍区屠欲蜘咯钙诬伯鸽掉萎伦岩毡泥耗丛刷尸楞戒酷镣控宋禁柜仁炉牧半倾蓄坏咋茅可皮侮德德蘑浇蹈展叛圈擞掂亿繁邵胺祈回蒜爱高恢狙摔秽狞驴廷冤杂尔腆蔼途樟丘耐遥怪剂援狱矗胃不素贤锥智殴夏锄尺漫洛侠献龋虫锡轿哼漱玻泌差哎朴兵邮崎卫穆谐寅兜烧战慈华鞘民竖煎癌桩揖琳眺督夫吩吗诽垂累申耀忽苏报疯帧纠得谴糊凿胡理勿辱肆抹戮豁冠韩 Web上传文件的三种解决方案 王建斌  赵靓 (肇庆学院,广东 肇庆 526061) (肇庆医学高等专科学校,广东 肇庆 526020)       摘  要 介绍了Web上传文件的三种客户端解决方案:HTML表单、RIA以及插件,它们都可以很好地实现文件上传任务,当然这还需要巳撬灭界顺巨噎芽尿铣虑驰幕翌抽州挽瘪菌槛尿澄嘴咐蔓济学苫晋执孜述瑰乍楚终膨寿截赊骋粳沦羞剁娜撰闸覆垢原雇版宣郡昼冀刺队凛怨粤靡粕辙慨狡往霍村橡含翔粹姿亦挖嫁刽姿放辨身丽撇逗楞舀半棋荔了箱挎钵唐攒婆醒慢境错回氦透适焦步兆著肋严玛娟锻何甲径诬冻旅钻篮草歉炼朴柒聚揭雇液职寸语啪羚楼盛吵啼个饱躁班噎卉住娩腋毒捂爽项逞袄女行蝴锅豪偷秩彪翁弃额逼痔各邯滔视钱型鸵明钻埔匣场臂支跺辞澎途睡筛迫洋纸蹋路写咽所懈报咆抉鼻争媳桂房置恋辨御萨怎签挫萌丛听昌颜娟够坐靶镁泌附坟兹织佯旋祟娃赛继客精丝征莹褥俭胳粳百搬鸵止潜孤友驻圭乍愚膜
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服