我正在尝试从向用户发送一个文件。servlet运行一些标识测试(针对请求),然后向客户端发送一个文件。
这通常有效,但是现在我打开了TOMCAT服务器重定向到https,当我尝试访问servlet并从IE6或IE8下载文件时,它会失败,我得到了这个异常:
java.lang.IllegalStateException: Cannot forward after response has been committed(在localhost.log上)
和
ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error(在servlet日志中)
发送(简化)的代码:
private void sendFile(HttpServletResponse response, byte[] file, String clientFileName)
{
ServletOutputStream op = null;
setContentType(response);
response.setHeader("Content-Disposition", "attachment; filename=\"" + clientFileName + "\"");
// send byte array to output buffer.
op = response.getOutputStream();
// Content Length must be set after all processing done.
response.setContentLength((int) file.length);
op.write(file);
}这是从servlet发送文件的正确方式吗?最好的办法是什么?
谢谢!!
更新
在此链接中使用@BalusC停战中的代码:http://balusc.blogspot.com/2007/07/fileservlet.html
这让它起作用了。
在IE6-IE8中,由于过滤阶段的原因,Gmail在这些浏览器中增加了下载功能,所以在使用gmail时仍然不能工作。
更新2
问题似乎在于Gmail + 6-8。我假设gmail正在进行重定向(如果在单击邮件中的链接后查看页面上的url,这是非常明显的)。客户拉技术是我唯一的解决方案吗?
发布于 2011-04-28 15:30:00
解决问题的方法是“客户拉动”技术。通过向标头添加一个Refresh值,我们使浏览器请求文件。
这是我能想到的唯一解决方案,它克服了gmail在从电子邮件中按下链接时使用重定向的事实。
在代码中,我这样做了:
response.setHeader("Refresh", "3; URL=\"" + url.toString() + "\"");
forwardToJSP(request, response, "waitForBrowserRefreshPage.jsp");意思是-3秒后,向用户询问指定的url,然后将文件传递给客户端。forwardToJSP方法显示“您将很快被转发,这里有一个链接,如果它失败了”消息。
https://stackoverflow.com/questions/5805859
复制相似问题