java读取oracle大字段Blob实现jsp下载功能问题

齊麟 2010-08-31 09:39:45
请教:为什么我下载的文件的文件名不能够自定义,居然是我访问action或者jsp的路径呢?
我是读取oracle中的Blob字段在action或者jsp中利用输出流来实现下载的。但是貌似 response.setHeader( "Content-Disposition ","attachment;filename="+filename);这个方法没起作用。文件名传不过去,它默认是我的访问地址,例如,我调用downLoadExcel.action方法,下咋文件的名字会是downLoadExcel.action,当我的下载链接到downLoadExcel.jsp时,下载文件的名字居然是downLoadExcel.jsp。
代码如下:
<!-- 调用action的-->
<a href="javascript:void(0)" onclick="downLoad('${importCode}')">下载</a>
##########
javascript:
/**
* 下载Excel
* @param obj 日志文件的代码(根据日志文件代码查询日志文件信息 从而获取其中的Excel数据)
*/
function downLoad(obj){
window.location= "<%=path%>/maewdownLoadExcel.action?indexTypeName="+obj;//访问action中的downLoadExcel方法
}
###########
action:

/**
* 访问数据库获取日志信息,下载excel文件
*/
public void downLoadExcel(){
monitoringWarningService = (MonitoringWarningService) BeanManager.getBean("monitoringWarningService");//获取Service
indexTypeName = this.getIndexTypeName();//获取页面传来的日志的代码
UploadLogDTO logDTO = new UploadLogDTO();//创建日志DTO
logDTO.setStartRow(0);//因为sql中有分页查询的设定,避免出错这里也要写上
logDTO.setSize(10);
logDTO.setImportCode(indexTypeName);
logList = monitoringWarningService.queryUploadLog(logDTO);//根据日志代码查询日志信息
byte[] importFile = logList.get(0).getImportFile();//取得日志信息中存储的Excel文件信息(数据库中是Blob,DTO中为byte[])
String filename=logList.get(0).getImportFileName();//获取日志中存储的文件名称
HttpServletResponse response = (HttpServletResponse)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);//获取response对象
try {
response.reset();
response.setContentType( "application/octet-stream;charset=UTF-8");
response.setHeader( "Content-Disposition ","attachment;filename="+filename);
response.getOutputStream().write(importFile);
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
###########
###########
<!--转到jsp的 -->
<a href="<%=path %>/maew/monitor/maintainMaew/downLoadExcel.jsp?importCode=${importCode}">下载</a>
############
jsp:
<%
String importCode = request.getParameter("importCode");
MonitoringWarningService monitoringWarningService = (MonitoringWarningService) BeanManager.getBean("monitoringWarningService");//获取Service
UploadLogDTO logDTO = new UploadLogDTO();//创建日志DTO
logDTO.setStartRow(0);//因为sql中有分页查询的设定,避免出错这里也要写上
logDTO.setSize(10);
logDTO.setImportCode(importCode);
List<UploadLogDTO> logList = monitoringWarningService.queryUploadLog(logDTO);//根据日志代码查询日志信息
byte[] importFile = logList.get(0).getImportFile();//取得日志信息中存储的Excel文件信息(数据库中是Blob,DTO中为byte[])
String filename=logList.get(0).getImportFileName();
System.out.print(filename);
//HttpServletResponse response = (HttpServletResponse)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);//获取response对象
response.reset();
response.setContentType( "application/octet-stream;charset=UTF-8");
response.setHeader( "Content-Disposition ","attachment;filename="+filename);
OutputStream os = response.getOutputStream();
os.write(importFile);
os.close();
%>
...全文
568 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
齊麟 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
我也遇到相同的问题了,能详细说说怎么解决的吗?
[/Quote]
filename 在获取之后做一下转码。
filename = new String(filename.getBytes("GBK"),"ISO8859_1");
赌一把 2012-10-14
  • 打赏
  • 举报
回复
我也遇到相同的问题了,能详细说说怎么解决的吗?
齊麟 2010-08-31
  • 打赏
  • 举报
回复
嗯,这会明白了,无论是调用action下载,还是转向另一jsp下载,问题貌似都出在fileName中,不是我获取的数据有问题,而是在调用response.setHeader();方法时要解决中文乱码的问题。否则文件名不能传进去,并且变成了访问路径了。
齊麟 2010-08-31
  • 打赏
  • 举报
回复
额滴神啊,莫名其妙的好了,我啥都没做啊。这咋解释啊?晕撒~~~(貌似不用迅雷下载就行)
齊麟 2010-08-31
  • 打赏
  • 举报
回复
我获取的indexTypeName是日志的代码,查询出日志信息。filename为日志中存储的文件名称。都没错。
只是下载文件时 文件名称怎么会出现这种问题呢?
lili1117 2010-08-31
  • 打赏
  • 举报
回复
你debug一下 ,这样,我也看不出来是什么错,顺便输出一下indexTypeName ,filename,再看看。
liufeng0209 2010-08-31
  • 打赏
  • 举报
回复
在OutputStream os = response.getOutputStream();
前加一句:response.setContentType("application/x-download");//设定输出类型
试试
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧