下面的例子展示了用Flex上传文件的完整代码。

  1. 基本实现的功能:
    • 一次选取多个文件上传
    • 上传过程中显示每个文件的进度
    • 如果是图片,可以上传之前进行预览
    • 可以选择逐个文件上传,也可以选择同时上传多个文件,这样就是对服务器压力稍微大一些
  2. 技术点:
    • 闭包方法(在c#里,也叫匿名委托方法),根据我的体会,如果不使用闭包方法,更新进度条会是一个比较麻烦的问题,除非另外编写一个类,这个问题稍后再研究
    • DataGrid中需要用到itemRenderer,从而在每行都显示进度条和删除、取消按钮
  3. 软件环境
    • Flex Builder 3
    • Flash player 10
      • Flash player 9 (特别说明:如果使用这个版本的flashPlayer,FileFerence没有load方法和data属性,也就无法实现本地预览图片,请去掉load和data有关调用即可)
      • 在Flex Builder 3中默认是Flash Player 9,只能自己修改一下配置文件,切换到10,方法请参考Targeting Flash Player 10

还是先看一下程序吧,稍后再看代码

源码下载:

fileUpload.xml

客户端代码:fileUpload.xml-------------------------------------------------------------------------------------------------

  1完整的Flex多文件上传实例<?xml version="1.0" encoding="utf-8"?>
  2完整的Flex多文件上传实例<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  3完整的Flex多文件上传实例    layout="vertical" horizontalAlign="left" fontSize="12"
  4完整的Flex多文件上传实例    initialize="init()"
  5完整的Flex多文件上传实例    viewSourceURL="srcview/index.html">
  6完整的Flex多文件上传实例    <mx:NumberFormatter id="filesizeFormatter" useThousandsSeparator="true"/>
  7完整的Flex多文件上传实例    <mx:Script>
  8完整的Flex多文件上传实例        <![CDATA[
  9完整的Flex多文件上传实例            import mx.events.CollectionEvent;
10完整的Flex多文件上传实例            import mx.formatters.NumberFormatter;
11完整的Flex多文件上传实例            import mx.formatters.CurrencyFormatter;
12完整的Flex多文件上传实例            import mx.collections.ArrayCollection;
13完整的Flex多文件上传实例            import mx.controls.Alert;
14完整的Flex多文件上传实例            private var fileRefs: FileReferenceList = new FileReferenceList();
15完整的Flex多文件上传实例            //这个地址是我测试用的服务器地址
16完整的Flex多文件上传实例            private var urlrequest: URLRequest = new URLRequest("http://localhost:8080/abc/UploadFile");
17完整的Flex多文件上传实例            [Bindable]
18完整的Flex多文件上传实例            private var selectedFiles: ArrayCollection = new ArrayCollection([]);
19完整的Flex多文件上传实例            private var singleThreadFiles: Array = [];
20完整的Flex多文件上传实例            [Bindable]
21完整的Flex多文件上传实例            private var useSingleThread: Boolean = true;
22完整的Flex多文件上传实例            private function init(): void
23完整的Flex多文件上传实例            {
24完整的Flex多文件上传实例                Security.allowDomain("*");
25完整的Flex多文件上传实例                fileRefs.addEventListener(Event.SELECT, fileSelectHandler);
26完整的Flex多文件上传实例                fileRefs.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
27完整的Flex多文件上传实例                fileRefs.addEventListener(Event.COMPLETE, completeHandler);
28完整的Flex多文件上传实例                addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
29完整的Flex多文件上传实例            }
30完整的Flex多文件上传实例            private function selectFile(): void
31完整的Flex多文件上传实例            {
32完整的Flex多文件上传实例                fileRefs.browse([new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png"),
33完整的Flex多文件上传实例                                       new FileFilter("所有文件(*.*)", "*.*")
34完整的Flex多文件上传实例                             ]);
35完整的Flex多文件上传实例            }
36完整的Flex多文件上传实例            private function fileSelectHandler(event: Event): void
37完整的Flex多文件上传实例            {
38完整的Flex多文件上传实例                for each (var f: FileReference in fileRefs.fileList)
39完整的Flex多文件上传实例                {
40完整的Flex多文件上传实例                    selectedFiles.addItem(f);
41完整的Flex多文件上传实例                }
42完整的Flex多文件上传实例            }
43完整的Flex多文件上传实例            private function uploadFile(): void
44完整的Flex多文件上传实例            {              
45完整的Flex多文件上传实例                for each (var f: FileReference in selectedFiles)
46完整的Flex多文件上传实例                {          
47完整的Flex多文件上传实例                    try
48完整的Flex多文件上传实例                    {
49完整的Flex多文件上传实例                        f.upload(urlrequest);
50完整的Flex多文件上传实例                    }
51完整的Flex多文件上传实例                    catch (e: Error)
52完整的Flex多文件上传实例                    {
53完整的Flex多文件上传实例                        Alert.show(e.message);
54完整的Flex多文件上传实例                    }
55完整的Flex多文件上传实例                }              
56完整的Flex多文件上传实例            }
57完整的Flex多文件上传实例            private function singleThreadUploadFile(): void
58完整的Flex多文件上传实例            {
59完整的Flex多文件上传实例                //FIFO:逐个从列表中取出,进行同步上传
60完整的Flex多文件上传实例                if (singleThreadFiles.length > 0)
61完整的Flex多文件上传实例                {
62完整的Flex多文件上传实例                    var f: FileReference = singleThreadFiles.pop() as FileReference;
63完整的Flex多文件上传实例                    f.addEventListener(Event.COMPLETE, doSingleUploadFileComplete);
64完整的Flex多文件上传实例                    f.upload(urlrequest);
65完整的Flex多文件上传实例                }
66完整的Flex多文件上传实例            }
67完整的Flex多文件上传实例            private function doSingleUploadFileComplete(event: Event): void
68完整的Flex多文件上传实例            {
69完整的Flex多文件上传实例                var f: FileReference = event.target as FileReference;
70完整的Flex多文件上传实例                f.removeEventListener(Event.COMPLETE, doSingleUploadFileComplete);
71完整的Flex多文件上传实例                singleThreadUploadFile();
72完整的Flex多文件上传实例            }
73完整的Flex多文件上传实例            private function ioErrorHandler(e:IOErrorEvent): void
74完整的Flex多文件上传实例            {
75完整的Flex多文件上传实例                Alert.show(e.text);
76完整的Flex多文件上传实例            }
77完整的Flex多文件上传实例            private function completeHandler(e: Event): void
78完整的Flex多文件上传实例            {
79完整的Flex多文件上传实例                img.source = e.target.data;
80完整的Flex多文件上传实例            }
81完整的Flex多文件上传实例            private function showImage(e: Event): void
82完整的Flex多文件上传实例            {              
83完整的Flex多文件上传实例                var f: FileReference = (e.target as DataGrid).selectedItem as FileReference;
84完整的Flex多文件上传实例                f.addEventListener(Event.COMPLETE, completeHandler);
85完整的Flex多文件上传实例                f.load();
86完整的Flex多文件上传实例            }
87完整的Flex多文件上传实例            public function removeFile(f: FileReference): void
88完整的Flex多文件上传实例            {
89完整的Flex多文件上传实例                var index: int = selectedFiles.getItemIndex(f);
90完整的Flex多文件上传实例                if (index != -1)
91完整的Flex多文件上传实例                    selectedFiles.removeItemAt(index);
92完整的Flex多文件上传实例            }
93完整的Flex多文件上传实例        ]]>
94完整的Flex多文件上传实例    </mx:Script>
95完整的Flex多文件上传实例    <mx:VBox>
96完整的Flex多文件上传实例        <mx:HBox width="100%">
97完整的Flex多文件上传实例            <mx:Button id="selectFileButton" label="浏览完整的Flex多文件上传实例" click="selectFile()"/>
98完整的Flex多文件上传实例            <mx:Box width="100%" horizontalAlign="right">
99完整的Flex多文件上传实例                <mx:Button click="selectedFiles.removeAll();" label="清空"/>
100完整的Flex多文件上传实例            </mx:Box>
101完整的Flex多文件上传实例        </mx:HBox>
102完整的Flex多文件上传实例        <mx:DataGrid id="files" dataProvider="{selectedFiles}" change="showImage(event)">
103完整的Flex多文件上传实例            <mx:columns>
104完整的Flex多文件上传实例                <mx:DataGridColumn width="150" headerText="文件名" dataField="name" />
105完整的Flex多文件上传实例                <mx:DataGridColumn headerText="大小(字节)" dataField="size">
106完整的Flex多文件上传实例                    <mx:itemRenderer>
107完整的Flex多文件上传实例                        <mx:Component>
108完整的Flex多文件上传实例                            <mx:Label text="{outerDocument.filesizeFormatter.format(data.size)}" textAlign="right"/>
109完整的Flex多文件上传实例                        </mx:Component>
110完整的Flex多文件上传实例                    </mx:itemRenderer>
111完整的Flex多文件上传实例                </mx:DataGridColumn>
112完整的Flex多文件上传实例                <mx:DataGridColumn headerText="上传进度" width="300">
113完整的Flex多文件上传实例                    <mx:itemRenderer>
114完整的Flex多文件上传实例                        <mx:Component>
115完整的Flex多文件上传实例                            <mx:HBox fontSize="10" fontWeight="normal" fontThickness="1">
116完整的Flex多文件上传实例                                <mx:Script>
117完整的Flex多文件上传实例                                    <![CDATA[
118完整的Flex多文件上传实例                                        import flash.profiler.showRedrawRegions;
119完整的Flex多文件上传实例                                        import mx.controls.Alert;
120完整的Flex多文件上传实例                                         import mx.controls.ProgressBar;
121完整的Flex多文件上传实例                                         private function initProgressBar(event: Event): void
122完整的Flex多文件上传实例                                         {
123完整的Flex多文件上传实例                                            //使progressbar与file关联,从而产生进度条
124完整的Flex多文件上传实例                                            var pb: ProgressBar = event.target as ProgressBar;
125完整的Flex多文件上传实例                                            pb.label = "%3%%";
126完整的Flex多文件上传实例                                             pb.setProgress(0, 100);
127完整的Flex多文件上传实例                                             var f: FileReference = data as FileReference;
128完整的Flex多文件上传实例                                             //使用闭包方法,更新进度条
129完整的Flex多文件上传实例                                             f.addEventListener(ProgressEvent.PROGRESS,
130完整的Flex多文件上传实例                                                 function(event: ProgressEvent): void
131完整的Flex多文件上传实例                                                 {
132完整的Flex多文件上传实例                                                     pb.setProgress(event.bytesLoaded, event.bytesTotal);
133完整的Flex多文件上传实例                                                 }
134完整的Flex多文件上传实例                                            );
135完整的Flex多文件上传实例                                            f.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,
136完整的Flex多文件上传实例                                                function (event: DataEvent): void
137完整的Flex多文件上传实例                                                {
138完整的Flex多文件上传实例                                                    //服务器端一定要返回数据,否则,这个方法就不起作用了
139完整的Flex多文件上传实例                                                    pb.label = event.data;
140完整的Flex多文件上传实例                                                }
141完整的Flex多文件上传实例                                            );                                          
142完整的Flex多文件上传实例                                         }
143完整的Flex多文件上传实例                                    ]]>
144完整的Flex多文件上传实例                                </mx:Script>
145完整的Flex多文件上传实例                                <mx:ProgressBar verticalCenter="true" width="100%" paddingLeft="5" paddingRight="5"
146完整的Flex多文件上传实例                                    maximum="100" minimum="0" labelPlacement="center" mode="manual"
147完整的Flex多文件上传实例                                    label="%3%%" textAlign="left"
148完整的Flex多文件上传实例                                    creationComplete="initProgressBar(event)"/>
149完整的Flex多文件上传实例                                <mx:LinkButton label="Cancel">
150完整的Flex多文件上传实例                                    <mx:click>
151完整的Flex多文件上传实例                                        <![CDATA[
152完整的Flex多文件上传实例                                            var f: FileReference = data as FileReference;
153完整的Flex多文件上传实例                                            f.cancel();
154完整的Flex多文件上传实例                                        ]]>
155完整的Flex多文件上传实例                                    </mx:click>
156完整的Flex多文件上传实例                                </mx:LinkButton>
157完整的Flex多文件上传实例                                <mx:LinkButton label="Delete">
158完整的Flex多文件上传实例                                    <mx:click>
159完整的Flex多文件上传实例                                        <![CDATA[
160完整的Flex多文件上传实例                                            var f: FileReference = data as FileReference;
161完整的Flex多文件上传实例                                            outerDocument.removeFile(f);
162完整的Flex多文件上传实例                                        ]]>
163完整的Flex多文件上传实例                                    </mx:click>
164完整的Flex多文件上传实例                                </mx:LinkButton>
165完整的Flex多文件上传实例                            </mx:HBox>
166完整的Flex多文件上传实例                        </mx:Component>
167完整的Flex多文件上传实例                    </mx:itemRenderer>
168完整的Flex多文件上传实例                </mx:DataGridColumn>
169完整的Flex多文件上传实例            </mx:columns>
170完整的Flex多文件上传实例        </mx:DataGrid>
171完整的Flex多文件上传实例    </mx:VBox>
172完整的Flex多文件上传实例    <mx:HBox>
173完整的Flex多文件上传实例        <mx:Button label="上传">
174完整的Flex多文件上传实例            <mx:click>
175完整的Flex多文件上传实例                <![CDATA[
176完整的Flex多文件上传实例                    if (useSingleThread)
177完整的Flex多文件上传实例                    {
178完整的Flex多文件上传实例                        //逐个上传
179完整的Flex多文件上传实例                        singleThreadFiles = selectedFiles.toArray().concat();
180完整的Flex多文件上传实例                        singleThreadFiles.reverse();
181完整的Flex多文件上传实例                        singleThreadUploadFile();
182完整的Flex多文件上传实例                    }
183完整的Flex多文件上传实例                    else
184完整的Flex多文件上传实例                    {
185完整的Flex多文件上传实例                        //多个文件同时上传
186完整的Flex多文件上传实例                        uploadFile();
187完整的Flex多文件上传实例                    }
188完整的Flex多文件上传实例                ]]>
189完整的Flex多文件上传实例            </mx:click>
190完整的Flex多文件上传实例        </mx:Button>
191完整的Flex多文件上传实例        <mx:CheckBox id="checkboxSingleThread" label="同时上传多个文件" selected="{!useSingleThread}"
192完整的Flex多文件上传实例            change="useSingleThread = !checkboxSingleThread.selected"/>
193完整的Flex多文件上传实例    </mx:HBox>
194完整的Flex多文件上传实例    <mx:Image id="img" width="400" height="300"/>
195完整的Flex多文件上传实例</mx:Application>

 

服务器端代码:-----------------------------------------------------------------------------------------------------------


1完整的Flex多文件上传实例package com.java.test;
2完整的Flex多文件上传实例
3完整的Flex多文件上传实例import java.io.File;
4完整的Flex多文件上传实例import java.io.IOException;
5完整的Flex多文件上传实例
6完整的Flex多文件上传实例import java.util.Iterator;
7完整的Flex多文件上传实例import java.util.List;
8完整的Flex多文件上传实例
9完整的Flex多文件上传实例import javax.servlet.ServletException;
10完整的Flex多文件上传实例import javax.servlet.http.HttpServlet;
11完整的Flex多文件上传实例import javax.servlet.http.HttpServletRequest;
12完整的Flex多文件上传实例import javax.servlet.http.HttpServletResponse;
13完整的Flex多文件上传实例
14完整的Flex多文件上传实例import org.apache.commons.fileupload.FileItem;
15完整的Flex多文件上传实例import org.apache.commons.fileupload.FileUploadException;
16完整的Flex多文件上传实例import org.apache.commons.fileupload.disk.DiskFileItemFactory;
17完整的Flex多文件上传实例import org.apache.commons.fileupload.servlet.ServletFileUpload;
18 

代码稍微有点多,请见谅。

相关文章: