我在servlet中用如下设置输出word文档后,我发现response.sendRedirect("http://www.126.com");无效了。有什么解决办法么?我希望在导出Word文档后跳转到一个新页面中File file = new File(expfilepath);
FileInputStream is = new FileInputStream(file);
BufferedInputStream bis = null;BufferedOutputStream bos = null;// 保存本地文件名
int fileSize = (int) file.length();
String filename = URLEncoder.encode(expfilename, "UTF-8"); //中文文件名(乱码)转换   
// 设置下载文件使用的报头域
response.reset();
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment; filename="+ filename);
response.setContentLength(fileSize);
// 得到响应对象的输出流,用于向客户端输出二进制数据
ServletOutputStream sos = response.getOutputStream();
bis = new BufferedInputStream(is);bos = new BufferedOutputStream(response.getOutputStream());byte[] buff = new byte[2048];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead);
}bos.flush();
bos.close();
bis.close();//这里执行了但是没有效果
response.sendRedirect("http://www.126.com");

解决方案 »

  1.   

    在下载页面中使用window.location.href = "http://www.126.com";
      

  2.   

    简单的逻辑客户端发出一个请求,服务端给回一个响应。返回文件的数据流就是一个响应。而这个响应不是针对画面的,所以对正常画面的请求响应下载文件的话。一般会发生一个异常,有些许问题。一般都是在画面中新建一个servlet。这个servlet就是管下载文件的。画面点击下载请求时,设定个flg值。再次刷新画面时引用这个servlet。平时不引用就可以了。你的要求导出文档后迁移到新画面,我有两种理解。一种是后台数据流都已经发送完了,就迁移到新画面。另一种是客户端下载完了。迁移新画面。第一种状况最好是使用单独的servlet去下载文件。我的想法是,数据流发送完成后,更新数据库某些数据,说明已经完成某个任务。主画面定时自动检测这类数据。检测到完成了迁移到新画面。第二种状况只能是客户端画面处理,在画面的焦点移入事件中,根据某个flg值做是否迁移到新画面处理,这个flg值只在点击下载按钮之后负值。当然,这里面会有些问题,如果确认数据流正常传输。是否要判断用户是点下载了,还是取消了。先确认好逻辑,然后再去讨论技术实现。
      

  3.   

    经过我测试,是因为有了response.getOutputStream()这句以后,下面的response.sendRedirect("http://www.126.com")就失效了。
    可是response.getOutputStream()是向客户端输出word文档的必须语句,这样该如何进行页面跳转?(跳转页面的目的是刷新调用servlet的页面,以上代码是在一个servlet中执行的)
    或者能给我一个向客户端输出word文档后刷新调用页面的方式。谢谢
      

  4.   

    哥们我觉得你使用服务端的跳转就能解决你的问题,至于你那为啥会错误,我觉得吧,你没搞清楚request的生命周期,别生气只适合个人的看法,多去想想就ok了
      

  5.   

    直接向页面out就行了~~~然后会提示你的。。