文件上传下载

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:a1.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 }
View Code

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;  //upload23  upload35
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 }
View Code

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 }
View Code
原文地址:https://www.cnblogs.com/g177w/p/10112165.html