文件上传下载
1.文件上传类
1 package com.java.ftp; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.File; 9 import java.io.FileOutputStream; 10 import java.io.InputStream; 11 import java.util.List; 12 import org.apache.commons.fileupload.FileItem; 13 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 14 import org.apache.commons.fileupload.servlet.ServletFileUpload; 15 16 public class UploadHandleServlet extends HttpServlet { 17 18 /** 19 * 20 */ 21 private static final long serialVersionUID = 1L; 22 23 public void doGet(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 26 String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); 27 File file = new File(savePath); 28 //判断上传文件的保存目录是否存在 29 if (!file.exists() && !file.isDirectory()) { 30 System.out.println(savePath+"目录不存在,需要创建"); 31 //创建目录 32 file.mkdir(); 33 } 34 //消息提示 35 String message = ""; 36 try{ 37 //使用Apache文件上传组件处理文件上传步骤: 38 //1、创建一个DiskFileItemFactory工厂 39 DiskFileItemFactory factory = new DiskFileItemFactory(); 40 //2、创建一个文件上传解析器 41 ServletFileUpload upload = new ServletFileUpload(factory); 42 //解决上传文件名的中文乱码 43 upload.setHeaderEncoding("UTF-8"); 44 //3、判断提交上来的数据是否是上传表单的数据 45 if(!ServletFileUpload.isMultipartContent(request)){ 46 //按照传统方式获取数据 47 return; 48 } 49 //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项 50 List<FileItem> list = upload.parseRequest(request); 51 for(FileItem item : list){ 52 //如果fileitem中封装的是普通输入项的数据 53 if(item.isFormField()){ 54 String name = item.getFieldName(); 55 //解决普通输入项的数据的中文乱码问题 56 String value = item.getString("UTF-8"); 57 //value = new String(value.getBytes("iso8859-1"),"UTF-8"); 58 System.out.println(name + "=" + value); 59 }else{//如果fileitem中封装的是上传文件 60 //得到上传的文件名称, 61 String filename = item.getName(); 62 System.out.println(filename); 63 if(filename==null || filename.trim().equals("")){ 64 continue; 65 } 66 //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt 67 //处理获取到的上传文件的文件名的路径部分,只保留文件名部分 68 filename = filename.substring(filename.lastIndexOf("\\")+1); 69 //获取item中的上传文件的输入流 70 InputStream in = item.getInputStream(); 71 //创建一个文件输出流 72 FileOutputStream out = new FileOutputStream(savePath + "\\" + filename); 73 //创建一个缓冲区 74 byte buffer[] = new byte[1024]; 75 //判断输入流中的数据是否已经读完的标识 76 int len = 0; 77 //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据 78 while((len=in.read(buffer))>0){ 79 //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中 80 out.write(buffer, 0, len); 81 } 82 //关闭输入流 83 in.close(); 84 //关闭输出流 85 out.close(); 86 //删除处理文件上传时生成的临时文件 87 item.delete(); 88 message = "文件上传成功!"; 89 } 90 } 91 }catch (Exception e) { 92 message= "文件上传失败!"; 93 e.printStackTrace(); 94 95 } 96 request.setAttribute("message",message); 97 request.getRequestDispatcher("/message.jsp").forward(request, response); 98 } 99 100 public void doPost(HttpServletRequest request, HttpServletResponse response) 101 throws ServletException, IOException { 102 103 doGet(request, response); 104 } 105 }
2.文件下载类
1 package com.java.ftp; 2 3 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.net.URLEncoder; 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 public class DownLoadServlet extends HttpServlet { 15 16 17 /** 18 * 19 */ 20 private static final long serialVersionUID = 1L; 21 22 public void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 //得到要下载的文件名 25 String fileName = request.getParameter("filename"); //23239283-92489-阿凡达.avi 26 fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8"); 27 //上传的文件都是保存在/WEB-INF/upload目录下的子目录当中 28 String fileSaveRootPath=this.getServletContext().getRealPath("/WEB-INF/upload"); 29 //通过文件名找出文件的所在目录 30 String path = findFileSavePathByFileName(fileName,fileSaveRootPath); 31 //得到要下载的文件 32 File file = new File(path); 33 //如果文件不存在 34 if(!file.exists()){ 35 request.setAttribute("message", "您要下载的资源已被删除!!"); 36 request.getRequestDispatcher("/message.jsp").forward(request, response); 37 return; 38 } 39 //处理文件名 40 String realname = fileName.substring(fileName.indexOf("_")+1); 41 //设置响应头,控制浏览器下载该文件 42 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8")); 43 //读取要下载的文件,保存到文件输入流 44 FileInputStream in = new FileInputStream(path); 45 //创建输出流 46 OutputStream out = response.getOutputStream(); 47 //创建缓冲区 48 byte buffer[] = new byte[1024]; 49 int len = 0; 50 //循环将输入流中的内容读取到缓冲区当中 51 while((len=in.read(buffer))>0){ 52 //输出缓冲区的内容到浏览器,实现文件下载 53 out.write(buffer, 0, len); 54 } 55 out.flush(); 56 //关闭文件输入流 57 in.close(); 58 //关闭输出流 59 out.close(); 60 } 61 62 63 public String findFileSavePathByFileName(String filename,String saveRootPath){ 64 /* int hashcode = filename.hashCode(); 65 int dir1 = hashcode&0xf; //0--15 66 int dir2 = (hashcode&0xf0)>>4; //0-15*/ 67 String dir = saveRootPath + "\\" + filename; //upload\2\3 upload\3\5 68 File file = new File(dir); 69 if(!file.exists()){ 70 //创建目录 71 file.mkdirs(); 72 } 73 return dir; 74 } 75 76 public void doPost(HttpServletRequest request, HttpServletResponse response) 77 throws ServletException, IOException { 78 doGet(request, response); 79 } 80 }
3.文件展示类
1 package com.java.ftp; 2 3 4 import java.io.File; 5 import java.io.IOException; 6 import java.io.PrintWriter; 7 import java.util.HashMap; 8 import java.util.Map; 9 import javax.servlet.ServletException; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 import net.sf.json.JSONObject; 15 public class ListFileServlet extends HttpServlet { 16 17 /** 18 * 19 */ 20 private static final long serialVersionUID = 1L; 21 22 public void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 //获取上传文件的目录 25 String uploadFilePath = this.getServletContext().getRealPath("/WEB-INF/upload"); 26 //存储要下载的文件名 27 Map<String,String> fileNameMap = new HashMap<String,String>(); 28 //递归遍历filepath目录下的所有文件和目录,将文件的文件名存储到map集合中 29 listfile(new File(uploadFilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录 30 //将Map集合发送到listfile.jsp页面进行显示 31 JSONObject json = JSONObject.fromObject(fileNameMap); 32 PrintWriter out = response.getWriter(); 33 out.write(json.toString()); 34 out.flush(); 35 out.close(); 36 //request.setAttribute("fileNameMap", fileNameMap); 37 //request.getRequestDispatcher("/listfile.jsp").forward(request, response); 38 } 39 40 public void listfile(File file,Map<String,String> map){ 41 //如果file代表的不是一个文件,而是一个目录 42 if(!file.isFile()){ 43 //列出该目录下的所有文件和目录 44 File files[] = file.listFiles(); 45 //遍历files[]数组 46 for(File f : files){ 47 //递归 48 listfile(f,map); 49 } 50 }else{ 51 String realName = file.getName().substring(file.getName().indexOf("_")+1); 52 //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复 53 map.put(file.getName(), realName); 54 } 55 } 56 57 public void doPost(HttpServletRequest request, HttpServletResponse response) 58 throws ServletException, IOException { 59 doGet(request, response); 60 } 61 }