如何解决如何以“正确”的方式从servlet发送文件?
| 我正在尝试从http servlet向用户发送文件。 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 artice中的代码:
http://balusc.blogspot.com/2007/07/fileservlet.html
这使它起作用。
在Gmail上使用IE6-IE8时,仍然无法正常工作,因为在这些浏览器中,gmail会增加下载内容的过滤阶段。
更新2
问题似乎出在Gmail + Internet Explorer 6-8上。
我假设gmail正在进行重定向(如果您在单击邮件中的链接后查看页面上的网址,这实际上很明显)。
Client-Pull技术是我唯一的解决方案吗?
解决方法
解决该问题的方法是“ Client-Pull \”技术。
通过在标题中添加一个“ 3”值,我们使浏览器要求输入文件。
这是我能解决的唯一解决方案,它克服了在按电子邮件中的链接时gmail将使用重定向的事实。
在代码中,我这样做:
response.setHeader(\"Refresh\",\"3; URL=\\\"\" + url.toString() + \"\\\"\");
forwardToJSP(request,response,\"waitForBrowserRefreshPage.jsp\");
含义-3秒钟后,向用户询问指定的URL,该URL将依次将文件传递给客户端。
forwardToJSP
方法将显示一条消息“您将很快被转发,如果失败将显示链接”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。