转: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();