CSDN没有高手吗?Tomcat406,通过servlet获取数据库中的Blob,返回给客户端出错!如果解决了400分全是你的!

redstarstar 2003-12-30 03:05:02
对于图片,TXT等IE可以显示的文件下载没有任何问题。
对于像Word,PDF等弹出保存窗口的文件则会出现如上的错误,但是通过FlashGet又可以下载。
不知道是什么原因。

错误信息:
2003-12-30 00:14:48 Connection reset by peer: socket write error
2003-12-30 00:14:50 Software caused connection abort: socket write error
部分代码:
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader("Expires",0);

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String sql = "select t.* " +
"from table_name " +
"where guid = '" + guid+ "' " +
"order by step desc";
final int BUFFER_SIZE = 8024;
try {
conn = Conn.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

if(rs.next()) {
Blob b = rs.getBlob("documentcontent");
if(b != null) {
String filename = rs.getString("documentfilename");
String contentType = (String)(MimeTypes.get(StringUtils.substringAfterLast(filename, ".").toLowerCase()));
if(contentType == null) {
contentType = "application/octet-stream";
}
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Disposition", "inline,filename=" + filename);
response.setHeader("Content-Length", String.valueOf(b.length()));
response.setHeader("Last-Modified", new java.util.Date().toString());
BufferedInputStream bis = new BufferedInputStream(b.getBinaryStream());
ServletOutputStream sos = response.getOutputStream();
byte buf[] = new byte[BUFFER_SIZE];
int c = 0;
while((c = bis.read(buf)) != -1) {
sos.write(buf, 0, c);
sos.flush();
}
bis.close();
sos.flush();
sos.close();
}
}
rs.close();
log.debug("下载文件结束");
}
catch(SQLException ex1) {
log.error("下载文件时错误。SQL="+sql, ex1);
throw new RuntimeException();
}
catch(IOException ex2) {
log.error("下载文件时错误。", ex2);
throw new RuntimeException();
}
finally {
if(stmt != null) { try { stmt.close(); } catch(Exception e){} }
if(conn != null) { try { conn.close(); } catch(Exception e){} }
}
...全文
58 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
youthy_yy 2004-01-12
  • 打赏
  • 举报
回复
mark
stonegump 2004-01-12
  • 打赏
  • 举报
回复
将ContentType设置为response.setContentType("application/x-msdownload");就行了。
baointoo1980 2003-12-30
  • 打赏
  • 举报
回复
response.setHeader("Content-Disposition", "inline,filename=" + filename);
楼主要所有的文件类型都在ie下打开吗?(不出下载对话框的那种),如果不是,可以不用inline
redstarstar 2003-12-30
  • 打赏
  • 举报
回复
:(
惨...
zdsxj2002 2003-12-30
  • 打赏
  • 举报
回复
和浏览器有关系。你可以用一下低版本的浏览器。或用另存为试一下。如果可以,那是浏览器的原因。
yugona 2003-12-30
  • 打赏
  • 举报
回复
不妨这样想

当用户点击连接于是开始了一个request,服务器在处理这个请求。当服务器处理还没完成的时候,你更改了“头信息contentType”,我们可以把这视为一个“重定向”,这时候服务器还想这向那个“contentType为text/html”输出数据,但是由于他不存在了,因而“socket write error”

这时候就抛出了这个错误。

我认为你不应该中途更改contentType,我真的回家了,88!

希望能对你有所帮助!

blue999star 2003-12-30
  • 打赏
  • 举报
回复
明天在看看。
楼主好运!!
redstarstar 2003-12-30
  • 打赏
  • 举报
回复
BUFFER_SIZE 改为16048和1都试了,还是不行。
blue999star 2003-12-30
  • 打赏
  • 举报
回复
用flashget和activeX控件下载都没有问题,他们用了一部分自己的东西,比如保存数据部分。他们用自己的机制缓存数据。
你试过改final int BUFFER_SIZE = 8024;吗?
101monster 2003-12-30
  • 打赏
  • 举报
回复
呵呵,学习!
redstarstar 2003-12-30
  • 打赏
  • 举报
回复
to zwxu(zwxu) :你的方法还是不行。
zwxu 2003-12-30
  • 打赏
  • 举报
回复
试试把response.setHeader("Content-Type", contentType);换上response.setContentType("*.*");看看行不行
zwxu 2003-12-30
  • 打赏
  • 举报
回复
图片,TXT等文件是可以通过流逐个读的,word活pdf等文件里面有自己嵌套的格式,用sos.write(buf, 0, c);直接写好像不行,可以读出word文件的长度,然后逐个读到byte[]数组里面
redstarstar 2003-12-30
  • 打赏
  • 举报
回复
单步调试过了,while((c = bis.read(buf)) != -1) 循环结束后程序就终止了。

感觉应该不是程序的问题,可能跟环境有关,因为相同的程序用flashget和activeX控件下载都没有问题。就是用IE不行。
blue999star 2003-12-30
  • 打赏
  • 举报
回复
socket write error
明显的就是write错误。
sos.write(buf, 0, c);
调试一下程序,不知道你用的是什么ide,启动debug,单步运行看看。
redstarstar 2003-12-30
  • 打赏
  • 举报
回复
怎么不清?
wzy9645 2003-12-30
  • 打赏
  • 举报
回复
问题不清

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧