`

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

    博客分类:
  • Flex
阅读更多

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


flex 的应用开发 中,同asp .net,jsp,php 等应用一样,都会有上传/下载文件 的 应用需求,flex的sdk也为我们提供了专门的类filerefudderence实现文件上传/下载 。flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以asp.net中的httphandler作为 文件上传的服务端来完成上传功能。

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

  1. private var statetext:string = "请选择一个文件上传";
  2. //通过调用file对象的方法来完成上传和下载功能
  3. private var file:filereference = new filereference();
复制代码

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

加载时调用:

  1. internal function initapp():void
  2. {
  3.     file.addeventlistener(event.select,onselected);
  4.     file.addeventlistener(event.complete,oncompleted);
  5.     file.addeventlistener(progressevent.progress,onprogress);
  6. }
复制代码

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

  1. /**
  2. * createchildren 比 creationcomplete 事件更早发生
  3. * */
  4. protected override function createchildren():void
  5. {
  6.     file.addeventlistener(event.select,onselected);
  7.     file.addeventlistener(event.complete,oncompleted);
  8.     file.addeventlistener(progressevent.progress,onprogress);
  9. }
复制代码

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

  1. internal function onselected(evt:event):void
  2. {
  3.      statetext = "选择了文件" + file.name;
  4. }
  5. internal function oncompleted(evt:event):void
  6. {
  7.      statetext = "上传完毕!";
  8. }
  9. internal function onprogress(evt:progressevent):void
  10. {
  11.      statetext = "已上传 " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
  12. }
复制代码

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

  1. /**
  2.   * 调用filereference的实例方法upload()实现文件上传
  3.   * */
  4. internal function onupload():void
  5. {
  6.      if(file.size > 0)
  7.      {
  8.          statetext = "正在上传文件:" + file.name;
  9.      }
  10.     var request:urlrequest = new urlrequest();
  11.     request.url="http://localhost/web/uploadhandler.ashx";
  12.     file.upload(request);
  13. }
复制代码

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

  1. <mx:textinput x="10" y="57" id="txtfile" text="{statetext}" width="229"/>
  2. <mx:button x="247" y="57" label="选择" fontweight="normal" click="{file.browse()}"/>
  3. <mx:button x="29" y="111" label="上传文件" width="111" fontweight="normal" click="onupload()"/>
复制代码

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

  1. public class uploadhandler : ihttphandler
  2. {
  3.      //文件上传目录
  4.      private string uploadfolder = "upload";
  5.      public void processrequest(httpcontext context)
  6.      {
  7.          context.response.contenttype = "text/plain";
  8.         httpfilecollection files = context.request.files;
  9.         if (files.count > 0)
  10.         {
  11.             string path = context.server.mappath(uploadfolder);
  12.             httppostedfile file = files[0];
  13.             if (file != null && file.contentlength > 0)
  14.             {
  15.                 string savepath = path + "/" + context.request.form["filename"];
  16.                 file.saveas(savepath);
  17.             }
  18.         }
  19.         else
  20.         {
  21.             context.response.write("参数错误");
  22.             context.response.end();
  23.         }
  24.     }
  25.     public bool isreusable
  26.     {
  27.         get
  28.         {
  29.             return false;
  30.         }
  31.     }
  32. }
复制代码

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



   实现了文件上传下面来看看怎么实现文件下载, 以上面上传示例中上传的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注册了成功下载文件后事件处理函数和下载过程处理函数,下面是两个方法的详细定义:

  1. internal function ondowncompleted(evt:event):void
  2. {
  3.      var fileref:filereference = evt.currenttarget as filereference;
  4.      resultlabel.text = "文件名:" + fileref.name + "下载完毕!";
  5. }
  6. internal function ondownprogress(evt:progressevent):void
  7. {
  8.      downstate.text = "已下载: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
  9. }
复制代码

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

  1. /**
  2. * 调用filereference类的实例方法download()实现文件下载
  3. * */
  4. internal function ondownload():void
  5. {
  6.     var request:urlrequest = new urlrequest();
  7.     request.url="http://localhost:1146/upload/做你的爱人.mp3";
  8.     filedown.download(request);
  9. }
复制代码

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

实现上传和下载的完整代码

  1.   <?xml version="1.0" encoding="utf-8"?>
  2.   <mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  3.       <mx:panel x="49" y="66" width="551" height="164" layout="absolute"
  4.           title="使用filereference上传/下载文件" fontsize="12">
  5.           <mx:hdividedbox x="10" y="10" width="511" height="102">
  6.               <mx:canvas  id="left" backgroundcolor="#d7f4ff" height="100%" width="209">
  7.               <mx:textinput x="4" y="20" id="txtfile" text="{statetext}" width="135"/>
  8.               <mx:button x="147" y="20" label="选择" fontweight="normal" click="{file.browse()}"/>
  9.               <mx:button x="31" y="68" label="上传文件" width="111" fontweight="normal" click="onupload()"/>
  10.              </mx:canvas>
  11.              <mx:canvas id="right" backgroundcolor="#d7f4ff" height="100%" width="282">
  12.                  <mx:label x="6" y="9" text="http://localhost/web/upload/做你的爱人.mp3"/>
  13.                  <mx:button x="10" y="37" label="下载文件" fontweight="normal" click="ondownload()"/>
  14.                  <mx:label x="10" y="74" width="272" id="resultlabel"/>
  15.                  <mx:textinput x="122" y="37" id="downstate"/>
  16.              </mx:canvas>
  17.          </mx:hdividedbox>
  18.          
  19.      </mx:panel>
  20.          <mx:script>
  21.          <![cdata[
  22.              [bindable]
  23.              private var statetext:string = "请选择一个文件上传";
  24.             
  25.              private var file:filereference = new filereference();
  26.              private var filedown:filereference = new filereference();
  27.             
  28.              /**
  29.               * createchildren 比 creationcomplete 事件更早发生
  30.               * */
  31.              protected override function createchildren():void
  32.              {
  33.                  super.createchildren();
  34.                  file.addeventlistener(event.select,onselected);
  35.                  file.addeventlistener(event.complete,oncompleted);
  36.                  file.addeventlistener(progressevent.progress,onprogress);
  37.                  
  38.                  filedown.addeventlistener(event.complete,ondowncompleted);
  39.                  filedown.addeventlistener(progressevent.progress,ondownprogress);
  40.              }
  41.             
  42. //            internal function initapp():void
  43. //            {
  44. //                file.addeventlistener(event.select,onselected);
  45. //                file.addeventlistener(event.complete,oncompleted);
  46. //                file.addeventlistener(progressevent.progress,onprogress);
  47. //            }
  48.             
  49.              internal function onselected(evt:event):void
  50.              {
  51.                  statetext = "选择了文件:" + file.name;
  52.              }
  53.             
  54.              internal function oncompleted(evt:event):void
  55.              {
  56.                  statetext = "上传完毕!";
  57.              }
  58.             
  59.             
  60.              internal function ondowncompleted(evt:event):void
  61.              {
  62.                  var fileref:filereference = evt.currenttarget as filereference;
  63.                  resultlabel.text = "文件名:" + fileref.name + "下载完毕!";
  64.              }
  65.             
  66.              internal function onprogress(evt:progressevent):void
  67.              {
  68.                  statetext = "已上传: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
  69.                  
  70.              }
  71.             
  72.              internal function ondownprogress(evt:progressevent):void
  73.              {
  74.                  downstate.text = "已下载: " + math.round(100 * evt.bytesloaded / evt.bytestotal) + "%";
  75.              }
  76.             
  77.              /**
  78.               * 调用filereference的实例方法upload()实现文件上传
  79.               * */
  80.              internal function onupload():void
  81.              {
  82.                  if(file.size > 0)
  83.                  {
  84.                      statetext = "正在上传文件:" + file.name;
  85.                  }
  86.                  var request:urlrequest = new urlrequest();
  87.                  request.url=http://localhost/web/uploadhandler.ashx;
  88.                  file.upload(request);
  89.              }
  90.             
  91.              /**
  92.               * 调用filereference类的实例方法download()实现文件下载
  93.               * */
  94.              internal function ondownload():void
  95.              {
  96.                  var request:urlrequest = new urlrequest();
  97.                  request.url="http://localhost/web/upload/做你的爱人.mp3";
  98.                  filedown.download(request);
  99.              }
  100.         ]]>
  101.     </mx:script>
  102. </mx:application>
分享到:
评论
3 楼 unixboy 2010-03-31  
zhengyu 写道
请教一下,用fileReference download一个文件时,如果DOWNLOAD的URL含有中文,导致下载失败,这种问题怎么解决


我试用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");//此处为文件名

         }
2 楼 zhengyu 2009-12-31  
请教一下,用fileReference download一个文件时,如果DOWNLOAD的URL含有中文,导致下载失败,这种问题怎么解决


我试用ENCODEURI(URI)这样也不行,将TOMCAT设URIENCODING=“UTF-8”这样也不行。


请教一下。。。
1 楼 kalaok_1987 2009-07-21  
楼主,我想问一下,为什么我把这段代码运行以后,可以成功运行,也可以选择路径了,当我打开下载的路径想要查看是否把main.zip下载成功时,并没有看到main.zip文件呢?
麻烦楼主回答一下,先谢谢了。

相关推荐

    源码: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协同工作,实现文件的上传和...

    Flex+Java+BlazeDS多文件上传

    标题“Flex+Java+BlazeDS多文件上传”涉及到的技术栈是Adobe Flex、Java和BlazeDS,这三种技术在Web应用开发中常用于构建富客户端应用和实现服务器端的数据交互。下面将详细阐述这些技术及其在多文件上传场景中的...

    Flex4.6+java+servlet上传图片例子+图片上传预览

    为了实现图片上传,Flex前端可能会使用FileReference类,它提供了读取本地文件并上传到服务器的能力。FileReference对象可以监听“uploadCompleteData”事件,当文件上传成功时触发。同时,通过Flash Player的...

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

    1. **多文件上传**:在Flex中,可以利用Flash Player的FileReference类来实现文件上传。用户可以选择一个或多个文件,然后FileReference对象将负责读取文件内容并发送到服务器。通过循环遍历FileReference列表,可以...

    Flex+Java 实现文件上传

    在本场景中,我们关注的是如何利用Flex作为前端界面与Java后端配合,实现文件的上传、下载和删除功能。这些功能在各种Web应用中非常常见,如云存储服务、在线文档编辑平台等。 **Flex** 是一种基于ActionScript和...

    java spring +flex实现文件上传

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

    Flex+Java 文件上传

    当我们需要在Web应用程序中实现文件上传功能时,可以利用Flex作为前端用户界面,Java Servlet作为后端处理程序。 为了实现Flex+Java Servlet的文件上传,我们需要以下步骤: 1. **事前准备**: 在开始之前,我们...

    Flex+WebService附件上传下载

    通过这种方式,Flex和.NET可以实现无缝集成,提供用户友好的文件上传和下载功能。这不仅适用于附件,还可以扩展到其他需要大量数据交换的场景,如图像、视频等多媒体内容。 总之,Flex与WebService结合使用,能够...

    flex3+java文件上传

    在Flex3中,文件上传主要通过Flash Player的FileReference类来实现。FileReference允许用户选择本地文件,并提供了upload()方法来将文件发送到服务器。以下是一些关键步骤: 1. **创建FileReference对象**:在Flex3...

    Flex+Java多文件上传

    标题中的“Flex+Java多文件上传”指的是使用Adobe Flex(一种富互联网应用程序开发框架)与Java技术相结合,实现用户在Web应用中上传多个文件的功能。这个功能通常涉及到前端的用户界面设计、后端的文件处理逻辑以及...

    flex文件上传下载,在线以pdf形式浏览文件

    本篇文章将详细讲解如何实现"flex文件上传下载,在线以pdf形式浏览文件"这一功能。 首先,让我们了解一下“flex”在这里的含义。Flex通常指的是Adobe Flex,一个用于构建富互联网应用(RIA)的开源框架。它基于...

    flex文件上传下载

    在 Flex 开发中,文件上传和下载是常见的需求,尤其对于需要处理大量用户上传内容的应用来说,这是一项关键功能。Flex 提供了便捷的方式来进行文件的上传和下载操作,同时可以有效利用服务器资源,提高服务器性能。...

    flex实现多文件上传

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

    Flex+Java Servlet文件上传实例

    在本文中,我们将深入探讨如何实现一个Flex与Java Servlet结合的文件上传实例。这个实例将指导你通过Adobe Flex客户端向服务器端的Java Servlet发送文件,使用Apache Commons FileUpload库处理文件上传过程。 首先...

    flex+java文件上传完整实例

    本示例“flex+java文件上传完整实例”提供了一个完善的解决方案,它结合了Adobe Flex前端技术和Java后端技术,实现了用户友好的文件上传功能。Flex是一种开源的RIA(富互联网应用)开发框架,而Java则提供了强大的...

    flex 利用FileReference上传firefox报2038错误

    ### flex 利用FileReference上传firefox报2038错误 #### 问题概述 在使用Flex框架进行Web开发时,可能会遇到使用`FileReference`组件上传文件至服务器时,在Firefox浏览器下出现“2038”错误的情况。该错误通常发生...

    flex+php上传文件可自定义上传格式,上传文件限制大小

    标题中的“flex+php上传文件可自定义上传格式”意味着我们可以使用`Flex`作为前端,通过其灵活的编程模型来定制用户界面,包括选择文件对话框、预览、进度条等元素,并且可以根据需求设置允许上传的文件类型,如图片...

Global site tag (gtag.js) - Google Analytics