zoukankan      html  css  js  c++  java
  • Flex带进度条的多文件上传(基于Servlet)

    Flex中实现的文件上传主要用到以下两个类:

          ●FileReference:FileReference 类提供了在用户计算机和服务器之间上载和下载文件的方法。操作系统对话框会提示用户选择要上载的文件或用于下载的位置。每个 FileReference 对象都引用用户磁盘上的一个文件并且具有一些属性,这些属性包含有关文件大小(size)、类型(type)、名称(name)、创建日期(creationDate)、修改日期(modificationDate)和创建者类型(仅限Macintosh)的信息。

         ●FileReferenceList 类提供了让用户选择一个或多个要上载的文件的方法。FileReferenceList 对象将用户磁盘上的一组本地文件(一个或多个文件)表示为 FileReference 对象的数组。有关详细信息以及有关 FileReference 对象和 FileReference 类(可与 FileReferenceList 一起使用)的重要注意事项,请参阅 FileReference 类。

         FileReferenceList 类的使用方法为:

         ①  将该类实例化:var myFileRef = new FileReferenceList();

         ②  调用FileReferenceList.browse() 方法,该方法将打开一个对话框,让用户选择一个或多个要上载的文件:myFileRef.browse();

         ③  在成功调用browse() 方法之后,使用 FileReference 对象数组来填充 FileReferenceList 对象的fileList 属性。

          ④  对fileList 数组中的每个元素调用FileReference.upload()。

         好了,现在开始实现文件上传,首先新建一个Application文件UploadFileDemo.mxml,代码如下所示:

    1. <?xmlversionxmlversion="1.0" encoding="utf-8"?>  
    2. <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"  
    3.               xmlns:s="library://ns.adobe.com/flex/spark"  
    4.               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="application_initializeHandler(event)">  
    5.     <fx:Script>  
    6.        <![CDATA[ 
    7.            import ases.FileReferenceVo; 
    8.            
    9.            import flashx.textLayout.events.SelectionEvent; 
    10.            
    11.            import mx.collections.ArrayCollection; 
    12.            import mx.controls.Alert; 
    13.            import mx.events.CloseEvent; 
    14.            import mx.events.FlexEvent; 
    15.            import mx.rpc.events.FaultEvent; 
    16.            
    17.            import spark.primitives.supportClasses.FilledElement; 
    18.            
    19.             public varselectFileList:FileReferenceList=new FileReferenceList(); //存贮选择文件的数组 
    20.            [Bindable] 
    21.             public var fileArrayCollction:ArrayCollection=newArrayCollection();   //此数组用于保存文件信息 
    22.            [Bindable] 
    23.             public var arrayCollection:ArrayCollection=newArrayCollection();  //此数组用于DataGrid表格中显示 
    24.             public varurlRequest:URLRequest=new URLRequest("http://localhost:9080/javaAndFlex/FileUploadServlet");  //服务器类地址 
    25.            
    26.            protected function application_initializeHandler(event:FlexEvent):void 
    27.            { 
    28.               // TODOAuto-generated method stub 
    29.               selectFileList.addEventListener(Event.SELECT,selectFileHandler);  //选择文件监听器 
    30.            } 
    31.            public function selectFiles():void{  //浏览文件处理事件 
    32.               //arrayCollection.removeAll(); 
    33.               var imagesFilter:FileFilter = new FileFilter("Images", "*.jpg;*.gif;*.png");  //选择的图片类型 
    34.               var docFilter:FileFilter = new FileFilter("Documents", "*.pdf;*.doc;*.txt");  //选择的文档类型 
    35.               var videoFilter:FileFilter= new FileFilter("Videos"," *.mp3;*.mp4;*.avi;*.rmvb");  //选择的视频类型 
    36.               selectFileList.browse([imagesFilter,docFilter,videoFilter]);  
    37.            } 
    38.            public function selectFileHandler(event:Event):void{  //处理选择文件 
    39.               for(var i:int=0;i<selectFileList.fileList.length;i++){ 
    40.                   varfileReference:FileReference=FileReference(selectFileList.fileList[i]); 
    41.                   var object:Object=new Object(); 
    42.                   object.fileRefer=fileReference; 
    43.                   object.fileName=fileReference.name; 
    44.                   object.fileType=fileReference.type.substr(1); 
    45.                   object.fileSize=(fileReference.size/1024).toFixed(2)+"KB"; 
    46.                   fileArrayCollction.addItem(object); 
    47.                   arrayCollection.addItem(object); 
    48.               } 
    49.               fileDataGrid.dataProvider=arrayCollection; 
    50.            } 
    51.            
    52.            protected function cancleUpload_clickHandler(event:MouseEvent):void  //清空按钮处理函数 
    53.            { 
    54.               // TODOAuto-generated method stub 
    55.               Alert.yesLabel="是的"; 
    56.               Alert.cancelLabel="取消" 
    57.               if(fileArrayCollction.length<1){ 
    58.                   Alert.show("没有要上传的文件!","提示"); 
    59.                   return; 
    60.               } 
    61.            
    62.               Alert.show("确实要清空文件上传列表吗?","提示",Alert.YES|Alert.CANCEL,this,yesOrCancleHandler,null,Alert.CANCEL); 
    63.               
    64.               
    65.            } 
    66.            public function yesOrCancleHandler(event:CloseEvent):void{ 
    67.               if(event.detail==Alert.YES){ 
    68.                   arrayCollection.removeAll(); 
    69.                   fileArrayCollction.removeAll(); 
    70.                   fileDataGrid.dataProvider=arrayCollection; 
    71.                   
    72.               } 
    73.            } 
    74.            
    75.            protected function uploadFile_clickHandler(event:MouseEvent):void  //文件上传处理函数 
    76.            { 
    77.               // TODOAuto-generated method stub 
    78.               if(fileArrayCollction.length<1){ 
    79.                   Alert.show("请选择要上传的文件!","提示"); 
    80.                   return; 
    81.               } 
    82.               
    83.               for(var i:int=0;i<fileArrayCollction.length;i++){ 
    84.                   varfileReference:FileReference=FileReference(fileArrayCollction[i]['fileRefer']); 
    85.                   
    86.                   //fileUpLoad.upload(fileReference.data,fileReference.name); 
    87.                   fileReference.upload(urlRequest); 
    88.                   browseFile.enabled=false;  //将浏览文件按钮置灰 
    89.                   uploadFile.enabled=false;  //将上传按钮置灰 
    90.                   cancleUpload.enabled=false;  //将清空按钮置灰 
    91.                   if(i==fileArrayCollction.length-1){ 
    92.                       fileReference.addEventListener(Event.COMPLETE,fileUploadCompleteHandler); 
    93.                   } 
    94.               } 
    95.            } 
    96.            protected function fileUploadCompleteHandler(event:Event):void{ 
    97.               browseFile.enabled=true; 
    98.               uploadFile.enabled=true; 
    99.               cancleUpload.enabled=true; 
    100.               Alert.yesLabel="是"; 
    101.               Alert.cancelLabel="否"; 
    102.               Alert.show("文件已经上传完毕,是否接着上传?","提示",Alert.YES|Alert.CANCEL,this,chooseUploadFile,null,Alert.CANCEL); 
    103.            } 
    104.            protected function chooseUploadFile(event:CloseEvent):void{  //上传文件完毕后的处理函数 
    105.               if(event.detail==Alert.YES){ 
    106.                   this.selectFiles(); 
    107.               } 
    108.            
    109.            } 
    110.        ]]>  
    111.     </fx:Script>  
    112.     <fx:Declarations>  
    113.        <!-- Place non-visualelements (e.g., services, value objects) here -->  
    114.     </fx:Declarations>  
    115.     <s:Panel x="304" y="131" width="717" height="380" title="文件上传" fontSize="18">  
    116.        <mx:DataGrid  x="25" y="14" id="fileDataGrid"  fontWeight="bold" width="669" fontSize="16"height="261" >  
    117.            <mx:columns>  
    118.               <mx:DataGridColumn headerText="文件名" width="200" dataField="fileName" />  
    119.               <mx:DataGridColumn headerText="文件大小" width="100" dataField="fileSize" />  
    120.               <mx:DataGridColumn headerText="文件类型" width="100" dataField="fileType" />  
    121.               <mx:DataGridColumn headerText="上传进度"  >  
    122.                   <mx:itemRenderer>  
    123.                      <fx:Component>  
    124.                          <mx:HBox width="100%" height="100%" paddingLeft="10" >  
    125.                             <fx:Script>  
    126.                                 <![CDATA[  
    127.                                    importmx.collections.ArrayCollection; 
    128.                                    
    129.                                    protected functiondeleteFile_clickHandler(event:MouseEvent):void 
    130.                                    { 
    131.                                        // TODO Auto-generated method stub 
    132.                                        // 
    133.                                        var grid:Object =event.target.parent.parent.parent; 
    134.                                        var dp:ArrayCollection =ArrayCollection(grid.dataProvider); 
    135.                                        var index:int = dp.getItemIndex(data); 
    136.                                        outerDocument.arrayCollection.removeItemAt(index); 
    137.                                        dp.removeItemAt(index); 
    138.                                        grid.parent.refresh(); 
    139.                                    } 
    140.                                    
    141.                                    protected functionprogressBar_progressHandler(event:ProgressEvent):void 
    142.                                    { 
    143.                                        // TODO Auto-generated method stub 
    144.                                        deleteFile.visible=false; 
    145.                                    } 
    146.                                    
    147.                                    protected function progressBar_completeHandler(event:Event):void 
    148.                                    { 
    149.                                        // TODO Auto-generated method stub 
    150.                                        deleteFile.visible=true; 
    151.                                    } 
    152.                                    
    153.                                    
    154.                                    
    155.                                 ]]>  
    156.                             </fx:Script>  
    157.                             <mx:ProgressBar minimum="0" chromeColor="13892729" maximum="100"progress="progressBar_progressHandler(event)" complete="progressBar_completeHandler(event)"     labelPlacement="center"  source="{data.fileRefer}" label="%3%%" id="progressBar"   width="90%" />  
    158.                             <mx:LinkButton id="deleteFile" width="10%" icon="@Embed('images/delete.png')"click="deleteFile_clickHandler(event)" />  
    159.                          </mx:HBox >  
    160.                      </fx:Component>  
    161.                   </mx:itemRenderer>  
    162.               </mx:DataGridColumn>  
    163.            </mx:columns>  
    164.        </mx:DataGrid>  
    165.        <mx:HBox paddingLeft="20" horizontalGap="35"paddingTop="8" x="218" y="295" width="100%" height="100%">  
    166.            <s:Button id="browseFile" height="31" label="浏览..." fontSize="18" click="selectFiles()"/>  
    167.            <s:Button id="uploadFile" height="31" label="上传" fontSize="18"click="uploadFile_clickHandler(event)"/>  
    168.            <s:Button id="cancleUpload" height="31" label="清空" fontSize="18"click="cancleUpload_clickHandler(event)"/>  
    169.        </mx:HBox>  
    170.     </s:Panel>  
    171. </s:Application>  

         运行时页面

           新建一个servlet类FileUploadServlet,代码如下所示:

    1. package com.ldfsoft.servlet;  
    2.    
    3. import java.io.File;  
    4. import java.io.IOException;  
    5. import java.io.PrintWriter;  
    6. import java.util.Iterator;  
    7. import java.util.List;  
    8.    
    9. import javax.servlet.ServletException;  
    10. import javax.servlet.http.HttpServlet;  
    11. importjavax.servlet.http.HttpServletRequest;  
    12. import javax.servlet.http.HttpServletResponse;  
    13.    
    14. importorg.apache.commons.fileupload.FileItem;  
    15. importorg.apache.commons.fileupload.FileUploadException;  
    16. importorg.apache.commons.fileupload.disk.DiskFileItemFactory;  
    17. importorg.apache.commons.fileupload.servlet.ServletFileUpload;  
    18.    
    19. public class FileUploadServlet extendsHttpServlet {  
    20.    
    21.  @SuppressWarnings("unchecked")  
    22. @Override  
    23. protected void service(HttpServletRequestrequest, HttpServletResponse response)  
    24.                    throwsServletException, IOException {  
    25.          //TODO Auto-generated method stub  
    26.           response.setContentType("text/html;charset=utf-8");  
    27.           DiskFileItemFactory diskFileItemFactory=newDiskFileItemFactory();  
    28.           ServletFileUpload servletFileUpload=newServletFileUpload(diskFileItemFactory);  
    29.           servletFileUpload.setHeaderEncoding("utf-8");  
    30.           servletFileUpload.setSizeMax(1024*1024*1024);  
    31.           try {  
    32.                    List<FileItem>items=servletFileUpload.parseRequest(request);  
    33.                    Iterator<FileItem>iterator=items.iterator();  
    34.                    while(iterator.hasNext()){  
    35.                             FileItemitem=(FileItem) iterator.next();  
    36.                             if(!item.isFormField()){  
    37.                                      StringfileName=item.getName();  
    38.                                      Stringpath=getServletContext().getRealPath("/")+"files/"//文件上传目录为根目录下面的files文件夹里  
    39.                                      System.out.println(fileName);  
    40.                                      FileuploadFile=new File(path+fileName);  
    41.                                      item.write(uploadFile);  
    42.                                       
    43.                             }  
    44.                    }  
    45.          }catch (FileUploadException e) {  
    46.                    //TODO Auto-generated catch block  
    47.                    e.printStackTrace();  
    48.          }catch (Exception e) {  
    49.                    //TODO Auto-generated catch block  
    50.                    e.printStackTrace();  
    51.          }  
    52.          }  
    53.    
    54. }  

         注意,这个servlet文件需要两个jar包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar,我这两个jar包是用Struts2.2.1.1版本里面的。

     开始选择文件:

           点击上传按钮后,文件开始上传,由于本地上传速度那是相当的快,所以小文件只是片刻之间的事。上传中“浏览”按钮,“上传”按钮,“清空”按钮都置灰,而且进度条后的删除按钮也都不可见:

             上传完毕后这3个按钮恢复正常并且会提示你是否继续上传:

           好了,这就是这两天的劳动的成果,觉得好就支持我一下吧,第一次做这个还是蛮幸苦的。

  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/wwwroot/p/2721706.html
Copyright © 2011-2022 走看看