http://www.csdn.net/develop/read_article.asp?id=19064

解决方案 »

  1.   

    谢谢 leshui 的链接
    里面的下载程序我试了一下没有成功。
    我将下面的链接直接拖拽的网络蚂蚁里面,网络蚂蚁报错,说无效网络连接。
    <a href="./fileDownload.jsp">文件下载</a>
    // 一下是fileDownload.jsp文件内容<%@ page contentType="text/html; charset=gb2312" %>
    <%@ page import="java.io.*" %>
    <%
        String fileName = "Calculator.rar".toString();
        //读到流中
        InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar");
        //设置输出的格式
        response.reset();
        response.setContentType("bin");
        response.addHeader("Content-Disposition",
                           "attachment; filename=\"" + fileName + "\"");
        //循环取出流中的数据
        byte[] b = new byte[100];
        int len;
        while((len = inStream.read(b)) >0)
        response.getOutputStream().write(b,0,len);
        inStream.close();
    %>
      

  2.   

    // 上面写错了,改正
    String fileName = "resouce.rar".toString();
    InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar");
      

  3.   

    最好是所有些非文本的流,都用servlet实现.
    你蒋jsp代码移动到Servlet中应该就没有问题了.
    应为在下载之前,已经向客户端发送了一些文本的内容了.
    <%@ page contentType="text/html; charset=gb2312" %>
    <%@ page import="java.io.*" %> 
    应该会出现两个空行的.用servlet就没有问题了.
      

  4.   

    我按照z3h(zhaohonghui) 说的试了
    直接点击是可以下载的,但不能用网络蚂蚁下载
    谁能解决用网络蚂蚁下载的问题啊?import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.FileInputStream;public class FileDownload extends HttpServlet {    //Process the HTTP Get request
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {        String fileName = "resouce.rar";        //读到流中
            InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar");        //设置输出的格式
            response.reset();
            response.setContentType("bin");
            response.addHeader("Content-Disposition",
                    "attachment; filename=\"" + fileName + "\"");        //循环取出流中的数据
            byte[] b = new byte[10000];
            int len;
            while((len = inStream.read(b)) >0)
            response.getOutputStream().write(b,0,len);
            inStream.close();    }}
      

  5.   

    这里定义了最大容量
    byte[] b = new byte[10000];
    修改这个值就可以下载更大的文件
      

  6.   

    wujinpinga(滴水穿石):
    不是吧?我要下载六百兆的文件,岂不是要六百兆的内存?
      

  7.   

    大侠们!!!!!!救命啊!!!!!!!!!!!!!!!!!!!!!!<a href="http://localhost:7001/FileDownload?FilePath=./ziliao/&FileName=myfile.rar">下载文件</a>
    直接点击链接,是可以把文件下载下来的(中文文件名也是没问题的)。可是我用网络蚂蚁下载就不行,weblogic控制台就打出错误信息
    服务器是weblogic8.1,winXP(win2000上也是同样的错误)java.net.SocketException: Connection reset by peer: socket write error
            at java.net.SocketOutputStream.socketWrite0(Native Method)
            at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
            at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
            at weblogic.servlet.internal.ChunkUtils.writeChunkTransfer(ChunkUtils.java:250)
            at weblogic.servlet.internal.ChunkUtils.writeChunks(ChunkUtils.java:226)
            at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:296)
            at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:371)
            at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:241)
            at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:114)
            at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:171)
            at walkfish.web.servlet.FileDownload.downloadFiles(FileDownload.java:75)
            at walkfish.web.servlet.FileDownload.doPost(FileDownload.java:25)
            at walkfish.web.servlet.FileDownload.doGet(FileDownload.java:56)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
            at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
            at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)
            at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
            at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
            at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)
            at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)
            at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
            at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)下面是我的下载程序(servlet)
    import javax.servlet.SingleThreadModel;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.ServletException;
    import java.net.URLEncoder;
    import java.io.FileInputStream;
    import java.io.OutputStream;
    import java.io.IOException;
    import java.io.File;import walkfish.web.util.ServerGlobal;public class FileDownload
        extends HttpServlet
        implements SingleThreadModel {    private static final String CONTENT_TYPE = "text/html; charset=gb2312";
        private OutputStream outputStream = null;
        private File fileLoad = null;    public void doPost(HttpServletRequest request,HttpServletResponse response) {
            download();
        }    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            response.setContentType(CONTENT_TYPE);
            request.setCharacterEncoding("gb2312");        String strFileName = request.getParameter("FileName");
            String strFilePath = request.getParameter("FilePath");
            strFilePath = "d:/resource/" + strFilePath;        outputStream = response.getOutputStream();        response.setHeader("content-disposition",
                               "attachment; filename="
                                   + URLEncoder.encode(strFileName, "UTF-8"));
            response.setContentType("application/x-tar");        try {
                fileLoad = new File(strFilePath + strFileName);
                response.setHeader("Content_Length", 
                                   String.valueOf(fileLoad.length()));
            }
            catch(Exception e){
                e.printStackTrace();
                return;
            }        doPost(request,response);
        }    private void download() {        byte[] bt = new byte[1024];
            FileInputStream inputStream = null;
            try {
                inputStream = new FileInputStream(fileLoad);
            }
            catch (IOException e) {
                e.printStackTrace();
                return;
            }        int iRead = 0;
            try {
                iRead = inputStream.read(bt);
                while (iRead != -1) {
                    outputStream.write(bt, 0, iRead);  // 错误是从这里抛出的
                    iRead = inputStream.read(bt);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }        try {
                outputStream.close();
                inputStream.close();
            }
            catch (IOException e) {
                e.printStackTrace();
                return;
            }    }}
      

  8.   

    outputStream.write(bt, 0, iRead);  // 错误是从这里抛出的
    后面加一句试试
    outputStream.flush();
      

  9.   

    wuyg(平平) 
    我试了
    我在 outputStream.write(bt, 0, iRead);  
    这句前面加上了System.out.print(iRead + "\t");
    这句后面加上了outputStream.flush();测试发现,如果没有flush(),循环能走12次
    有flush(),循环只走了一次
    抛出同样的异常