• 文件上传下载


    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
  • 相关阅读:
    公司技术部与其他部门之间的那些事儿
    5万元百元大钞的"渣渣钱"重新拼接的软件方面的解决办法的思路。
    公司技术部门内部的发展变化过程。
    手机开发与360的那点事儿
    通用快排
    被中断的函数
    setjmp与longjmp
    setjmp在非主函数中调用
    array and structure
    check your input
  • 原文地址:https://www.cnblogs.com/g177w/p/10112165.html
Copyright © 2020-2023  润新知