当前位置: 代码迷 >> Java Web开发 >> Struts下使用type="stream"配置action,文件下载时报错getOutputStream() has already been called解决方案
  详细解决方案

Struts下使用type="stream"配置action,文件下载时报错getOutputStream() has already been called解决方案

热度:9858   发布时间:2016-04-10 22:49:29.0
Struts下使用type="stream"配置action,文件下载时报错getOutputStream() has already been called
Struts下使用type="stream"配置action,文件下载时报错getOutputStream() has already been called 
在网上找了一下解决办法
http://www.cnblogs.com/zenger1025/archive/2013/02/05/2893219.html
但是它这里使用的不是type="stream"配置action,所以他这里可以使用return null
但是我使用的是type="stream"配置action,所以不能return null
请问这样应该怎么解决呢?
或者如果说不用type="stream"配置action,那么应该怎么配置呢?html页面又如何实现呢?


以下是我的struts配置:
<action name="download" class="Actions.FileActions"> 
            <result name="success" type="stream"> 
                <param name="contentType">application/octet-stream</param> 
                <param name="contentDisposition">attachment;filename="${fileFileName}"</param> 
                <param name="inputName">downloadFile</param> 
                <param name="bufferSize">4096</param> 
            </result> 
            <result name="input">/index.jsp</result> 
        </action> 


action是这样写的:
public InputStream getDownloadFile() {  
// System.out.println("downloadfile...");
File_UploadDaoImpl uploadDaoIpml = null;
DownloadHistoryDaoImpl historyDaoImpl = null;
conn = DBCPpool.getConnection();
uploadDaoIpml = new File_UploadDaoImpl(conn);
historyDaoImpl = new DownloadHistoryDaoImpl(conn);
File_Upload file = null;
try {
file = uploadDaoIpml.selectFileById(Integer.parseInt(id));
fileFileName = file.getFileName() + file.getType();
fileFileName = new String(fileFileName.getBytes(),"iso8859-1");

//登记下载记录
//从session中获取当前用户
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");

DownloadHistory downHistory = new DownloadHistory();
downHistory.setUserName(user.getLoginName());
downHistory.setFileId(file.getId());
downHistory.setFileName(file.getFileName());
downHistory.setFileType(file.getType());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String downTime = sdf.format(new Date());
downHistory.setDownTime(downTime);

historyDaoImpl.addHistory(downHistory);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally{
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/* return ServletActionContext.getServletContext().getResourceAsStream(
            "/uploadFiles/" + file.getDepartment() + "/" + file.getFileName() + file.getType()); */ 
return ServletActionContext.getServletContext().getResourceAsStream(
            file.getFileDir() + "/" + file.getFileName() + file.getType());  


前台使用easyui框架编写,直接一个按钮连接到action下载,使用ajax提交
js代码:
//文件下载 
function downloadFlie(){
var rows = $("#dg").datagrid("getSelections");
if(rows.length <=0){
$.messager.alert("系统提示","请选择一个文件");
}else if(rows.length >1){
$.messager.alert("系统提示","每次只能下载一个文件");
}else{
document.getElementById("downId").value = rows[0].id;
document.downloadFM.submit();
}
}

HTML代码:
    <form id="downloadFM" name="downloadFM" action="download" method="post" style="display: none;">
     <input type="hidden" id="downId" name="id" />
    </form>



------解决方案--------------------
之前遇到过这个问题
------解决方案--------------------
楼主可以看看
http://blog.sina.com.cn/s/blog_8628ec660101ik1b.html
------解决方案--------------------
重复索引流问题。
楼主试的怎么样了
------解决方案--------------------
给你看我的方法吧。
xml文件和你是一样的。
<result name="success" type="stream">
    <param name="contentType">application/x-msdownload</param>  
    <param name="contentDisposition">attachment;filename="${fileName}"</param>  
    <param name="inputName">fileIO</param>  
  相关解决方案