首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以“正确”的方式从servlet发送文件?

如何以“正确”的方式从servlet发送文件?
EN

Stack Overflow用户
提问于 2011-04-27 14:37:33
回答 1查看 14.7K关注 0票数 2

我正在尝试从向用户发送一个文件。servlet运行一些标识测试(针对请求),然后向客户端发送一个文件。

这通常有效,但是现在我打开了TOMCAT服务器重定向到https,当我尝试访问servlet并从IE6或IE8下载文件时,它会失败,我得到了这个异常:

代码语言:javascript
复制
java.lang.IllegalStateException: Cannot forward after response has been committed

(在localhost.log上)

代码语言:javascript
复制
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error

(在servlet日志中)

发送(简化)的代码:

代码语言:javascript
复制
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,这是非常明显的)。客户拉技术是我唯一的解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-28 15:30:00

解决问题的方法是“客户拉动”技术。通过向标头添加一个Refresh值,我们使浏览器请求文件。

这是我能想到的唯一解决方案,它克服了gmail在从电子邮件中按下链接时使用重定向的事实。

在代码中,我这样做了:

代码语言:javascript
复制
response.setHeader("Refresh", "3; URL=\"" + url.toString() + "\"");
forwardToJSP(request, response, "waitForBrowserRefreshPage.jsp");

意思是-3秒后,向用户询问指定的url,然后将文件传递给客户端。forwardToJSP方法显示“您将很快被转发,这里有一个链接,如果它失败了”消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5805859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档