代码生成文件输出到客户端进行上载或者打开操作
一:后台生成文件导出实现
Java中将生成的文件 如word excel 等文件不直接存储在磁盘上,以流的方式传送到浏览器,用户选择利用本机的相应阅读软件打开或者保存到磁盘。
得到的功能是点击一个按钮触发一个action,不存盘的情况下提供一个下载文件。
以Itext导出word为例子进行总结:
Struts action中的形式:
Document document = new Document(PageSize.A4.rotate()); //创建一个文档
ByteArrayOutputStream buffere= new ByteArrayOutputStream();//创建一个缓冲区 代替磁盘路径代表的存储空间
Try
{
//输入word文档 将文档输出到buffere中
//buffere 可以用new FileOutputStream(“"d:\\testWord.doc";”)代替 这样就将生成的word文档直接存储到指定磁盘空间上了
RtfWriter2 writer = RtfWriter2.getInstance(document, buffere);
document.open();//开始创建文档中的内容
}
catch(Exception){}
document.close();//文档内容创建完成
String filename1 = new String(("红包锦旗情况统计表").getBytes(), "ISO-8859-1") + ".doc";// 导出名字是默认的文件名
response.setContentType("application/vnd.ms-word");//标识输出的文件是什么类型的 excel:appilcation/vnd.ms-word
response.setHeader("Content-disposition", "attachment;filename="+ filename1);// 设置头信息
response.setContentLength(buffere.size());//设置文件的大小
ServletOutputStream out = response.getOutputStream();//获得流向浏览器的输出流
buffere.writeTo(out);//将缓冲区中的信息写入到输出流中 此时应该是浏览器弹出窗口提供“打开“或者“下载”
out.flush();//选择打开方式后,程序将流中的信息全部输出。
至此,文件的生成及输出到浏览器的功能就结束了。
JSP中的形式:
<%
String fileName = (String)request.getAttribute("fileName");
fileName = new String(fileName.getBytes(),"ISO-8859-1");
response.setContentType("application/doc");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "inline; filename=\""+fileName+"\"");
%>
和Action后台代码比较接近 jsp在内存中是被转化成servlet文件 信息处理完毕后会被解析为相应的格式输出 如html/doc、pdf等等格式 这个格式是由response.setContentType(“application/doc”);来设置,后面会提到。
宏观步骤:
1:创建文档文件
2:创建缓冲区
3:设置将生成的文档写入到指定的缓冲区中
4:开始创建文档 document.open
5:文档创建完成 document.close 此时文档已经写入到缓冲区中
6:设置文件类型 response.setContentType(“application/vnd.ms-word”);文件是否属于下载类型(html为非下载)这一步必须在第7步前。
7:设置浏览器输出的文件 文件名—设置文件头信息 response.setHeader(“Content-disposition”,”attachment;filename”+文件名) 文件以附件的形式下载或者打开
8:设置输出文件的大小 response.setContentLength(缓冲文件大小);
9:获取到servlet到浏览器的输出流 ServletOutputStream out=response.getOutputStream();
10:将缓冲区中的信息写入到输出流中 buffere.weiteTo(out);
11:将输出流中的信息输出 out.flush();
相关知识远离知道:
关于ByteArrayOutputStream :
ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:
ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayInputStream: 可以将字节数组转化为输入流
(1)Content-Type的作用
该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。
例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.
2)Content-Disposition 的作用
当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。