日期:2014-05-17  浏览次数:20825 次

java读取oracle大字段Blob实现jsp下载功能问题
请教:为什么我下载的文件的文件名不能够自定义,居然是我访问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();
%>

------解决方案--------------------
在OutputStream os = response.getOutputStream();
前加一句:response.setContentType("application/x-download");//设定输出类型 
试试
------解决方案-------------------