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();
%>
...全文
574 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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");//设定输出类型
试试

81,122

社区成员

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

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