`
izuoyan
  • 浏览: 9221540 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载

阅读更多

在Flex的应用开发中,同ASP.NET,JSP,PHP等应用一样,都会有上传/下载文件的应用需求,Flex的SDK也为我们提供了专门的类FileRefUdderence实现文件上传/下载 。Flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以ASP.NET中的HttpHandler作为文件上传的服务端来完成上传功能。

OK,我们从Flex客户端开始,看看客户端是通过什么方式想服务端发起请求。Flex客户端要完成文件上传下载都是通过FileRefUdderence来实现,首先得定义一个该类型对象实例:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1[Bindable]
2privatevarstateText:String="请选择一个文件上传";
3//通过调用file对象的方法来完成上传和下载功能
4privatevarfile:FileReference=newFileReference();

上传文件通常涉及到的有选择文件、上传文件以及上传完成这些最基本的处理过程。OK,下面我们就以这三个过程为例来看看Flex是怎么来完成文件的上传功能。首先为这三个功能点分别添加监听事件处理函数,在程序加载时调用:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1internalfunctioninitApp():void
2{
3file.addEventListener(Event.SELECT,onSelected);
4file.addEventListener(Event.COMPLETE,onCompleted);
5file.addEventListener(ProgressEvent.PROGRESS,onProgress);
6}

另外我们也可以不用上面这中定义一个函数在程序加载时调用进行初始化操作,应用程序(mxml)的初始化操作又creationComplete方法完成,另外还有一个比它先执行的方法createChildren(),我们可以直接在mxml下重写该方法来实现应用程序的初始化,如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1/**
2*createChildren比creationComplete事件更早发生
3**/
4protectedoverridefunctioncreateChildren():void
5{
6file.addEventListener(Event.SELECT,onSelected);
7file.addEventListener(Event.COMPLETE,onCompleted);
8file.addEventListener(ProgressEvent.PROGRESS,onProgress);
9}

这三个事件处理函数的详细定义如下(其中的stateText为String的变量,用于显示文件上传状态提示):

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1internalfunctiononSelected(evt:Event):void
2{
3stateText="选择了文件"+file.name;
4}
5
6internalfunctiononCompleted(evt:Event):void
7{
8stateText="上传完毕!";
9}
10
11internalfunctiononProgress(evt:ProgressEvent):void
12{
13stateText="已上传"+Math.round(100*evt.bytesLoaded/evt.bytesTotal)+"%";
14}

到这里客户端就只差一步了,那就是完成发起上传请求的方法,实际上就是通过URLRequest对象创建一个与服务端的连接,然后直接调用FielReference类的upload()方法就可完成该功能,详细如下代码定义:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1/**
2*调用FileReference的实例方法upload()实现文件上传
3**/
4internalfunctiononUpLoad():void
5{
6if(file.size>0)
7{
8stateText="正在上传文件:"+file.name;
9}
10varrequest:URLRequest=newURLRequest();
11request.url="http://localhost/Web/UpLoadHandler.ashx";
12file.upload(request);
13}

写好了upload方法,现在就是调用他了,通过按扭的click事件直接调用就可以,另外调用file.browse()方法则实现选择文件的功能,如下mxml代码描述:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1<mx:TextInputx="10"y="57"id="txtFile"text="{stateText}"width="229"/>
2<mx:Buttonx="247"y="57"label="选择"fontWeight="normal"click="{file.browse()}"/>
3<mx:Buttonx="29"y="111"label="上传文件"width="111"fontWeight="normal"click="onUpLoad()"/>

如上便完成了上传文件的Flex客户端开发,通过file.upload()方法,将把选择的文件通过二进制的形式发送到指定的服务端,并自动传递一个叫“fileName”的参数,服务端通过fileName便可以接收到客户端请求上传的文件。最后我们来看看服务端的UpLoadHandler.ashx的详细定义:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1publicclassUpLoadHandler:IHttpHandler
2{
3//文件上传目录
4privatestringuploadFolder="UpLoad";
5
6publicvoidProcessRequest(HttpContextcontext)
7{
8context.Response.ContentType="text/plain";
9
10HttpFileCollectionfiles=context.Request.Files;
11if(files.Count>0)
12{
13stringpath=context.Server.MapPath(uploadFolder);
14HttpPostedFilefile=files[0];
15
16if(file!=null&&file.ContentLength>0)
17{
18stringsavePath=path+"/"+context.Request.Form["fileName"];
19file.SaveAs(savePath);
20}
21}
22else
23{
24context.Response.Write("参数错误");
25context.Response.End();
26}
27}
28
29publicboolIsReusable
30{
31get
32{
33returnfalse;
34}
35}
36}

如上一系列的步骤便可完成上传文件的功能,下面便是上传文件示例程序运行截图:

实现了文件上传下面来看看怎么实现文件下载,以上面上传示例中上传的mp3为例,下面我们来看看怎么从服务器(http://localhost/Web/UpLoad/做你的爱人.mp3)上完成文件(做你的爱人.mp3)的下载。

要实现文件下载对服务器端只要保证被下载文件存在就OK,同上传文件一样需要实例化一个FielReference对象的实例,并为其添加相应的事件处理函数:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1privatevarfileDown:FileReference=newFileReference();
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1/**
2*createChildren比creationComplete事件更早发生
3**/
4protectedoverridefunctioncreateChildren():void
5{
6super.createChildren();
7file.addEventListener(Event.SELECT,onSelected);
8file.addEventListener(Event.COMPLETE,onCompleted);
9file.addEventListener(ProgressEvent.PROGRESS,onProgress);
10//实现文件下载
11fileDown.addEventListener(Event.COMPLETE,onDownCompleted);
12fileDown.addEventListener(ProgressEvent.PROGRESS,onDownProgress);
13}

如上为实现下载文件的实例fileDown注册了成功下载文件后事件处理函数和下载过程处理函数,下面是两个方法的详细定义:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1internalfunctiononDownCompleted(evt:Event):void
2{
3varfileRef:FileReference=evt.currentTargetasFileReference;
4resultLabel.text="文件名:"+fileRef.name+"下载完毕!";
5}
6
7internalfunctiononDownProgress(evt:ProgressEvent):void
8{
9downState.text="已下载:"+Math.round(100*evt.bytesLoaded/evt.bytesTotal)+"%";
10}

完成了对象事件的开发,最后便上惩罚下载请求了,直接调用FileReference类所提供的download()方法既可:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1/**
2*调用FileReference类的实例方法download()实现文件下载
3**/
4internalfunctiononDownLoad():void
5{
6varrequest:URLRequest=newURLRequest();
7request.url="http://localhost:1146/UpLoad/做你的爱人.mp3";
8fileDown.download(request);
9}

程序执行到download()方法的时候会自动弹出选择保存文件对话框,根据实际情况选择好保存路径就OK。下面是实现上传和下载的完整代码:

实现上传和下载的完整代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->1<?xmlversion="1.0"encoding="utf-8"?>
2<mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute">
3<mx:Panelx="49"y="66"width="551"height="164"layout="absolute"
4title="使用FileReference上传/下载文件"fontSize="12">
5<mx:HDividedBoxx="10"y="10"width="511"height="102">
6<mx:Canvasid="left"backgroundColor="#D7F4FF"height="100%"width="209">
7<mx:TextInputx="4"y="20"id="txtFile"text="{stateText}"width="135"/>
8<mx:Buttonx="147"y="20"label="选择"fontWeight="normal"click="{file.browse()}"/>
9<mx:Buttonx="31"y="68"label="上传文件"width="111"fontWeight="normal"click="onUpLoad()"/>
10</mx:Canvas>
11<mx:Canvasid="right"backgroundColor="#D7F4FF"height="100%"width="282">
12<mx:Labelx="6"y="9"text="http://localhost/Web/UpLoad/做你的爱人.mp3"/>
13<mx:Buttonx="10"y="37"label="下载文件"fontWeight="normal"click="onDownLoad()"/>
14<mx:Labelx="10"y="74"width="272"id="resultLabel"/>
15<mx:TextInputx="122"y="37"id="downState"/>
16</mx:Canvas>
17</mx:HDividedBox>
18
19</mx:Panel>
20<mx:Script>
21<![CDATA[
22[Bindable]
23privatevarstateText:String="请选择一个文件上传";
24
25privatevarfile:FileReference=newFileReference();
26privatevarfileDown:FileReference=newFileReference();
27
28/**
29*createChildren比creationComplete事件更早发生
30**/
31protectedoverridefunctioncreateChildren():void
32{
33super.createChildren();
34file.addEventListener(Event.SELECT,onSelected);
35file.addEventListener(Event.COMPLETE,onCompleted);
36file.addEventListener(ProgressEvent.PROGRESS,onProgress);
37
38fileDown.addEventListener(Event.COMPLETE,onDownCompleted);
39fileDown.addEventListener(ProgressEvent.PROGRESS,onDownProgress);
40}
41
42//internalfunctioninitApp():void
43//{
44//file.addEventListener(Event.SELECT,onSelected);
45//file.addEventListener(Event.COMPLETE,onCompleted);
46//file.addEventListener(ProgressEvent.PROGRESS,onProgress);
47//}
48
49internalfunctiononSelected(evt:Event):void
50{
51stateText="选择了文件:"+file.name;
52}
53
54internalfunctiononCompleted(evt:Event):void
55{
56stateText="上传完毕!";
57}
58
59
60internalfunctiononDownCompleted(evt:Event):void
61{
62varfileRef:FileReference=evt.currentTargetasFileReference;
63resultLabel.text="文件名:"+fileRef.name+"下载完毕!";
64}
65
66internalfunctiononProgress(evt:ProgressEvent):void
67{
68stateText="已上传:"+Math.round(100*evt.bytesLoaded/evt.bytesTotal)+"%";
69
70}
71
72internalfunctiononDownProgress(evt:ProgressEvent):void
73{
74downState.text="已下载:"+Math.round(100*evt.bytesLoaded/evt.bytesTotal)+"%";
75}
76
77/**
78*调用FileReference的实例方法upload()实现文件上传
79**/
80internalfunctiononUpLoad():void
81{
82if(file.size>0)
83{
84stateText="正在上传文件:"+file.name;
85}
86varrequest:URLRequest=newURLRequest();
87request.url=http://localhost/Web/UpLoadHandler.ashx;
88file.upload(request);
89}
90
91/**
92*调用FileReference类的实例方法download()实现文件下载
93**/
94internalfunctiononDownLoad():void
95{
96varrequest:URLRequest=newURLRequest();
97request.url="http://localhost/Web/UpLoad/做你的爱人.mp3";
98fileDown.download(request);
99}
100]]>
101</mx:Script>
102</mx:Application>
103

程序运行截图:

本文首发于博客园,地址:http://www.cnblogs.com/beniao/archive/2009/01/18/1377668.html

分享到:
评论

相关推荐

    源码:Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载

    Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载 一文的源码的完整工程文件,包含FLEX客户端和 ASP.NET服务端源码! 在VS2010和FLash builder4 中运行!

    Flex与.NET互操作 使用FileReference+HttpHandler实现文件上传/下载

    ### Flex与.NET互操作:使用FileReference+HttpHandler实现文件上传/下载 #### 一、引言 在Flex的应用开发中,与ASP.NET、JSP、PHP等Web应用一样,经常会遇到需要处理文件上传和下载的需求。Adobe Flex是一种用于...

    Flex附件上传下载

    文件`Flex与_NET互操作 使用FileReference+HttpHandler实现文件上传-下载_Flex_脚本之家.htm`可能包含一个完整的示例代码,演示了如何在Flex中使用`FileReference`类与.NET的HttpHandler协同工作,实现文件的上传和...

    asp.net+flex批量上传文件

    本教程将重点讨论如何使用ASP.NET与Adobe Flex技术实现批量文件上传的功能。这两种技术的结合为开发人员提供了跨平台的灵活性,同时保证了前端的交互性和后端的强大处理能力。 首先,ASP.NET是微软公司推出的一种...

    Flex+ASP.NET上传文件

    1. **Flex前端开发**:在Flex中,我们可以使用FileReference类来处理文件上传。FileReference提供了选择文件、预览文件以及上传文件的功能。用户可以通过选择文件对话框选择本地文件,然后调用FileReference的upload...

    Flex多文件上传+md5验证文件是否上传

    2. **Flex文件上传**:Flex应用程序通常使用HTTPService或WebService组件与服务器进行通信。在文件上传过程中,我们可以将FileReference对象的data属性绑定到HTTPService的requestContent,然后调用send方法发起POST...

    .net+flex批量上传实例demo

    这个".net+flex批量上传实例demo"提供了一个解决方案,它可以帮助开发者实现高效且用户友好的批量文件上传功能。下面我们将深入探讨相关的知识点。 首先,Flex是一个开源的RIA(富互联网应用)开发框架,主要基于...

    flex文件上传下载

    总结,Flex 文件上传下载功能提供了灵活的接口,使得开发者能够轻松地实现客户端与服务器之间的文件交互。通过优化这些操作,可以有效地减少服务器资源的消耗,提升服务器的响应速度,从而提高用户体验。在实际应用...

    Flex+WebService附件上传下载

    在与.NET互操作时,通常使用HTTPHandler作为WebService的实现方式。HTTPHandler是ASP.NET中的一种处理器,它可以处理HTTP请求并返回响应。在文件上传的场景中,HTTPHandler接收由Flex客户端发送的文件数据,将其保存...

    flex4.5.1+.net4.0 单个文件上传

    在开发Web应用时,文件上传是一项常见的功能。...总的来说,实现Flex与.NET的文件上传涉及前端用户界面的构建、后端服务的编写以及服务器配置的调整,理解这些知识点将有助于你成功实现文件上传功能。

    flex文件上传源码

    //TotalCount总上传文件数量限制,-1表示不限制,默认值为50 param.Ext = (this.parameters.Ext == undefined || this.parameters.Ext == "") ? "*.*" : this.parameters.Ext;//上传的文件类型类型限制,...

    flex实现多文件上传

    在Flex中实现多文件上传,通常涉及到ActionScript编程、组件使用以及与服务器端的交互。下面将详细介绍如何使用Flex来实现这个功能。 一、Flex中的文件选择组件 在Flex中,我们可以使用`FileReference`类来处理文件...

    ASP.NET源码——[上传下载]Asp.net + Flex实现网络硬盘.zip

    本项目"ASP.NET源码——[上传下载]Asp.net + Flex实现网络硬盘.zip"提供了一个完整的解决方案,通过结合Asp.net技术和Adobe Flex框架,构建了一个功能强大的网络硬盘系统。以下将详细解析这个项目的重点技术和知识点...

    java spring +flex实现文件上传

    在Java Spring和Flex框架下实现文件上传功能是一个常见的需求,特别是在构建富互联网应用程序(RIA)时。Spring框架提供了强大的后端支持,而Flex则作为前端交互界面,为用户提供丰富的用户体验。下面将详细介绍如何...

    flex多文件上传 asp.net实例

    总结来说,Flex与ASP.NET结合的多文件上传实例是一个综合性的实践案例,涵盖了前端与后端的协作,涉及到文件操作、网络通信、安全性和用户体验等多个方面。理解和掌握这种技术能够提升开发者在Web开发中的综合能力。

    Asp.net Flex 文件批量上传

    总之,Asp.net Flex 文件批量上传涉及客户端与服务器端的紧密协作,通过Flex的UI组件和Asp.net的服务器处理,可以构建出高效、用户体验良好的文件上传功能。实际开发时,还需要根据具体需求调整和优化,如增加断点续...

    flex 上传文件(.net)

    本文将深入探讨Flex客户端如何与.NET服务器进行文件上传的详细过程,并提供关键的技术知识点。 首先,`Flex`是一个开源的富互联网应用程序(RIA)框架,由Adobe公司开发,主要基于ActionScript编程语言和Flash ...

Global site tag (gtag.js) - Google Analytics