- 浏览: 438861 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
fred7510:
死的啊。。不过还是谢了
flex 截图 -
hechuanshan:
flex状态及动画 -
Da嗒_Sunny:
求使用说明
flex图片裁剪 -
wapj23:
...
flex中定制右键菜单 -
lion_leon:
谢谢!帮了我的大忙了!
利用flashvars给flash传值
flex使用filereference+httphandler实现文件上传/下载
在flex
的应用开发
中,同asp
.net,jsp,php
等应用一样,都会有上传/下载文件
的
应用需求,flex的sdk也为我们提供了专门的类filerefudderence实现文件上传/下载
。flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以asp.net中的httphandler作为
文件上传的服务端来完成上传功能。
ok,我们从flex客户端开始,看看客户端是通过什么方式想服务端发起请求。flex客户端要完成文件上传下载都是通过filerefudderence来实现,首先得定义一个该类型对象实例:
- private var statetext:string = "请选择一个文件上传";
- //通过调用file对象的方法来完成上传和下载功能
- private var file:filereference = new filereference();
上传文件通常涉及到的有选择文件、上传文件以及上传完成这些最基本的处理过程。ok,下面我们就以这三个过程为例来看看flex是怎么来完成文件的上传功能。首先为这三个功能点分别添加监听事件处理函数 ,在程序
加载时调用:
- internal function initapp():void
- {
- file.addeventlistener(event.select,onselected);
- file.addeventlistener(event.complete,oncompleted);
- file.addeventlistener(progressevent.progress,onprogress);
- }
另外我们也可以不用上面这中定义一个函数在程序加载时调用进行初始化操作,应用程序(mxml )的初始化操作又creationcomplete方法完成,另外还有一个比它先执行的方法createchildren(),我们可以直接在mxml下重写该方法来实现应用程序的初始化,如下:
- /**
- * createchildren 比 creationcomplete 事件更早发生
- * */
- protected override function createchildren():void
- {
- file.addeventlistener(event.select,onselected);
- file.addeventlistener(event.complete,oncompleted);
- file.addeventlistener(progressevent.progress,onprogress);
- }
这三个事件处理函数的详细定义如下(其中的statetext为string的变量,用于显示文件上传状态提示):
- internal function onselected(evt:event):void
- {
- statetext = "选择了文件" + file.name;
- }
- internal function oncompleted(evt:event):void
- {
- statetext = "上传完毕!";
- }
- internal function onprogress(evt:progressevent):void
- {
- statetext = "已上传 " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
- }
到这里客户端就只差一步了,那就是完成发起上传请求的方法,实际上就是通过urlrequest对象创建一个与服务端的连接,然后直接调用fielreference类的upload()方法就可完成该功能,详细如下代码定义:
- /**
- * 调用filereference的实例方法upload()实现文件上传
- * */
- internal function onupload():void
- {
- if(file.size > 0)
- {
- statetext = "正在上传文件:" + file.name;
- }
- var request:urlrequest = new urlrequest();
- request.url="http://localhost/web/uploadhandler.ashx";
- file.upload(request);
- }
写好了upload方法,现在就是调用他了,通过按扭的click事件直接调用就可以,另外调用file.browse()方法则实现选择文件的功能,如下mxml代码描述:
- <mx:textinput x="10" y="57" id="txtfile" text="{statetext}" width="229"/>
- <mx:button x="247" y="57" label="选择" fontweight="normal" click="{file.browse()}"/>
- <mx:button x="29" y="111" label="上传文件" width="111" fontweight="normal" click="onupload()"/>
如上便完成了上传文件的flex客户端开发,通过file.upload()方法,将把选择的文件通过二进制的形式发送到指定的服务端,并自动传递一个叫 “filename”的参数,服务端通过filename便可以接收到客户端请求上传的文件。最后我们来看看服务端的 uploadhandler.ashx的详细定义:
- public class uploadhandler : ihttphandler
- {
- //文件上传目录
- private string uploadfolder = "upload";
- public void processrequest(httpcontext context)
- {
- context.response.contenttype = "text/plain";
- httpfilecollection files = context.request.files;
- if (files.count > 0)
- {
- string path = context.server.mappath(uploadfolder);
- httppostedfile file = files[0];
- if (file != null && file.contentlength > 0)
- {
- string savepath = path + "/" + context.request.form["filename"];
- file.saveas(savepath);
- }
- }
- else
- {
- context.response.write("参数错误");
- context.response.end();
- }
- }
- public bool isreusable
- {
- get
- {
- return false;
- }
- }
- }
如上一系列的步骤便可完成上传文件的功能,下面便是上传文件示例程序运行
截图:
实现了文件上传下面来看看怎么实现文件下载, 以上面上传示例中上传的mp3为例,下面我们来看看怎么从服务器
(http://localhost/web/upload/做你的爱人.mp3)上完成文件(做你的爱人.mp3)的下载。
要实现文件下载对服务器端只要保证被下载文件存在就ok,同上传文件一样需要实例化一个fielreference对象的实例,并为其添加相应的事件处理函数:
private var filedown:filereference = new filereference();
/**
* createchildren 比 creationcomplete 事件更早发生
* */
protected override function createchildren():void
{
super.createchildren();
file.addeventlistener(event.select,onselected);
file.addeventlistener(event.complete,oncompleted);
file.addeventlistener(progressevent.progress,onprogress);
//实现文件下载
filedown.addeventlistener(event.complete,ondowncompleted);
filedown.addeventlistener(progressevent.progress,ondownprogress);
}
如上为实现下载文件的实例filedown注册了成功下载文件后事件处理函数和下载过程处理函数,下面是两个方法的详细定义:
- internal function ondowncompleted(evt:event):void
- {
- var fileref:filereference = evt.currenttarget as filereference;
- resultlabel.text = "文件名:" + fileref.name + "下载完毕!";
- }
- internal function ondownprogress(evt:progressevent):void
- {
- downstate.text = "已下载: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
- }
完成了对象事件的开发,最后便上惩罚下载请求了,直接调用filereference类所提供的download()方法既可:
- /**
- * 调用filereference类的实例方法download()实现文件下载
- * */
- internal function ondownload():void
- {
- var request:urlrequest = new urlrequest();
- request.url="http://localhost:1146/upload/做你的爱人.mp3";
- filedown.download(request);
- }
程序执行到download()方法的时候会自动弹出选择保存文件对话框,根据实际情况选择好保存路径就ok。下面是实现上传和下载的完整代码:
实现上传和下载的完整代码
- <?xml version="1.0" encoding="utf-8"?>
- <mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
- <mx:panel x="49" y="66" width="551" height="164" layout="absolute"
- title="使用filereference上传/下载文件" fontsize="12">
- <mx:hdividedbox x="10" y="10" width="511" height="102">
- <mx:canvas id="left" backgroundcolor="#d7f4ff" height="100%" width="209">
- <mx:textinput x="4" y="20" id="txtfile" text="{statetext}" width="135"/>
- <mx:button x="147" y="20" label="选择" fontweight="normal" click="{file.browse()}"/>
- <mx:button x="31" y="68" label="上传文件" width="111" fontweight="normal" click="onupload()"/>
- </mx:canvas>
- <mx:canvas id="right" backgroundcolor="#d7f4ff" height="100%" width="282">
- <mx:label x="6" y="9" text="http://localhost/web/upload/做你的爱人.mp3"/>
- <mx:button x="10" y="37" label="下载文件" fontweight="normal" click="ondownload()"/>
- <mx:label x="10" y="74" width="272" id="resultlabel"/>
- <mx:textinput x="122" y="37" id="downstate"/>
- </mx:canvas>
- </mx:hdividedbox>
- </mx:panel>
- <mx:script>
- <![cdata[
- [bindable]
- private var statetext:string = "请选择一个文件上传";
- private var file:filereference = new filereference();
- private var filedown:filereference = new filereference();
- /**
- * createchildren 比 creationcomplete 事件更早发生
- * */
- protected override function createchildren():void
- {
- super.createchildren();
- file.addeventlistener(event.select,onselected);
- file.addeventlistener(event.complete,oncompleted);
- file.addeventlistener(progressevent.progress,onprogress);
- filedown.addeventlistener(event.complete,ondowncompleted);
- filedown.addeventlistener(progressevent.progress,ondownprogress);
- }
- // internal function initapp():void
- // {
- // file.addeventlistener(event.select,onselected);
- // file.addeventlistener(event.complete,oncompleted);
- // file.addeventlistener(progressevent.progress,onprogress);
- // }
- internal function onselected(evt:event):void
- {
- statetext = "选择了文件:" + file.name;
- }
- internal function oncompleted(evt:event):void
- {
- statetext = "上传完毕!";
- }
- internal function ondowncompleted(evt:event):void
- {
- var fileref:filereference = evt.currenttarget as filereference;
- resultlabel.text = "文件名:" + fileref.name + "下载完毕!";
- }
- internal function onprogress(evt:progressevent):void
- {
- statetext = "已上传: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
- }
- internal function ondownprogress(evt:progressevent):void
- {
- downstate.text = "已下载: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
- }
- /**
- * 调用filereference的实例方法upload()实现文件上传
- * */
- internal function onupload():void
- {
- if(file.size > 0)
- {
- statetext = "正在上传文件:" + file.name;
- }
- var request:urlrequest = new urlrequest();
- request.url=http://localhost/web/uploadhandler.ashx;
- file.upload(request);
- }
- /**
- * 调用filereference类的实例方法download()实现文件下载
- * */
- internal function ondownload():void
- {
- var request:urlrequest = new urlrequest();
- request.url="http://localhost/web/upload/做你的爱人.mp3";
- filedown.download(request);
- }
- ]]>
- </mx:script>
- </mx:application>
评论

我试用ENCODEURI(URI)这样也不行,将TOMCAT设URIENCODING=“UTF-8”这样也不行。
请教一下。。。
这样是可以的:
public function download():void {
var url:String=encodeURI("/Download /使用方法.txt");
downloadURL = new URLRequest(url);
file = new FileReference();
configureListeners(file);
file.download(downloadURL,"使用方法.txt");//此处为文件名
}

我试用ENCODEURI(URI)这样也不行,将TOMCAT设URIENCODING=“UTF-8”这样也不行。
请教一下。。。
麻烦楼主回答一下,先谢谢了。
发表评论
-
利用flashvars给flash传值
2009-09-03 13:44 4452//js部分 var flashvar ... -
继承FormItem实例
2009-08-27 15:36 1330/*******FromItemWithButton 类*** ... -
skin
2009-08-27 09:44 1217创建Skin可以继承自各个skin(见帮助) 如:继承But ... -
flex状态及动画
2009-08-26 15:51 3319切换base状态:currentState=''(注意是两个单 ... -
块布局(constraintColumns、constrainRows)
2009-08-25 14:40 1651label控件不支持换行,text控件支持换行,text控件设 ... -
ExX过滤XML数据
2009-08-20 16:49 990XMLListCollection的filterFunctio ... -
flex安全沙箱设置
2009-08-19 18:00 21171 、 编绎参数 -use-network=false( ... -
flex格式化数据
2009-08-13 17:34 1222一、格式化数据 1、建立mx标签 <mx:Dat ... -
flex需要记住的一些东西
2009-08-10 18:05 1546一、Application常用的事件 initializ ... -
flex4 注意事项
2009-08-07 16:46 14631、自定义控件加载。 flex3中自定义控件,加载时直接 ... -
flex指定区域拖动
2009-07-21 16:43 3287在flex经常会指定某个可拖动对象在可拖动区域中拖拽,可以指定 ... -
blueprint(代码示例)安装方法
2009-07-06 17:41 12431、选择菜单 帮助-->软件更新-->查找并安装。 ... -
flex 4 布局示例一
2009-06-30 15:48 5265flex4(flex skd4)的布局发生了很大变化,在fle ... -
利用影片剪辑做按钮
2009-05-27 22:34 16071、新建元件---》影片剪辑 2、导入图片,或画一个矩形,此 ... -
FDT更新地址
2009-05-27 22:26 1076http://fdt.powerflasher.com/upd ... -
flex外观设计及时生成效果的css
2009-05-14 12:10 1315flex Style Explorer,可以用图形化界面设置各 ... -
利用Alcon跟踪as的trace信息
2009-05-14 11:25 15331、安装Alcon后,在安装目录的debug/as3下找到al ... -
Flash在FF下当设置overflow-y:scroll时,失去热点的bug
2009-04-10 17:07 1656今天遇到了一个奇怪的问题,flash在FF下不能点击,所有按钮 ... -
swfobject使用说明
2009-04-09 17:33 6148swfobject.embedSWF(swfUrl, id, ... -
AS实现带图像的Simplebutton
2009-04-03 16:43 1819[Embed(source="pause.gif ...
相关推荐
Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载 一文的源码的完整工程文件,包含FLEX客户端和 ASP.NET服务端源码! 在VS2010和FLash builder4 中运行!
### Flex与.NET互操作:使用FileReference+HttpHandler实现文件上传/下载 #### 一、引言 在Flex的应用开发中,与ASP.NET、JSP、PHP等Web应用一样,经常会遇到需要处理文件上传和下载的需求。Adobe Flex是一种用于...
文件`Flex与_NET互操作 使用FileReference+HttpHandler实现文件上传-下载_Flex_脚本之家.htm`可能包含一个完整的示例代码,演示了如何在Flex中使用`FileReference`类与.NET的HttpHandler协同工作,实现文件的上传和...
通过这种方式,Flex和.NET可以实现无缝集成,提供用户友好的文件上传和下载功能。这不仅适用于附件,还可以扩展到其他需要大量数据交换的场景,如图像、视频等多媒体内容。 总之,Flex与WebService结合使用,能够...
这个".net+flex批量上传实例demo"提供了一个解决方案,它可以帮助开发者实现高效且用户友好的批量文件上传功能。下面我们将深入探讨相关的知识点。 首先,Flex是一个开源的RIA(富互联网应用)开发框架,主要基于...