`
mshijie
  • 浏览: 96283 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flex文件上传下载

    博客分类:
  • Flex
阅读更多

在Flex中,同样支持使用HTTP,multipart/form-data格式上传文件。还支持冲URL下载文件到本地,当然也可以直接跳转浏览器到下载链接,让下载工具来下。

一、文件上传:

分为Flex客户端,和Servlet服务器端。服务器端使用apache-common-filupload库上传。

客户端

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Script>
        <![CDATA[
            import mx.controls.Alert;
            //文件上传类
            private var fileRefer:FileReference=new FileReference();
            private function doUpload():void{
                //添加事件
                //用户选中文件后执行的事件
                fileRefer.addEventListener(Event.SELECT,selectHandler);
                //上传完成之后执行的事件
                fileRefer.addEventListener(Event.COMPLETE,processResult);
                fileRefer.addEventListener(ProgressEvent.PROGRESS, progress);
                var filter:FileFilter = new FileFilter("Text", "*.mpg");
                //打开选择文件对话框
                var flag:Boolean=fileRefer.browse([filter]);
            }
            private function selectHandler(event:Event):void{
                //根据URL执行文件上传,请求到后台Java的Servlet
                var urlStr:String="http://localhost:8080/fileServer/FileUploadServlet";
                var r:URLRequest=new URLRequest(urlStr);
                fileRefer.upload(r);//第二个参数指定文件域的名字,默认为Filedata    
                //提交三个参数Filename,Filedata,Upload            
            }
            private function processResult(event:Event):void{
                Alert.show("上传成功!");
            }
            
            private function progress(event:ProgressEvent):void{
                progressBar.setProgress(event.bytesLoaded, event.bytesTotal);
                progressBar.label = "上传进度:" + int(event.bytesLoaded / event.bytesTotal * 100) + "%";
            }
            
        ]]>
    </mx:Script>    

    <mx:VBox horizontalCenter="0" verticalCenter="0">
        <mx:Button label="上传文件" click="doUpload()" />
        <mx:ProgressBar id="progressBar" labelPlacement="bottom" themeColor="#F20D7A"
                minimum="0" visible="true" maximum="100" label="上传进度:0%"
                direction="right" mode="manual" width="100"/>  
    </mx:VBox>
</mx:Application>

 

主要使用FileReference类,调用其Browse方法,弹出文件选择框,提示用户选择要长传的文件。还可以使用FileFilter设置上传文件过滤,browse方法接受一个文件过滤数组。监听Event.SELECT事件,用户选择文件后触发,调用upload方法向url上传文件。 Event.COMPLETE在文件上传完成后触发。通过监听ProgressEvent.PROGRESS,设置文件长传进度条。 progressBar.setProgress(event.bytesLoaded, event.bytesTotal)。bytesLoaded为已上传大小,bytesTotal为总大小。
上传文件的默认字段名为Filedata,可以通过upload方法的第二个参数指定。

Servlet服务器端

使用的apache-common-fileupload也比较常用,就不多说了。

 

public class FileUploadServlet extends HttpServlet {


    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();

        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        fileUpload.setSizeMax(1024 * 1025 * 1024);

        try {
            List items = fileUpload.parseRequest(request);
            Iterator iter = items.iterator();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();

                if (item.isFormField()) {
                    String name = item.getFieldName();
                    String value = item.getString();
                    System.out.println(name + ":" + value);
                } else {
                    String fieldName = item.getFieldName();
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();
                    String path = getServletContext().getRealPath("/");
                    File uploadedFile = new File(path +
                            + new Random().nextInt(Integer.MAX_VALUE) + "_"
                            + fileName);
                    item.write(uploadedFile);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 

二、文件下载:

Servlet服务器端:

public class FileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String fileName = "hello.txt";
        response.setContentType("text/plain");
        response.setHeader("Content-disposition", "attachment;filename="
                + fileName);
        byte[] data = "Hello,world!".getBytes(Charset.forName("GBK"));
        OutputStream out = response.getOutputStream();
        out.write(data);
        out.flush();
        out.close();
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

}

 

下载了一个文件名为hello.txt的文件,内容为Hello,world!

Flex客户端:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Script>
        <![CDATA[
         import flash.net.navigateToURL;
        
         private var downloadURL:URLRequest;
           private var file:FileReference;

    
         public function doDownload():void {
            //方法一
             navigateToURL(new URLRequest("http://localhost:8080/fileServer/FileDownloadServlet"), "_blank");
             
            //方法二
            /*
              downloadURL = new URLRequest("http://localhost:8080/fileServer/FileDownloadServlet");
            file = new FileReference();
            configureListeners(file);
            file.download(downloadURL);
            */
         }

         private function configureListeners(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener(Event.CANCEL, cancelHandler);
            dispatcher.addEventListener(Event.COMPLETE, completeHandler);
            dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            dispatcher.addEventListener(Event.OPEN, openHandler);
            dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            dispatcher.addEventListener(Event.SELECT, selectHandler);
        }
        
        //............省略事件处理函数
        ]]>
    </mx:Script>    



    <mx:VBox horizontalCenter="0" verticalCenter="0">
        <mx:Button label="下载文件" click="doDownload()" />
    </mx:VBox>
</mx:Application>
 

下载文件使用了两种方法

方法一最简单,直接跳转到下载链接(迅雷应该启动了)。
方法二同样使用FileReference,调用download方法,弹出对话框让用户选择下载的文件名。方法二有一个麻烦的地方就是,这里的默认文件名是FileDownloadServlet,因为其在下载前就弹出对话框让用户选择下载文件的存放路径,所以无法解析http头中的Content- disposition或filename信息,只有使用其他方式从服务器端取得默认文件名,比较麻烦。


9
0
分享到:
评论
2 楼 墨子宇 2012-10-30  
因为其在下载前就弹出对话框让用户选择下载文件的存放路径,所以无法解析http头中的Content- disposition或filename信息,只有使用其他方式从服务器端取得默认文件名,比较麻烦。



这个有比较好的解决办法吗?
1 楼 xuyb_0314 2010-06-13  
按照楼主这样部署上去,为什么servlet会报错呢?

相关推荐

    flex文件上传下载

    Flex文件上传下载是一种在Web应用中实现文件交互的技术,它主要使用Adobe Flex框架来构建富互联网应用程序(RIA)。Flex提供了一种强大的方式来创建交互式的、图形化的用户界面,其中包括处理文件上传和下载功能。在...

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

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

    flex 文件上传下载完整代码(废弃--代码有错误)

    建议使用描述中提到的修正版代码:“flex 文件上传下载完整代码(修正版)”,以获取更稳定、可靠的实现。 请注意,由于跨域安全限制,Flex的文件上传和下载功能可能会受到一些约束。在实际开发中,需要确保服务器...

    flex文件上传下载组件

    Flex文件上传下载组件是基于Adobe Flex技术和Java后端开发的一款功能强大的交互式应用程序,它允许用户在Web浏览器中实现文件的便捷上传与下载。这款组件通常由前端的Flex客户端和后端的Java服务器端两部分组成,...

    flex 文件上传下载完整代码(修正版)

    在项目开发过程中,经常会遇到文件上传下载的...但在flex中由于安全沙箱的原因flex程序不能直接访问本地文件,但是flex SDK中提供了FileReference和FileReferenceList两个类,可以通过这两个类来实现文件的上传下载。

    Flex附件上传下载

    总之,Flex附件上传下载涉及到客户端的文件选择和传输、服务器端的文件处理以及两者之间的通信协议。通过熟练掌握`FileReference`类和HttpHandler,开发者可以构建出高效且用户友好的文件上传下载功能。这个教程资源...

    Flex文件上传的组件

    Flex文件上传组件是一种基于Adobe Flex技术的用户界面组件,它允许用户在Web应用程序中选择并上传文件。在Flex中,这种组件通常会显示一个文件选择对话框,让用户选择要上传的文件,并且会提供一个进度条来显示上传...

    Flex上传文件与下载

    ### Flex与Servlet结合实现文件上传及下载功能 在Flex与Servlet技术结合的背景下,本文将详细介绍如何通过这两种技术实现文件的上传与下载功能。通过分析提供的代码片段,我们可以看到一个典型的Flex应用程序界面...

    Flex文件上传文件代码

    Flex 文件上传的文件代码 交你一步一步的完成上传功能

    Flex文件上传组件

    Flex文件上传组件是一种基于Adobe Flex技术的用户界面组件,用于在Web应用中实现文件上传功能。Flex是一个开源的RIA(富互联网应用)框架,它允许开发者创建交互性强、图形丰富的Web应用。在这个组件中,用户可以...

    Flex文件上传(某GIS系统,我负责的文件上传部分)

    Flex文件上传技术是基于Adobe Flex框架实现的一种交互式文件上传方式,常用于GIS(Geographic Information System,地理信息系统)这样的应用中,以便用户能够方便地上传地理数据、地图图像等文件。在我负责的GIS...

    asp.net+flex批量上传文件

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

    Flex 文件上传 java是后台服务

    Flex 文件上传技术是一种在Web应用中实现用户向服务器端上传文件的方法,通常涉及到前端的Flex技术与后端的Java服务进行交互。Flex是一款强大的富互联网应用程序(RIA)开发框架,由Adobe公司提供,用于创建动态、...

    Flex 多文件上传组件

    这个组件在Web应用程序中非常实用,特别是在处理大量图片、文档或其他类型文件上传的场景下,大大提升了用户体验。 首先,我们来看核心组件`MultiFileUpload.as`。这个文件是ActionScript 3(AS3)编写的,它是整个...

    flex 文件上传 预览下载 及中文名乱码解决问题

    本篇文章将详细介绍如何在Flex中实现文件上传、预览、下载功能,并解决中文文件名在这些操作中可能出现的乱码问题。 首先,文件上传是通过HTTP的POST请求来实现的。在Flex中,我们可以使用`URLLoader`类来发送数据...

    flex实现多文件上传

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

    flex文件上传系统

    Flex文件上传系统是一种基于Adobe Flex技术构建的前端文件上传解决方案。Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的开发框架,它基于ActionScript编程语言和MXML标记语言,能够创建高度交互、视觉...

Global site tag (gtag.js) - Google Analytics