利用Flex的FileReference类和FileReferenceList类实现,首先要brow方法选择文件,load方法装载数据(切记),否在会出现IO错误,因为filereference实例的data属性null,没有引用到选择的文件,最后调用upload即可实现上传。

客户端:

逻辑处理部分:

View Code
  1 <fx:Script>
  2         <![CDATA[
  3             import mx.collections.ArrayCollection;
  4             import mx.controls.Alert;
  5             import mx.controls.ProgressBar;
  6             import mx.events.CollectionEvent;
  7             import mx.formatters.CurrencyFormatter;
  8             import mx.formatters.NumberFormatter;
  9             
 10         private var fileRefs:FileReferenceList =new FileReferenceList();
 11         //服务器地址
 12         private var urlRequest:URLRequest =new URLRequest("http://localhost:4283/fileload/Default.aspx");
 13         //文件列表
 14         [Bindable]
 15         private var selectedFiles:ArrayCollection =new ArrayCollection([]);
 16         private var singleThreadFiles:Array=[];
 17         [Bindable]
 18         private var useSingleThread:Boolean=true;
 19         
 20         private function init():void
 21         {
 22             Security.allowDomain("*");
 23             fileRefs.addEventListener(Event.SELECT,fileSelectHandler);
 24             fileRefs.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
 25             fileRefs.addEventListener(Event.COMPLETE, completeHandler);        
 26             
 27         }    
 28         private function selectFile():void{
 29         var fileFiter1:FileFilter=new FileFilter("Images","*.png;*.gif;*jpg");
 30         var fileFiter2:FileFilter=new FileFilter("Documents","*.txt;*.doc;*.pdf;*.docx;*.xml");
 31         fileRefs.browse([fileFiter1,fileFiter2]);
 32         }
 33         
 34         private function fileSelectHandler(event:Event):void{
 35            //遍历选择的文件
 36             for each (var f:FileReference in fileRefs.fileList)
 37             {                
 38                 selectedFiles.addItem(f);
 39                 f.load();
 40             }            
 41         }
 42         //上传文件
 43         private function uploadFile():void{
 44             for each(var f:FileReference in selectedFiles)
 45             {
 46                 try
 47                 {                                        
 48                     f.upload(urlRequest);
 49                 }
 50                 catch(e:Error)
 51                 {
 52                     Alert.show(e.message);
 53                 }
 54             }
 55         }
 56         private function singleThreadUploadFile():void{
 57         //FIFO:逐个从列表中取出,进行同步
 58             if(singleThreadFiles.length >0)
 59             {
 60                 var f:FileReference=singleThreadFiles.pop() as FileReference;
 61                 f.addEventListener(Event.COMPLETE,doSingleUploadFileComplete);
 62                 f.upload(urlRequest);
 63             }
 64         }            
 65         private function  doSingleUploadFileComplete(event:Event):void{
 66         var f:FileReference =event.target as FileReference;
 67         f.removeEventListener(Event.COMPLETE, doSingleUploadFileComplete);
 68         singleThreadUploadFile();
 69         }
 70             
 71         private function ioErrorHandler(e:IOErrorEvent):void
 72         {
 73             Alert.show(e.text);
 74         }
 75             
 76         private function completeHandler(e:Event):void{
 77         
 78         img.source=e.target.date;    
 79         }
 80         private function showImage(e:Event):void{
 81         var f:FileReference=(e.target as DataGrid).selectedItem as FileReference;
 82         f.addEventListener(Event.COMPLETE,completeHandler);
 83         f.load();
 84         }
 85         
 86         public function removeFile(f:FileReference):void
 87         {
 88             var index:int= selectedFiles.getItemIndex(f);
 89             if(index !=-1)
 90                 selectedFiles.removeItemAt(index);        
 91         }    
 92         
 93         //上传文件
 94         private function upLoad():void
 95         {
 96             if (useSingleThread)                                  
 97             {                      
 98                 //逐个上传                      
 99                  singleThreadFiles = selectedFiles.toArray().concat();                                  
100                  singleThreadFiles.reverse();
101                  singleThreadUploadFile();
102             }
103          else
104             {                                    
105                //多个文件同时上传                      
106                uploadFile();
107             }    
108         }        
109         ]]>
110     </fx:Script>

界面设计在DataGrid中显示进度条:

界面设计
 1 <s:VGroup width="100%" height="100%">
 2             <s:HGroup width="100%">
 3                 <mx:Button id="selectFileButton" label="浏览" click="selectFile()"/>
 4                 <mx:Box width="100%" horizontalAlign="right">
 5                 <mx:Button click="selectedFiles.removeAll()" label="清空"/>
 6                 </mx:Box>
 7             </s:HGroup>
 8             <s:HGroup>
 9             <s:DataGrid id="files" width="100%" height="130" 
10                         dataProvider="{selectedFiles}">
11                     <s:columns>
12                         <s:ArrayList>                        
13                         <s:GridColumn headerText="文件名" dataField="name" width="150" />
14                             <s:GridColumn headerText="文件大小(字节)" >
15                                 <s:itemRenderer>
16                                     <fx:Component>
17                                         <s:GridItemRenderer>
18                                             <s:Label text="{data.size}" textAlign="center" width="150" />
19                                         </s:GridItemRenderer>
20                                     </fx:Component>
21                                 </s:itemRenderer>
22                             </s:GridColumn>
23                         <s:GridColumn headerText="上传进度" width="300" >
24                             <s:itemRenderer>
25                                 <fx:Component>        
26                                     <s:GridItemRenderer>
27                                         <s:HGroup>
28                                         <mx:Canvas updateComplete="updateCompleteHandler(event,data)" creationComplete="canvas1_creationCompleteHandler(event,data)" >   
29                                             <fx:Script>   
30                                                 <![CDATA[   
31                                                     import mx.controls.Alert;   
32                                                     import mx.events.FlexEvent; 
33                                                     protected function updateCompleteHandler(event:FlexEvent,d:Object):void   
34                                                     {   
35                                                         // TODO Auto-generated method stuba  
36                                                         var f:FileReference = data as FileReference;
37                                                         //使用闭包方法,更新进度条                                                        
38                                                         f.addEventListener(ProgressEvent.PROGRESS,function(event:ProgressEvent):void
39                                                         {
40                                                             
41                                                             pb.setProgress(event.bytesLoaded,event.bytesTotal);                                                        
42                                                             
43                                                             
44                                                         }); 
45                                                     }   
46                                                     protected function canvas1_creationCompleteHandler(event:FlexEvent,d:Object):void   
47                                                     {   
48                                                         pb.minimum=0;   
49                                                         pb.maximum=100;
50                                                     }
51                                                     
52                                                     protected function linkbutton2_clickHandler(event:Event):void
53                                                     {
54                                                         // TODO Auto-generated method stub
55                                                           var f:FileReference = data as FileReference;
56                                                         outerDocument.removeFile(f);                                                    
57                                                     }
58                                                 ]]>   
59                                             </fx:Script>   
60                                             <mx:ProgressBar direction="right" mode="manual" width="100%" id="pb" label="%3%%"   /> 
61                                         </mx:Canvas> 
62                                         <mx:Button label="删除" click="linkbutton2_clickHandler(event)"  />
63                                     </s:HGroup>            
64                                     </s:GridItemRenderer>
65                                 </fx:Component>
66                             </s:itemRenderer>
67                         </s:GridColumn>
68                         </s:ArrayList>
69                     </s:columns>
70             </s:DataGrid>
71             </s:HGroup>
72             <s:HGroup>
73                 <mx:Button label="上传" click="upLoad()" />
74                 <mx:CheckBox id="checkboxSingleThread" label="同时上传多个文件" selected="{!useSingleThread}" change="useSingleThread = !checkboxSingleThread.selected"/>
75                 <mx:Image id="img" width="50" height="50"/>
76             </s:HGroup>            
77         </s:VGroup>        

服务端:

参考网络

服务端相应
 1 string uploadFolder = "myupload"; // 上传文件夹
 2     protected void Page_Load(object sender, EventArgs e)
 3     {
 4         HttpFileCollection files = Request.Files;
 5 
 6         if (files.Count == 0)
 7         {
 8             Response.Write("请勿直接访问本文件");
 9             Response.End();
10         }
11 
12         string path = Server.MapPath(uploadFolder);
13 
14         // 只取第 1 个文件
15         HttpPostedFile file = files[0];
16 
17         if (file != null && file.ContentLength > 0)
18         {
19             // flash 会自动发送文件名到 Request.Form["fileName"]
20             string savePath = path + "/"+Request.Form["fileName"];
21             file.SaveAs(savePath);
22         }
23     }

 

posted on 2012-09-01 21:44  sapling  阅读(1681)  评论(0编辑  收藏  举报