Flex 导出文件通用处理

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} /* 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","attachment; 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){}

                   }

         }

你可能感兴趣的:(Flex 导出文件通用处理)