1、Base64Encoder 用法
1) Flex 前台编码,后台解码
//Flex 代码 前台编码
var ebt:ByteArray ; //你的值
var b64encoder:Base64Encoder = new Base64Encoder();
b64encoder.insertNewLines = false; //每隔76个字符插入指定字符使输出换行。
b64encoder.encodeBytes(ebt); //编码,并将结果添加到内部缓冲区
var strB:String = b64encoder.toString(); //获取 Base64 编码的字符串,该方法会同时清除缓冲区。
var url:String = "http://localhost:8080/bi/ljkTestServlet";
var request:URLRequest = request= new URLRequest(url);
var urlVariables:URLVariables=new URLVariables(); //该类可以在应用程序与服务器之间传输变量
urlVariables.username = "peipei";
urlVariables.password = "123456";
urlVariables.byteArray = strB;
request.data = urlVariables;
request.method = URLRequestMethod.POST;
try {
urlLoader.load(request);//开始发送请求
} catch (error:Error) {
trace(error);
}
//Java 后台代码
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
String username = request.getParameter("username");
String password = request.getParameter("password");
String byteArray = request.getParameter("byteArray");
BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(byteArray); //解码
File f = new File("d:\\book.txt");
if(f.exists()){
System.out.print("文件存在");
}else{
System.out.print("文件不存�在");
f.createNewFile();//不存在则创建
}
FileOutputStream output = new FileOutputStream(f);
try{
output.write(b);
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//Flex 代码
var exp:MecExporter = new MecExporter();
exp.charset="gbk";
// add MecGrid with sheetname
exp.AddDataGrid(mecex, "");//mecex 为 MecGrid 对象
// exporting to binary data
var ebt:ByteArray = exp.Export2BiffExcel();
//保存excel
var f:FileReference = new FileReference();
f.save(ebt,(this.title==""?"报表":this.title)+".xls");
3、flex java 整合导出文件,将生成的文件发送到前台 或 点击某按钮,弹出 打开/保存/取消窗口 来打开或保存文件 弹出窗口 如图:
关键在于:1)设置 response 的 contentType 。
2)flex 的 Http 请求方式。
逻辑:将前台生成的文件转为通用的 ByteArray ,以流的形式发送到后台,后台设置消息头为文件,再以流的形式返回到前台即可。
//前台Flex 代码
var exp:MecExporter = new MecExporter();
exp.charset="gbk";
// add MecGrid with sheetname
exp.AddDataGrid(mecex, "");//mecex 为 MecGrid 对象
// exporting to binary data
var ebt:ByteArray = exp.Export2BiffExcel();
var request:URLRequest = new URLRequest("/bi/servlet/ljkTestServlet");
request.method="POST";
request.data=ebt;
request.contentType = "application/octet-stream"; //这个很重要,设置成流数据
navigateToURL(request,"_blank"); //这个请求方式也很重要。因为要浏览器触发下载事件,所以就不用异步方式打开连接了
后台java代码
package hj.nerp.uic.servlet;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Decoder;
/**
* 下载 excel 文件。
*
* 文件数据是由 前台编码为 ByteArray 传输到后台来的。
*
* 注意:1)要想前台能弹出下载窗口,response的contentType 要正确设置。
*
* 2)中文文件名 需要进行一次编码,不然前台乱码。
*
* @author LJK
* @data 2013-07-19
*
*/
public class MecGridDownload extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String browserType = request.getHeader("user-agent");//浏览器类型
String excelName = request.getParameter("excelName");//文件名
String byteArray = request.getParameter("byteArray");//文件字节
if(excelName == null){
excelName = "报表";
}
if(byteArray == null){
throw new IOException("没有收到 表格数据");
}
BASE64Decoder base64d = new BASE64Decoder();
byte[] excelbyte = base64d.decodeBuffer(byteArray);
response.reset(); //清除下 response中的缓存信息
response.setContentType("application/vnd.ms-excel"); //内容是excel文件
response.setCharacterEncoding("utf-8");
//对文件名进行编码,否则乱码
String excelNameEncode = null;
if(browserType.toLowerCase().indexOf("chrome") != -1){
excelNameEncode = new String(excelName.getBytes("utf-8"), "ISO_8859_1");//Chrome
}else{
excelNameEncode = java.net.URLEncoder.encode(excelName, "UTF-8"); //IE8 OK 限制:不能大于16个中文字符。
}
response.setHeader("Content-Disposition","attachment;filename="+ excelNameEncode);
//读数据
OutputStream outputStream = response.getOutputStream();
outputStream.write(excelbyte);
outputStream.flush();
outputStream.close();
}
}