Servlet文件的上传与下载详解

  @Override

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

  req.setCharacterEncoding("UTF-8"); // 防止乱码

  resp.setCharacterEncoding("UTF-8");

  //1.获取要下载的文件名路径名,并通过ServletContext读取读取文件

  String downloadFileName = "head.jpg"; // 我们这里写死了

  ServletContext servletContext = getServletContext();

  String savePath = servletContext.getRealPath("/WEB-INF/upload"); //以前上传文件保存的目录

  String downloadPath = savePath + File.separator + downloadFileName;

  //2.告诉客户端返回的类型

  String downloadType = servletContext.getMimeType(downloadPath); //获取要下载文件的类型 (这个是image/jpeg)

  resp.setContentType(downloadType); // (和要下载的类型一样)

  //3.告诉客户端收到的数据是用于下载的,不是直接显示在页面的

  // Content-Disposition表示收到的数据怎么处理,attachment表示附件下载使用,filename表示下载文件的名字

  // filename名可以不和本地的名字一样,当有中文时会乱码,因为http协议设置的的时候不支持中文,需要进行url编码

  /resp.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);

  resp.setHeader("Content-Disposition",

  "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));

  InputStream resourceAsStream = servletContext.getResourceAsStream(downloadPath);

  // getResourceAsStream() 传入文件路径,读取文件!!!!!!!!!!!!!

  // 4.commons-io-1.4.jar中有IOUtils我们可以直接用,不用自己read() write()了

  ServletOutputStream outputStream = resp.getOutputStream(); // 获取响应的输出流

  IOUtils.copy(resourceAsStream, outputStream);

  // 读取输入流的信息复制给输出流,输出给客户端,传入一个输入流和输出流 (字节字符流都行)

  }