我在另外一台机器上可以读取显示并可以下载,而在有的机器上报错:ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:387)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:370)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
at Servlet.WordFileServlet.doGet(WordFileServlet.java:69)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:764)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:129)
at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:570)
at org.apache.coyote.Response.doWrite(Response.java:560)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
... 19 more
搜索了很久,没得到很好解决!我的代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


//��word��blob������
byte[] buf = new byte[1024];
request.setCharacterEncoding("gbk");
int id = Integer.parseInt(request.getParameter("id"));
System.out.println(id);
    String sql = "select * from fileinfo where FileID=" + id;
    try {
    ResultSet rSet = new DB_Conn().executeQuery(sql);
    response.reset();
   
    if(rSet.next()){
    Blob blob = rSet.getBlob("FileContent");
    int size =(int)blob.length();
    InputStream in = blob.getBinaryStream();
    String filename = rSet.getString("FileName");
   
    response.setHeader("Content-Disposition", "attachement;filename="+filename);
    response.setContentType("application/msword;charset=GBK");
    ServletOutputStream outputStream = response.getOutputStream();
        int byteRead=0;
   
    while((byteRead=in.read(buf))!=-1){
    //outputStream.write(buf);
    outputStream.write(buf, 0, byteRead);
    }
    outputStream.flush();
    outputStream.close();
    }
       
        } catch (Exception e) {
        e.printStackTrace();
        } }

解决方案 »

  1.   

    把response.reset();去掉试试,这句一般在jsp用的多,因为jsp每个<%%>会生成空行,servlet一般没必要。
      

  2.   

    呵呵,blog要在事务里才能读取。我估计你的
    new DB_Conn().executeQuery(已经在执行完毕后,把连接给关闭了吧!事务也就没有了!
      

  3.   

    或者,你没有设置
    con.setAutoCommit(false); 
    启动事务
      

  4.   

    public static boolean getBlobFile(InputStream in,String sFullName) {

    File file = new File(sFullName);
    RandomAccessFile rFile = null;
    try {
    rFile = new RandomAccessFile(file, "rw");
    rFile.seek(0);
    byte bytes[] = new byte[1024];
    int ch = 0;
    while ((ch = in.read(bytes)) != -1)
    rFile.write(bytes, 0, ch);
    rFile.close();
    return true;
    } catch (Exception ex) {
    ex.printStackTrace();
    return false;
    }
    }给你个方法:
    in是库中取出的字节流,fullname是生成WORD文档保存的路径。