列出上传目录下的文件,提供下载
在讲解respose对象的时候已经讲解过文件下载了。这次我们就直接写一个小案例来巩固文件下载把。
- 上传目录下的文件有3个
分析
首先,要把目录下的文件都列出来。由于后面要根据文件名对文件进行下载,所以我们用一个Map集合来保存所有的文件
下载文件部分也很简单,根据文件名和上传文件位置找到对应的文件,对其进行读写,然后修改消息头实现下载就好了。
- 得到装载上传文件的路径,通过递归把所有的文件都查找出来(判断是否是文件就是递归出口),装载到Map集合中
- 将Map集合传到前台做展示
- 用户点击下载的时候,再根据原名来获取绝对路径
- 如果该资源是存在的,就允许用户下载
代码
- 将存放在WEB-INF/目录下的文件全部放在Map集合中
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到上传文件的目录 String filePath = this.getServletContext().getRealPath("/WEB-INF/uploadFile"); Map map = new HashMap(); //使用递归来得到所有的文件,并添加到Map集合中 getAllFiles(new File(filePath), map); request.setAttribute("map", map); request.getRequestDispatcher("/listFile.jsp").forward(request, response); } private void getAllFiles(File filePath, Map map) { //如果不是文件,那么它就是文件夹 if (!filePath.isFile()) { //列出文件夹下所有的文件(可能是文件,可能是文件夹) File[] files = filePath.listFiles(); for (File file : files) { //得到的文件(或者是文件夹)再对其进行判断 getAllFiles(file, map); } } else { //进入到else语句了,肯定是文件了 //得到文件名 String fileName = filePath.getName().substring(filePath.getName().lastIndexOf("_") + 1); //我们将文件全名作为key,文件名作为value保存在map集合中 map.put(filePath.getName(), fileName); } }
在JSP页面中显示可以下载的文件
<c:forEach items="${map}" var="me"> <c:url var="url" value="/DownFileServlet"> <c:param name="fileName" value="${me.key}"></c:param> </c:url> ${me.value}<a href="${url}">下载!</a><br> </c:forEach>
实现下载的Servlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //得到文件的全名 String fileName = request.getParameter("fileName"); //如果是中文数据,需要转码。 fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8"); //得到保存文件的位置 String path = this.getServletContext().getRealPath("/WEB-INF/uploadFile"); //文件是通过文件名进行hashCode打散保存的,通过文件名拿到文件绝对路径 String fileRealPath = makeFilePath(fileName, path); System.out.println(fileRealPath); //判断文件是否存在 File file = new File(fileRealPath); if (!file.exists()) { request.setAttribute("message", "您要下载的资源不存在了!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return ; } //存在 //读取该文件并把数据写给浏览器 FileInputStream inputStream = new FileInputStream(fileRealPath); byte[] bytes = new byte[1024]; int len = 0; while ((len = inputStream.read(bytes)) > 0) { response.getOutputStream().write(bytes, 0, len); } inputStream.close(); //设置消息头,告诉浏览器,这是下载的文件 String name = fileName.substring(fileName.lastIndexOf("_") + 1); response.setHeader("content-disposition","attachment;filename=" + URLEncoder.encode(name, "UTF-8")); } private String makeFilePath(String fileName, String path) { int hashCode = fileName.hashCode(); int dir1 = hashCode & 0xf; int dir2 = (hashCode & 0xf0) >> 4; String dir = path + "\\" + dir1 + "\\" + dir2 +"\\"+ fileName; return dir; }