转:Servlet下载

                // 获取文件对象  a#&你好_+ 这个文件名是为了测试文件名是否会特殊情况的乱码。
        File dfile = new File("C:\\QQDownload\\a#&你好_+.pdf");
        // 如果文件在服务器程序目录下,最好这样写:
             //File dfiled = new File(getServletContext().getRealPath("/down")+"shell.rar");
        
        //得到输入流
        FileInputStream in = new FileInputStream(dfile);
        //获取文件名字,并对其进行编码,如果不这样会出现中文乱码。至少用这种方式我暂时还没有出现过乱码
        String filename = dfile.getName();
        filename = new String(filename.getBytes(),"iso8859-1");
        
        //通过response对象获得输出流
        OutputStream out = response.getOutputStream();
        //
        response.setContentType("Application/Octet-stream;charset=utf-8");
        // 下载文件的名字通过这里设置
        response.addHeader("Content-Disposition", "attachment; filename="+filename);
        // 下面两句代码功能应该是一样的,都写上去会有异常,说重复设置响应头。
        // 但是只写第二句的时候用迅雷无法下载。而只写第一句文件可以下载,麻烦知道的朋友可以告诉我一下
        response.setContentLength((int) dfile.length());
//        //response.addHeader("Content-Length::", dfile.length() + "");
        
        // 下面是一个普通的流的复制 。。。忽略
        byte[] bs =new byte[1024];
        int len = 0;
        while((len =in.read(bs))!=-1){
            out.write(bs);
        }
        // 最后是流的关闭。
        out.close();
        in.close();

 

posted @ 2013-05-08 18:59  snailaj  阅读(108)  评论(0编辑  收藏  举报