文件下载

文件上传之后,需要进行文件下载。

被下载的资源必须放到WEB-INF目录下(只要用户不能通过浏览器直接访问就OK,放在数据库中也可以),然后通过Servlet完成下载。

在jsp页面中给出超链接,链接到 DownloadServlet,并提供要下载的文件名称。

然后DownloadServlet获取文件的真实路径,然后把文件写入到response.getOutputStream()中。

下载功能关键代码:

 1         //获得下载的文件名字
 2         String fileName = request.getParameter("fileName");
 3         //解决get方式中文乱码问题
 4         fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
 5         //获得文件的绝对路径
 6         String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/upload/");
 7         //创建文件对象
 8         File file = new File(realPath,fileName);
 9         if(!file.exists()){
10             response.getWriter().print("文件不存在。");
11             return;
12         }
13         //让浏览器弹出下载的对话框
14         response.addHeader("content-disposition", "attachment;filename="+fileName);
15         //将输入流拷贝到输出流中,并且把文件名字展示在对话框上
16         IOUtils.copy(new FileInputStream(file), response.getOutputStream());

具体案例:

1、浏览器通过url( http://localhost:8080/file_down/downlist )进行访问

  ListDownServlet部分关键代码:

 1         //定义存储文件名的集合
 2         List<String> fileNames = new ArrayList<String>();
 3         //获得存储文件的绝对目录
 4         String path = request.getSession().getServletContext().getRealPath("/WEB-INF/upload/");
 5         File file = new File(path);
 6         if(file.isDirectory()){
 7             File[] files = file.listFiles();
 8             for(File fi : files){
 9                 fileNames.add(fi.getName());
10             }
11         }
12         //把文件名集合放入request域中
13         request.setAttribute("downFiles", fileNames);
14         //转发到down.jsp页面
15         request.getRequestDispatcher("/down.jsp").forward(request, response);

  xml 配置:

  <servlet>
      <servlet-name>ListDownServlet</servlet-name>
      <servlet-class>com.shawn.controller.ListDownServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>ListDownServlet</servlet-name>
      <url-pattern>/downlist</url-pattern>
  </servlet-mapping>

  down.jsp 关键代码:

1       <h1>下载列表</h1>
2       <hr>
3       <c:forEach var="fileName" items="${requestScope.downFiles }">
4           <a href='down?fileName=<c:out value="${fileName }"></c:out>'><c:out value="${fileName }"></c:out></a><br>
5       </c:forEach>

  DownServlet上面已经有了,xml配置不再赘述。

  链接: https://pan.baidu.com/s/1dFGmOq1 密码: 8ec7

原文地址:https://www.cnblogs.com/ShawnYang/p/7647973.html