flex多文件带进度条上传

简介:
 
 
这个我做的是弹出的TitleWindow
主页代码简单,就是一个按钮
<? xml  version ="1.0"  encoding ="utf-8" ?> 
< s:Application  xmlns:fx ="http://ns.adobe.com/mxml/2009"    
             xmlns:s ="library://ns.adobe.com/flex/spark"    
             xmlns:mx ="library://ns.adobe.com/flex/halo"  minWidth ="1024"  minHeight ="768" > 
   < s:layout > 
     < s:BasicLayout /> 
   </ s:layout > 
   < fx:Script > 
    <![CDATA[ 
      import com.lichen.component.upload; 
      import mx.managers.PopUpManager; 
      protected function button1_clickHandler(event:MouseEvent):void 
      { 
        var win:upload=upload(PopUpManager.createPopUp(this,upload,true)); 
        PopUpManager.centerPopUp(win); 
      } 
    ]]> 
   </ fx:Script > 
   < s:Button  x ="36"  y ="47"  label ="按钮"  click ="button1_clickHandler(event)" /> 
</ s:Application >
 
弹出的 TitleWindow是核心
<? xml  version ="1.0"  encoding ="utf-8" ?> 
< mx:TitleWindow  xmlns:fx ="http://ns.adobe.com/mxml/2009"  xmlns:s ="library://ns.adobe.com/flex/spark" xmlns:mx ="library://ns.adobe.com/flex/halo"     layout ="absolute"  title ="上传文件"  color ="#7dbded" 
         width ="609"  height ="460"  baseColor ="#E0ECFF"  borderColor ="#E0ECFF"  backgroundColor ="haloBlue"  backgroundAlpha ="0.1"  contentBackgroundAlpha ="0.1" 
         borderVisible ="true"  dropShadowVisible ="true"    
         showCloseButton ="true"  close ="PopUpManager.removePopUp(this)" 
          fontFamily ="Arial"  fontSize ="14"  fontWeight ="bold"  verticalAlign ="top"  initialize ="init();" > 
   < fx:Script > 
    <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.controls.Alert; 
      import mx.controls.ProgressBar; 
      import mx.managers.PopUpManager; 
        
      private var fileList:FileReferenceList = new FileReferenceList();  //多选文件的list 
      private var urlRequest:URLRequest = new URLRequest("http://192.168.1.205:9218/productshowshow/upload");    //处理文件上传的servlet 
      [Bindable] 
      public var selectedFiles: ArrayCollection = new ArrayCollection([]);    //多选的文件分离成文件数组 
      private var fileListSize:uint=1; 
      /** 
        * 初始化 
        */ 
      public function init():void{ 
        fileList.addEventListener(Event.SELECT,fileSelectHandler); 
      } 
      /** 
        *监听文件选择的处理函数 
        */ 
      private function fileSelectHandler(event: Event): void 
      { 
        if(fileList.fileList.length>10){ 
          Alert.show("一次最多只能上传10个文件"); 
        }else{ 
          for(var i:int=0;i < fileList.fileList.length;i++){ 
            var f:FileReference = FileReference(fileList.fileList[i]);    
            var obj:Object= new Object(); 
            obj.fileName = f.name; 
            obj.fileSize = f.size/1024; 
            obj.fileType = f.type; 
            obj.fileRefrence = f; 
            fileListSize+=f.size; 
            selectedFiles.addItem(obj); 
          } 
          if( fileListSize/(1024*1024) >100 ){ 
            selectedFiles.removeAll(); 
            Alert.show("文件总大小应小于100M"); 
          } 
        } 
//        for each (var file: FileReference in fileList.fileList) 
//        { 
//          selectedFiles.addItem(file); 
//        } 
      } 
      /** 
        * 点击"浏览"按钮-->选择文件 
        */ 
      protected function selectFile():void 
      { 
        //浏览文件,因为是FileReferenceList所以可以多选. 并用FileFilter过滤文件类型. 
        fileList.browse([new FileFilter("图片文件 (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg;*.jpeg;*.gif;*.png"),new FileFilter("所有文件 (*.*)","*.*")]); 
      } 
      /** 
        * 逐个上传文件 
        */ 
      private function uploadHandler(event:MouseEvent):void{ 
        var file:FileReference; 
        for(var i:int = 0 ;i < selectedFiles.length;i++){ 
          file = FileReference(selectedFiles[i].fileRefrence); 
          file.upload(urlRequest); 
        } 
      } 
      /** 
        * 上传一个文件,监听文件上传完成事件,递归调用. 
        */ 
      private function doSingleUploadFile():void{ 
        if(selectedFiles.length >10){ 
          selectedFiles.removeAll(); 
          Alert.show("一次最多只能上传10个文件"); 
        }else if( fileListSize/(1024*1024)>100 ){ 
          selectedFiles.removeAll(); 
          Alert.show("文件总大小应小于100M"); 
        }else{ 
          if (fileList.fileList.length > 0){ 
            var f: FileReference = fileList.fileList.shift() as FileReference; 
            f.addEventListener(Event.COMPLETE, doSingleUploadFileComplete); 
            f.upload(urlRequest); 
          } 
        } 
      } 
      /** 
        * 一个文件上传完成事件的处理函数,递归执行上传下一个文件. 
        */ 
      private function doSingleUploadFileComplete(event: Event):void{ 
        var file: FileReference = event.target as FileReference; 
        file.removeEventListener(Event.COMPLETE, doSingleUploadFileComplete); 
        doSingleUploadFile(); 
      } 
      public function removeFile(f: FileReference): void 
      { 
        var index: int = selectedFiles.getItemIndex(f); 
        if (index != -1) 
          selectedFiles.removeItemAt(index); 
      } 
        
    ]]> 
   </ fx:Script > 
   < fx:Declarations > 
    <!--  Place non-visual elements (e.g., services, value objects) here --> 
   </ fx:Declarations > 
   < mx:LinkButton  x ="10"  y ="23"  textRollOverColor ="purple"  textSelectedColor ="haloBlue"     label ="选择本地文件" cornerRadius ="7"  fontFamily ="中易宋体"  fontSize ="14"  fontWeight ="bold"  fontStyle ="normal"  textDecoration ="none"  textAlign ="center" 
              click ="selectFile()" /> 
   < mx:DataGrid  x ="12"  y ="50"  id ="dg"  width ="587"  height ="291"  color ="#7dbded"  contentBackgroundColor ="#E0ECFF"  baseColor ="#E0ECFF" 
         dataProvider ="{selectedFiles}" > 
     < mx:columns > 
       < mx:DataGridColumn  headerText ="文件名"  dataField ="fileName"  width ="150" /> 
       < mx:DataGridColumn  headerText ="大小(kb)"  dataField ="fileSize"  width ="100" /> 
       < mx:DataGridColumn  headerText ="类型"  dataField ="fileType"  width ="70" /> 
       < mx:DataGridColumn  headerText ="上传状态"  dataField =""    width="230" > 
         < mx:itemRenderer > 
           < fx:Component > 
             < mx:HBox  width ="130"  paddingLeft ="2"  horizontalGap ="2" > 
               < fx:Script > 
                <![CDATA[ 
                  override public function set data(value:Object):void{ 
                    super.data = value; 
                    data.fileRefrence.addEventListener(ProgressEvent.PROGRESS,progressHandler); 
                    data.fileRefrence.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini); 
                  } 
                    
                  private function progressHandler(event:ProgressEvent):void{ 
//                    progress.setProgress(event.bytesLoaded,data.fileRefrence.size); 
//                    Alert.show("hahah"); 
//                    progress.setProgress(event.bytesLoaded, event.bytesTotal); 
                    var procent:uint=event.bytesLoaded/event.bytesTotal*100; 
//                    progress.label=procent+"###"; 
//                    if(procent==100){ 
////                      progress.enabled=false; 
//                      progress.label="完成啦"; 
//                    } 
//                    data.fileRefrence.removeEventListener(ProgressEvent.PROGRESS,progressHandler); 
                  }    
                    
                  public function fini(event: DataEvent):void{ 
                    progress.visible=true; 
                    progress.label="完成"; 
                    data.fileRefrence.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini); 
                  } 
                ]]> 
               </ fx:Script > 
               < mx:ProgressBar  id ="progress"  width ="80%"    
                       minimum ="0"  maximum ="100"  source ="{data.fileRefrence}" 
                       labelPlacement ="center"  ><!-- 进度条显示文字    source="{data.fileRefrence}"    progress="progress.label='%3%%';"    label="%3%%"    --> 
               </ mx:ProgressBar > 
              <!--  取消按钮    source="{data.fileRefrence}" 
              <mx:LinkButton width="20" toolTip="取消上传" click="cancel()" 
              label="取消" icon="@Embed('image/cancel.png')"> 
              <fx:Script> 
              <![CDATA[ 
              private function cancel():void{ 
              data.fileRefrence.cancel(); 
              progress.label = "已取消"; 
              } 
              ]]> 
              </fx:Script> 
              </mx:LinkButton> 
              
--> 
         
              <!--  
              <mx:LinkButton width="20" click="deleteItem(event)"    
                         toolTip="从列表中删除" icon="@Embed('image/delete.png')"> 
                <fx:Script> 
                  <![CDATA[ 
                    import mx.collections.ArrayCollection; 
                     
                    private function deleteItem(event:MouseEvent):void { 
                        
                      var s:ArrayCollection= this.parentDocument.selectedFiles as ArrayCollection;    //取全局变量 
                      var index:int=s.getItemIndex(data); 
                      if (index != -1){ 
                        s.removeItemAt(index); 
                      } 
                    } 
                  ]]> 
                </fx:Script> 
              </mx:LinkButton> 
              
--> 
             </ mx:HBox > 
           </ fx:Component > 
         </ mx:itemRenderer > 
       </ mx:DataGridColumn > 
     </ mx:columns > 
   </ mx:DataGrid > 
   < s:Button  x ="523"  y ="373"  label ="上传"  id ="btn_upload"     lineHeight ="0"    
          click ="doSingleUploadFile();"  /> 
</ mx:TitleWindow > 
 
文件上传服务器端(Java)
package com.test; 

import java.io.File; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public  class UploadFile  extends HttpServlet {    
         private  static  final  long serialVersionUID = 5425836142860976977L; 

         /** *//**    
            * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.    
            * @param request servlet request    
            * @param response servlet response    
            */
    
          // 定义文件的上传路径    
          private String uploadPath = "d:\\";    
          // 限制文件的上传大小    
          private  int maxPostSize = 100 * 1024 * 1024;     //最大100M 
          public UploadFile() {    
                  super();    
         }    
          public  void destroy() {    
                  super.destroy();    
         }    
          protected  void processRequest(HttpServletRequest request, HttpServletResponse response)    
                          throws ServletException, IOException {    
                 System.out.println( "Access !");    
                 response.setContentType( "text/html;charset=UTF-8");    
                  //保存文件到服务器中    
                 DiskFileItemFactory factory =  new DiskFileItemFactory();    
                 factory.setSizeThreshold(4096);    
                 ServletFileUpload upload =  new ServletFileUpload(factory);    
                 upload.setHeaderEncoding( "utf-8"); 
                 upload.setSizeMax(maxPostSize);    
                  try {    
                        List fileItems = upload.parseRequest(request);    
                        Iterator iter = fileItems.iterator();    
                         while (iter.hasNext()) {    
                                FileItem item = (FileItem) iter.next();    
                                 if (!item.isFormField()) {    
                                        String name = item.getName(); 
                                        System.out.println(name);    
                                         try {    
                                                item.write( new File(uploadPath + name));    
                                                response.getWriter().write( "上传成功。"); 
                                        }  catch (Exception e) {    
                                                e.printStackTrace();    
                                                response.getWriter().write(e.getMessage()); 
                                        }    
                                }    
                        }    
                }  catch (FileUploadException e) {    
                        e.printStackTrace();    
                        response.getWriter().write(e.getMessage()); 
                        System.out.println(e.getMessage() +  "结束");    
                }    
        }    
         protected  void doGet(HttpServletRequest request, HttpServletResponse response)    
                         throws ServletException, IOException {    
                processRequest(request, response);    
        }    
         /** *//**    
         * Handles the HTTP <code>POST</code> method.    
         * @param request servlet request    
         * @param response servlet response    
         */
    
         protected  void doPost(HttpServletRequest request, HttpServletResponse response)    
                          throws ServletException, IOException {    
                 processRequest(request, response);    
         }    
          /** *//**    
            * Returns a short description of the servlet.    
            */
    
          public String getServletInfo() {    
                  return  "Short description";    
         }    
}     


 
由于itemRenderer的问题,文件删除和DataGrid的滚动造成进度条进度错乱的问题都没能解决.不是很满意,但至少实现了基本的多文件带进度条上传.


本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/238628,如需转载请自行联系原作者
相关文章
|
算法 测试技术 开发工具
m基于FPGA的2ASK调制解调系统verilog实现,包含testbench测试文件
m基于FPGA的2ASK调制解调系统verilog实现,包含testbench测试文件
435 0
|
数据可视化 搜索推荐 BI
哪些任务进度管理器值得推荐?几款工具使用测评
在快节奏的工作环境中,任务进度管理器成为提高效率和协作的关键工具。本文介绍了三款高效实用的管理软件:板栗看板、Trello 和 Asana。这些工具不仅帮助用户更好地规划和跟踪项目进度,还能确保任务按时完成。板栗看板以其直观的看板和灵活的自定义选项受到青睐;Trello 通过丰富的插件和跨平台支持,成为全球广泛使用的工具;Asana 则以强大的功能和灵活的工作流管理,适合大型企业和复杂项目的管理需求。用户可根据自身需求选择合适的工具,提高团队协作效率,达成项目目标。
|
机器学习/深度学习 存储 人工智能
算法金 | LSTM 原作者带队,一个强大的算法模型杀回来了
**摘要:** 本文介绍了LSTM(长短期记忆网络)的发展背景和重要性,以及其创始人Sepp Hochreiter新推出的xLSTM。LSTM是为解决传统RNN长期依赖问题而设计的,广泛应用于NLP和时间序列预测。文章详细阐述了LSTM的基本概念、核心原理、实现方法和实际应用案例,包括文本生成和时间序列预测。此外,还讨论了LSTM与Transformer的竞争格局。最后,鼓励读者深入学习和探索AI领域。
354 7
算法金 | LSTM 原作者带队,一个强大的算法模型杀回来了
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的图像识别技术:从理论到实践
【8月更文挑战第1天】在人工智能的广阔天地中,深度学习以其强大的数据处理能力成为图像识别领域的核心技术之一。本文将深入探讨深度学习在图像识别中的应用,通过一个实际案例展示如何利用Python和TensorFlow框架实现简单的图像分类模型。文章不仅解析了关键技术点,还提供了代码示例,帮助读者从理论走向实践。
428 6
|
人工智能 智能硬件
如何在一周内摸清一个行业:ChatGPT + 麦肯锡关键词分析法
如何在一周内摸清一个行业:ChatGPT + 麦肯锡关键词分析法
2530 0
如何在一周内摸清一个行业:ChatGPT + 麦肯锡关键词分析法
|
人工智能 自然语言处理 安全
无影上新,AI助手晓颖来了!
无影上新,AI助手晓颖来了!
688 2
|
存储 文字识别 搜索推荐
OCR是什么
【6月更文挑战第19天】OCR是什么
1608 4
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的水果销售系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的水果销售系统的详细设计和实现
192 0
|
定位技术
高分GF与环境HJ系列国产卫星遥感影像数据图像免费批量下载方法
高分GF与环境HJ系列国产卫星遥感影像数据图像免费批量下载方法
471 1
|
存储 安全
cookie、 localStorage的区别和特点
cookie、 localStorage的区别和特点
734 0