Flex 导出文件通用处理


  Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:639579773; mso-list-type:hybrid; mso-list-template-ids:1566471860 -1081732898 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:39.0pt; mso-level-number-position:left; margin-left:39.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:1687050570; mso-list-type:hybrid; mso-list-template-ids:790016134 667462054 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1); mso-level-tab-stop:0cm; mso-level-number-position:left; margin-left:0cm; text-indent:21.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->         本文所指Flex是指flex web应用。导出文件在web应用中是一个基本功能最常见的恐怕就是将表格数据导出成excel了。那么除了excel还有专用的表单数据等其它文件格式,本文介绍flex导出文件的通用处理方法。
  1、  约定
  1)    flex与java通讯使用blazeds;
  2)    使用java servlet进行文件流输出;
  3)    Java端有一方法String generateFile(),该方法会自动先调用generateStream方法得到文件流,然后根据文件流生成文件,并返回文件名称;
  4)    Java端有一方法protected OutputStream generateStream() throws Exception,开发人员需重写该方法用以导出文件的文件流生成;
  5)    java端有一个文件下载的servlet,/servlet/downloadServlet,需参数fileName、delete,分别表示文件名称和下载后是否在服务器删除副本。
  2、  如何实现?
  Flex导出文件通用方法很简单,需做2件事情。
  第一:flex发送生成文件指令
  调用java端方法生成文件,此处需要开发人员做的事情为根据实际情况实现自己的outputstream生成方法,产生出outputstream方法之后,调用generateFile方法,产生出文件并将文件名返回到flex前端。
  定义一个remoteobject,设置其destination、endpoint等属性,添加remoteobject的result事件处理。
  调用remoteobject. generateFile()方法,在其result事件中获取文件名称fileName。
  第二:flex发送文件下载指令
  Flex客户端在remoteobject的result事件中发送文件下载指令,进行文件下载、临时文件删除处理。
  利用URLRequest和navigateToURL进行文件下载,设置URLRequest的url为java 文件下载的servlet,并跟上参数fileName和delete,delete=true时,该文件下载完毕之后,删除服务器上的副本。代码如下:
  var urlRequest:URLRequest = new URLRequest(http://localhost:8080/app/servlet/ downloadServlet?fileName=2323230.xls&delete=true);
  navigateToURL(urlRequest);
  文件下载的servlet核心代码如下:
  public void service (HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
  String fileName = request.getParameter("fileName");
  String filePath   = uploadPath+fileName;
  //判断文件是否下载完成之后删除掉
  String deleteed = request.getParameter("delete");
  boolean isDelete = false;
  if(!StringUtil.isEmpty(deleteed) && "true".equalsIgnoreCase(deleteed.trim()))
  isDelete = true;
  //
  File f=null;
  FileInputStream fileIn = null;
  ServletOutputStream outputStream = null;
  try{
  f= new File(filePath);
  if(f.exists()){
  //设置输出格式,保存时的文件默认名称
  response.setContentType("APPLICATION/OCTET-STREAM" );
  response.setHeader("Content-Disposition","attachme nt; filename=\"" + fileName + "\"");
  //
  fileIn = new java.io.FileInputStream(f);
  outputStream = response.getOutputStream();
  int length = fileIn.available();
  byte buffer[]=new byte[length];
  while(length>0){
  fileIn.read(buffer);
  outputStream.write(buffer);
  length=fileIn.available();
  }
  }
  }catch(Exception e){
  e.printStackTrace();
  }finally{
  try{
  if(outputStream!=null)
  outputStream.close();
  }catch(Exception e1){}
  try{
  if(fileIn!=null)
  fileIn.close();
  }catch(Exception e2){}
  try{                                       if(f!=null && isDelete)                                                 f.delete();                              }catch(Exception e3){}                     }           }

猜你喜欢

转载自mar88mar.iteye.com/blog/1573635