flex 文件上传与下载

flex 文件上传功能:

为了方便使用,所以自己根据网上一些资料自己写了一个mxml组件:

upload.mxml

如图

代码:

 
 
  1. <mx:Button x="367" y="349"   label="浏览..." cornerRadius="7" click="selectFile()"/>   
  2.   <mx:DataGrid x="12" y="50" id="dg" width="587" height="291"  dataProvider="{selectedFiles}">   
  3.     <mx:columns>   
  4.       <mx:DataGridColumn headerText="文件名" dataField="FILENAME" width="250"/>   
  5.       <mx:DataGridColumn headerText="大小(KB)" dataField="FILESIZE" width="100"/>   
  6.       <mx:DataGridColumn headerText="类型" dataField="FILETYPE" width="70"/>   
  7.       <mx:DataGridColumn headerText="上传状态" dataField=""    width="200">   
  8.         <mx:itemRenderer>   
  9.           <mx:Component>   
  10.             <mx:HBox width="130" paddingLeft="2" horizontalGap="2" horizontalScrollPolicy="off" verticalScrollPolicy="off">   
  11.               <mx:Script>   
  12.                 <![CDATA[   
  13.                   override public function set data(value:Object):void{   
  14.                     super.data = value;   
  15.                     progress.setProgress(0,data.fileRefrence.size);  
  16.                     data.fileRefrence.addEventListener(ProgressEvent.PROGRESS,progressHandler);   
  17.                     data.fileRefrence.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini);  
  18.                     data.fileRefrence.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);  
  19.                     data.fileRefrence.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);  
  20.                   }   
  21.                       
  22.                   private function progressHandler(event:ProgressEvent):void{   
  23.                     progress.setProgress(event.bytesLoaded,data.fileRefrence.size);   
  24.                     progress.label="已上传:"+Math.round((event.bytesLoaded * 100 /data.fileRefrence.size))+"%";  
  25.                   }      
  26.                   private function ioErrorHandler(event:IOErrorEvent):void{  
  27.                     outerDocument.lbl_error.text=event.text;  
  28.                     data.fileRefrence.removeEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);  
  29.                   }  
  30.                   private function securityError(event:SecurityError):void{  
  31.                     outerDocument.lbl_error.text=event.message.toString();  
  32.                     data.fileRefrence.removeEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);  
  33.                   }  
  34.                       
  35.                   public function fini(event: DataEvent):void{  
  36.                    var retXml:XML=XML(event.data);  
  37.                    var retCode:int=int(retXml.retCode);  
  38.                    var retMsg:String=retXml.retMsg;  
  39.                    var serverDir:String=retXml.serverDir;  
  40.                    if(retCode==1){  
  41.                     data.STATUS=1;   
  42.                     data.FILEPATH=serverDir+outerDocument.relativePath+"/";  
  43.                     data.UPLOADDATE=outerDocument.df.format(new Date());  
  44.                     outerDocument.objMain.upLoadSucessFiles.addItem(data);  
  45.                      progress.label="完成";   
  46.                     }  
  47.                     else{  
  48.                      outerDocument.lbl_error.text=retMsg;  
  49.                     }  
  50.                     //移除监听  
  51.                     data.fileRefrence.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,fini);   
  52.                     data.fileRefrence.removeEventListener(ProgressEvent.PROGRESS,progressHandler);  
  53.                     //保存到数据库  
  54.                     outerDocument.doSave();  
  55.                   }   
  56.                 ]]>   
  57.               </mx:Script>   
  58.               <mx:ProgressBar id="progress" width="80%"      
  59.                       minimum="0" maximum="{data.fileRefrence.size}"  mode="manual"   
  60.                       labelPlacement="center" label="{data.READYWORD}">  
  61.               </mx:ProgressBar>   
  62.               <!-- 取消按钮-->   
  63.               <mx:LinkButton id="btncancel" width="20" toolTip="取消上传" click="cancel()"   
  64.               label="取消" icon="@Embed('style/assets/icons/cancel.png')">   
  65.               <mx:Script>   
  66.               <![CDATA[   
  67.               private function cancel():void{   
  68.               data.fileRefrence.cancel();   
  69.               progress.label = "已取消";   
  70.               outerDocument.doSave();  
  71.               }   
  72.               ]]>   
  73.               </mx:Script>   
  74.               </mx:LinkButton>   
  75.               <!-- 删除按钮-->  
  76.               <mx:LinkButton width="20" click="deleteItem(event)"  toolTip="从列表中删除" icon="@Embed('style/assets/icons/delete.png')">   
  77.                 <mx:Script>   
  78.                   <![CDATA[   
  79.                     import mx.collections.ArrayCollection;   
  80.                        
  81.                     private function deleteItem(event:MouseEvent):void {   
  82.                      var dg:Object = event.target.parent.outerDocument.dg;  
  83.             var dp:ArrayCollection = ArrayCollection(dg.dataProvider);  
  84.             var index:int = dp.getItemIndex(data);  
  85.             dp.removeItemAt(index);   
  86.             ArrayCollection(dg.dataProvider).refresh();  
  87.  
  88.                     }   
  89.                   ]]>   
  90.                 </mx:Script>   
  91.               </mx:LinkButton>   
  92.             </mx:HBox>   
  93.           </mx:Component>   
  94.         </mx:itemRenderer>   
  95.       </mx:DataGridColumn>   
  96.     </mx:columns>   
  97.   </mx:DataGrid>   
  98.   <mx:Label id="lbl_bytes" width="495" color="red" x="28" y="10" text="文件数为:{this.selectedFiles.length},总大小为:{(this.fileListSize/(1024*1024)).toFixed(2)}MB"/>  
  99.   <mx:Label id="lbl_error" width="567" color="red" x="10" y="381" text=""/>  
  100.   <mx:Button x="448" y="349" label="上传" cornerRadius="7" id="btn_upload" enabled="{this.selectedFiles.length>0}" click="checkFileExist();" />   
  101.   <mx:Button x="527" y="349" label="关闭" cornerRadius="7" click="closeWin();" />   
  102.  
  103.   /**   
  104.         * 上传一个文件,监听文件上传完成事件,递归调用.   
  105.         */   
  106.       private function doSingleUploadFile():void{   
  107.           if (fileList.fileList.length > 0){   
  108.             var f: FileReference = fileList.fileList.shift() as FileReference;   
  109.             f.addEventListener(Event.COMPLETE, doSingleUploadFileComplete);   
  110.             f.upload(new URLRequest(urlRequest));   
  111.           }  
  112.       }   
  113.       /**   
  114.         * 一个文件上传完成事件的处理函数,递归执行上传下一个文件.   
  115.         */   
  116.       private function doSingleUploadFileComplete(event: Event):void{   
  117.         var file: FileReference = event.target as FileReference;   
  118.         file.removeEventListener(Event.COMPLETE, doSingleUploadFileComplete);  
  119.         doSingleUploadFile();  
  120.       }   

涉及到的JAVA类有:

FileUploadAction.java//文件上传类

 

 
 
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.  
  12. import org.apache.commons.fileupload.FileItem;  
  13. import org.apache.commons.fileupload.FileUploadException;  
  14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  15. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  16.  
  17. import org.apache.struts.action.ActionForm;  
  18. import org.apache.struts.action.ActionForward;  
  19. import org.apache.struts.action.ActionMapping;  
  20. import org.apache.struts.actions.DispatchAction;  
  21.  
  22. import com.tydic.osgi.org.springframework.commons.SystemProperties;  
  23.  
  24. public class FileUploadAction extends HttpServlet {  
  25.  
  26.  // 定义文件的上传路径  
  27.  
  28.  private String uploadPath = "d:\\a\\";  
  29.  
  30.  // 限制文件的上传大小  
  31.  
  32.  private int maxPostSize = 100 * 1024 * 1024;  
  33.  
  34.  public FileUploadAction() {  
  35.   super();  
  36.  }  
  37.  public void destory(){  
  38.   super.destroy();  
  39.  }  
  40.    
  41.  protected void doGet(HttpServletRequest request, HttpServletResponse response)  
  42.     throws ServletException, IOException {  
  43.   doupload(request, response);  
  44.  }  
  45.    
  46.  protected void doPost(HttpServletRequest request, HttpServletResponse response)  
  47.      throws ServletException, IOException {  
  48.   doupload(request, response);  
  49.  }  
  50.  private String getClassSavePath(){  
  51.   String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";  
  52.   //String path_name = SystemProperties.getProperty("UPLOAD_PATH");  
  53.   return SavePath;  
  54.  }  
  55.  private String getServerPath(){  
  56.   String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";  
  57.   SavePath=SavePath.substring(0,SavePath.indexOf("BMP")+4);  
  58.   //String path_name = SystemProperties.getProperty("UPLOAD_PATH");  
  59.   return SavePath;  
  60.  }  
  61.  
  62.  public void doupload(HttpServletRequest request, HttpServletResponse response)  
  63.    throws ServletException, IOException {  
  64.   response.setContentType("text/html;charset=UTF-8");  
  65.     
  66.   System.out.println("Access !");  
  67.         response.setContentType("text/html;charset=UTF-8");  
  68.         request.setCharacterEncoding("utf-8");  
  69.         uploadPath = request.getParameter("txtFilePath");  
  70.         if("".equals(uploadPath)||null==uploadPath){  
  71.          response  
  72.    .getWriter()  
  73.    .print(  
  74.      "<?xml version=\"1.0\" encoding=\"utf-8\"?><retInfo><retCode>0</retCode><retMsg>上传路径为空</retMsg></retInfo>");  
  75.         }else{  
  76.          String retInfo="上传OK!";  
  77.          String retCode="1";  
  78.          String fileName = request.getParameter("fileName");  
  79.          String strDir=getClassSavePath()+uploadPath;  
  80.          String serverDir=getServerPath();  
  81.             //保存文件到服务器中  
  82.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  83.             factory.setSizeThreshold(4096);  
  84.             ServletFileUpload upload = new ServletFileUpload(factory);  
  85.             upload.setSizeMax(maxPostSize);  
  86.             try {  
  87.                 List fileItems = upload.parseRequest(request);  
  88.                 Iterator iter = fileItems.iterator();  
  89.                 while (iter.hasNext()) {  
  90.                  FileItem item = (FileItem) iter.next();  
  91.                     if (!item.isFormField()) {  
  92.                         String name = item.getName();  
  93.                         if(!("".equals(fileName))&&null!=fileName){  
  94.                          name = fileName;  
  95.                         }  
  96.                         try {  
  97.                          File dir=new File(strDir);  
  98.                          if(!dir.exists()||!dir.isDirectory())  
  99.                          {  
  100.                           dir.mkdir();  
  101.                          }  
  102.                             item.write(new File(strDir+"/" + name));//写入文件  
  103.                               
  104.                         } catch (Exception e) {  
  105.                             e.printStackTrace();  
  106.                             retCode="0";  
  107.                             retInfo=e.getMessage();  
  108.                             throw new IOException("文件上传失败");  
  109.                         }  
  110.                     }  
  111.                 }  
  112.             } catch (FileUploadException e) {  
  113.                 retCode="0";  
  114.                 retInfo=e.getMessage();  
  115.                 e.printStackTrace();  
  116.                 System.out.println(e.getMessage() + "结束");  
  117.             }  
  118.             response  
  119.       .getWriter()  
  120.       .print(  
  121.         "<?xml version=\"1.0\" encoding=\"utf-8\"?><retInfo><retCode>"+retCode+"</retCode><retMsg>"+retInfo+"</retMsg><serverDir>"+serverDir+"</serverDir></retInfo>");  
  122.         }  
  123.     
  124.  }  
  125. }  

文件下载有两种方式:

 

 
 
  1. <mx:DataGrid  height="99%" width="99%" dataProvider="{dgResult}">    
  2.    <mx:columns> 
  3.        <mx:DataGridColumn headerText="文件名" dataField="FILE_NAME" width="200" /> 
  4.        <mx:DataGridColumn headerText="大小(KB)" dataField="FILE_SIZE" width="70" /> 
  5.        <mx:DataGridColumn headerText="上传时间" dataField="STATE_DATE" width="120"/>    
  6.        <mx:DataGridColumn headerText="操作" width="80"> 
  7.         <mx:itemRenderer> 
  8.          <mx:Component> 
  9.           <mx:LinkButton label="下载" icon="{outerDocument.attachIcon}" click="outerDocument.downloadAttach(data)"/> 
  10.          </mx:Component> 
  11.         </mx:itemRenderer> 
  12.        </mx:DataGridColumn>      
  13.    </mx:columns>             
  14.   </mx:DataGrid>   
  15.  
  16. private var fileRef:FileReference;  
  17.  
  18.   public function downloadAttach(item:Object):void{  
  19.    //var str:String=item.FILE_PATH;  
  20.      
  21.    //方法一:弹出新容器用java类返回  
  22.    //var url:String=serverUrl+downloadAction+"?relPath="+str.substr(0,str.indexOf("/"))+"&filename="+item.FILE_NAME;  
  23.    //navigateToURL(new URLRequest(url), "_blank");  
  24.      
  25.    //方法二:用filerefernce  
  26.    var urlReq:String=serverUrl+item.FILE_PATH;  
  27.    fileRef.download(new URLRequest(urlReq));  
  28.   }  
  29.   private function initFile():void{  
  30.    fileRef = new FileReference();  
  31.          fileRef.addEventListener(Event.CANCEL, doEvent);  
  32.          fileRef.addEventListener(Event.COMPLETE, completeHandler);  
  33.          fileRef.addEventListener(Event.OPEN, doEvent);  
  34.          fileRef.addEventListener(Event.SELECT, doEvent);  
  35.          fileRef.addEventListener(HTTPStatusEvent.HTTP_STATUS, doEvent);  
  36.          fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  37.          fileRef.addEventListener(ProgressEvent.PROGRESS, processEvent);  
  38.          fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doEvent);  
  39.   }  
  40.   private function doEvent(evt:Event):void {  
  41.         // 取得当前FileReference的引用  
  42.         var fr:FileReference = evt.currentTarget as FileReference;  
  43.         trace("evt Type:"+evt.type+"evt"+evt.toString());  
  44.        }  
  45.        private function processEvent(event:ProgressEvent):void{  
  46.         dl_cancel.visible=true;  
  47.         mydlBar.maximum=event.bytesTotal;  
  48.         mydlBar.setProgress(event.bytesLoaded,event.bytesTotal);   
  49.            mydlBar.label="已下载:"+Math.round((event.bytesLoaded * 100 /event.bytesTotal))+"%";  
  50.        }  
  51.        private function cancelHandler():void{  
  52.         this.fileRef.cancel();  
  53.         dl_cancel.visible=false;  
  54.        }  
  55.        private function completeHandler(event:Event):void{  
  56.         mydlBar.label="已完成";  
  57.         dl_cancel.visible=false;  
  58.        }  
  59.        private function ioErrorHandler(event:IOErrorEvent):void{  
  60.          Alert.show(event.text);  
  61.        }  

文件下载的java类:

 

 
 
  1. FileDownloadAction.java //文件下载类  
  2.  
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7.  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.  
  13. public class FileDownloadAction extends HttpServlet {  
  14.  private static final long serialVersionUID = 1L;  
  15.  
  16.  protected void doPost(HttpServletRequest request,  
  17.    HttpServletResponse response) throws ServletException, IOException {  
  18.   String fileName = "";  
  19.   String relativePath="";  
  20.   if (null != request.getParameter("filename")) {  
  21.    fileName = request.getParameter("filename");  
  22.   }  
  23.   if (null != request.getParameter("relPath")) {  
  24.    relativePath=request.getParameter("relPath");  
  25.   }  
  26.   response.setContentType("application/x-msdownload");  
  27.   response.setHeader("Content-disposition""attachment;filename=" 
  28.     + fileName);  
  29.   if (!"".equals(fileName) && !"".equals(relativePath)) {  
  30.    String realPath=getClassSavePath()+relativePath+"/"+fileName;  
  31.    System.out.println("文件路径名:"+realPath);  
  32.    BufferedInputStream bis = null;  
  33.    BufferedOutputStream bos = null;  
  34.    try {  
  35.     bis = new BufferedInputStream(new FileInputStream(realPath));  
  36.     bos = new BufferedOutputStream(response.getOutputStream());  
  37.     byte[] buff = new byte[1024];  
  38.     int bytesRead;  
  39.     while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
  40.      bos.write(buff, 0, bytesRead);  
  41.     }  
  42.    } finally {  
  43.     if (null != bis)  
  44.      bis.close();  
  45.     if (null != bos)  
  46.      bos.close();  
  47.    }  
  48.   }  
  49.  
  50.  }  
  51.  private String getClassSavePath(){  
  52.   String SavePath=getClass().getClassLoader().getResource("/").getPath()+"../../";  
  53.   return SavePath;  
  54.  }  
  55.  protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  56.    throws ServletException, IOException {  
  57.   doPost(req, resp);  
  58.  }  
  59.  
  60. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值