文件下载
文件上传之后,需要进行文件下载。
被下载的资源必须放到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