一 javaweb总结--文件上传和下载( 三 )


针对上述提出的5点小细节问题进行改进之后 , 我们的文件上传功能就算是做得比较完善了 。
三、文件下载 3.1、列出提供下载的文件资源
我们要将Web应用系统中的文件资源提供给用户进行下载 , 首先我们要有一个页面列出上传文件目录下的所有文件 , 当用户点击文件下载超链接时就进行下载操作 , 编写一个 , 用于列出Web应用系统中所有下载文件 。
的代码如下:

一  javaweb总结--文件上传和下载

文章插图
package me.gacl.web.controller;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** @ClassName: ListFileServlet* @Description: 列出Web系统中所有下载文件* @author: 孤傲苍狼* @date: 2015-1-4 下午9:54:40**/ public class ListFileServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取上传文件的目录String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload");//存储要下载的文件名Map fileNameMap = new HashMap();//递归遍历filepath目录下的所有文件和目录 , 将文件的文件名存储到map集合中listfile(new File(uploadFilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录//将Map集合发送到listfile.jsp页面进行显示request.setAttribute("fileNameMap", fileNameMap);request.getRequestDispatcher("/listfile.jsp").forward(request, response);}/*** @Method: listfile* @Description: 递归遍历指定目录下的所有文件* @Anthor:孤傲苍狼* @param file 即代表一个文件 , 也代表一个文件目录* @param map 存储文件名的Map集合*/ public void listfile(File file,Map map){//如果file代表的不是一个文件 , 而是一个目录if(!file.isFile()){//列出该目录下的所有文件和目录File files[] = file.listFiles();//遍历files[]数组for(File f : files){//递归listfile(f,map);}}else{/*** 处理文件名 , 上传后的文件是以uuid_文件名的形式去重新命名的 , 去除文件名的uuid_部分file.getName().indexOf("_")检索字符串中第一次出现"_"字符的位置 , 如果文件名类似于:9349249849-88343-8344_阿_凡_达.avi那么file.getName().substring(file.getName().indexOf("_")+1)处理之后就可以得到阿_凡_达.avi部分*/String realName = file.getName().substring(file.getName().indexOf("_")+1);//file.getName()得到的是文件的原始名称 , 这个名称是唯一的 , 因此可以作为key , realName是处理过后的名称 , 有可能会重复map.put(file.getName(), realName);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}
这里简单说一下中方法 , 方法是用来列出目录下的所有文件的 , 方法内部用到了递归 , 在实际开发当中 , 我们肯定会在数据库创建一张表 , 里面会存储上传的文件名以及文件的具体存放目录 , 我们通过查询表就可以知道文件的具体存放目录 , 是不需要用到递归操作的 , 这个例子是因为没有使用数据库存储上传的文件名和文件的具体存放位置 , 而上传文件的存放位置又使用了散列算法打散存放 , 所以需要用到递归 , 在递归时 , 将获取到的文件名存放到从外面传递到方法里面的Map集合当中 , 这样就可以保证所有的文件都存放在同一个Map集合当中 。