<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <!-- /* 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;} --> <!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
本文所指 Flex 是指 flex web 应用。导出文件在 web 应用中是一个基本功能最常见的恐怕就是将表格数据导出成 excel 了。那么除了 excel 还有专用的表单数据等其它文件格式,本文介绍 flex 导出文件的通用处理方法。
<!-- [if !supportLists]-->1、 <!-- [endif]-->约定
<!-- [if !supportLists]-->1) <!-- [endif]-->flex 与 java 通讯使用 blazeds ;
<!-- [if !supportLists]-->2) <!-- [endif]-->使用 java servlet 进行文件流输出;
<!-- [if !supportLists]-->3) <!-- [endif]-->Java 端有一方法 String generateFile( ), 该方法会自动先调用 generateStream 方法得到文件流,然后根据文件流生成文件,并返回文件名称;
<!-- [if !supportLists]-->4) <!-- [endif]-->Java 端有一方法 protected OutputStream generateStream() throws Exception ,开发人员需重写该方法用以导出文件的文件流生成;
<!-- [if !supportLists]-->5) <!-- [endif]-->java 端有一个文件下载的 servlet , /servlet/downloadServlet ,需参数 fileName 、 delete ,分别表示文件名称和下载后是否在服务器删除副本。
<!-- [if !supportLists]-->2、 <!-- [endif]-->如何实现?
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){}
}
}