servlet实现文件下载的原理很简单,从输入流读进来,写进输出流,这里的输出流当然就是response.getOutputStream();,而输入流是要下载的文件,不管这个文件放在哪里 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class FileDownloadServlet */ public class FileDownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public FileDownloadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedInputStream bis = null; BufferedOutputStream bos = null; try{ String fileName = request.getParameter("filename"); fileName = new String(fileName.getBytes("iso8859-1"), "gb2312"); response.setContentType("application/x-msdownload"); response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("gb2312"), "iso8859-1")); bis = new BufferedInputStream(new FileInputStream(new File("F://TDDOWNLOAD//" + fileName))); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; while(-1 != (bis.read(buff, 0, buff.length))) { bos.write(buff); bos.flush();//此处如果不用flush()方法则下载速度很慢,反之很快 } }catch(Exception e){ e.printStackTrace(); }finally{ if(bis != null){ bis.close(); } if(bos != null){ bos.close(); } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }