flex使用filereference实现文件上传/下载

以下是一个.net的实例,(基本和java的相同,[color=red]出现的问题是一样!)[/color]

我们从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>

[color=blue]可能出现的问题:[/color]1.可以上传,但是下载报错??
可能是安全沙箱的问题(具体我也不太明白,总之是远程服务端权限问题),可以在服务端根目录添加crossdomain.xml文件
内容:
<?xml version="1.0" ?>
<cross-domain-policy>
<site-control permitted-cross-domain-policies="all" />
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="*" />
</cross-domain-policy>
2.英文可以,但是中文报错,或者没有反应??
这样是可以的:
public function download():void {
var url:String=encodeURI("/Download /使用方法.txt");
downloadURL = new URLRequest(url);
file = new FileReference();
configureListeners(file);
file.download(downloadURL,"使用方法.txt");//此处为文件名
}
flex在web端上传和下载文件前后台代码 前台Flex(Flash),后台java;完成在web端上传和下载文件的功能;前台代码中目前的只筛选图片文件;如需上传其他格式的文件,请自行修改前端筛选条件即可; 立即下载

相关推荐

完整的文件上传功能。File Reference实现

完成的文件上传功能。使用FileReference类实现。还有多文件上传

FLEX4中使用URLLoader与后台交互请求XML文件

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adob

give me five 1542

Qi标准下的充电协议及其记忆技巧

记忆无线充电协议中的。

m0_73991989的博客 1320

flex 下载文件

<br /><?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" backgroundColor="white" creationComplete="init();"> <mx:Script> <!--[CDATA[ import mx.contro

lieri111的专栏 765

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

电源设计之路-Buck电源环路设计(Type IIIA&Type IIIB)

在对Buck 环路补偿Type II拓扑进行仿真测试后,对瞬态波形以及伯德图已经有感官上的认知;然后再进一步对Type IIIA & IIIB进一步的学习;进一步了解Cout电容量和ESR对环路补偿的影响;认识到一个电源,不是参考Datasheet上的参数进行选值就行;更需要根据实际情况,功率电感值、输出电容值以及不同电容会有不一样的ESR,这些都会对环路参数产生一定的影响

2503_92839756的博客 759

Flex中的文件上传与下载[转贴]

http://www.blogjava.net/rainwindboys/archive/2008/09/18/229219.html    和传统的JSP一样,在flex中,有的时候也需要实现文件上传和下载的功能,但是在flex里文件的上传和下载的实现相对来说比较复杂,如何实现,请看下面。    由于flex是一个比较新的技术,在研究的时候,还是按着JSP的方式去尝试,在开始之初,主要有以下几种

2780

基于51单片机的多功能智能路灯控制系统(仿真+代码+原理图)

智能路灯控制系统主要由51单片机最小系统+1602显示模块+DS1302时钟模块+光强检测模块+按键输入模块+声光报警模块+LED照明模块+状态检测电路+人体车辆红外检测模块组成。能实现以下功能: 1.能够按键设定系统时间、工作时间、光照阈值 2.工作时间内路灯点亮,凌晨12点后路灯关闭,有人或车通过是,路灯点亮10s 3.非工作时间光照强度低于阈值,路灯点亮 4.能够检测系统工作状态,路灯应亮未亮,声光报警 5.具备手动控制,能够切换自动/手动控制功能

u012759563的博客 8182

flex filereference upload php,使用 Flex 上传文件

layout="vertical" verticalAlign="middle" horizontalAlign="center">global {fontSize : 12;}// 先搞 1 个 FileReferenceprivate var file:FileReference = new FileReference();// 上传状态指示, 和下面的文本框绑定[Bindable]pr...

weixin_42116713的博客 139

Keil MDK编译错误#541解决方案与ARM_Compiler包解析

在嵌入式开发中,编译器工具链的依赖管理是确保项目顺利构建的关键环节。以Keil MDK为例,其软件包依赖机制通过组件化设计实现功能解耦,其中ARM_Compiler包专门处理系统IO重定向等编译器扩展功能。这种架构既提升了模块复用性,也带来了版本兼容性挑战。当出现'Error #541: component missing'报错时,通常是由于中间件组件(如文件系统)在新版本中显式依赖了ARM_Compiler包。开发者需要通过Pack Installer安装该包,并在Run-Time Environment

weixin_32129187的博客 371

从重复劳动到智能闭环:OpenClaw实战搭建小红书&公众号全自动化运营体系

如果你有一定的代码开发能力,还可以为OpenClaw开发自定义插件,拓展更多的功能,比如对接更多的平台,实现图文+短视频的全平台自动化运营;对接视频剪辑工具,实现短视频脚本生成、剪辑、配音、发布的全流程自动化;对接私域运营工具,实现公域引流、私域承接、用户转化的全链路自动化;对接电商平台,实现内容种草、商品上架、订单管理的全流程自动化,打造完整的内容电商闭环。新媒体运营的本质,是内容价值的传递,而不是机械的重复劳动。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 312

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

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

u014712365的博客 125

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1322

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

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

jeulivy的专栏 1292

AUTOSAR CP R18-10 架构总览与导航

AUTOSAR CP R18-10 架构总览 本文档系统整理了AUTOSAR CP R18-10版本的199篇技术规范,涵盖7大架构层级: 应用层(15篇):包含车身舒适、底盘控制、HMI、安全系统、动力系统等AI应用 RTE(1篇):虚拟功能总线规范 服务层(159篇):细分为系统服务(OS/ECU管理/加密)、存储服务、通信服务(CAN/LIN/Ethernet) ECU抽象层(20篇):I/O与通信硬件抽象 MCAL(41篇):微控制器驱动层 复杂驱动(14篇):CDD设计与SPAL支撑 规范模板(2

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 724

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[转]Flex与ASP.NET互操作系列5:使用FileReference+HttpHandler实现文件上传/下载

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

旭日东生 613

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: flex httpService用法
下一篇: android和Myeclipse搭建环境
zhangb310
博客等级 码龄18年 0粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值