JAVA文件上传 ServletFileUpLoad 实例

1.  jsp

 1 <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5 <title>文件上传</title>
 6 </head>
 7 <body>
 8     <form action="FileUploadServlet" method="post" enctype="multipart/form-data">
 9         用户名:<input type="text" name="name"><br>
10         文件1:<input type="file" name="f1"><br>
11         文件2:<input type="file" name="f2"><br>
12         <input type="submit" value="提交">
13     </form>
14     
15 </body>
16 </html>

2.  java  

文件上传的前提
 1.form表单的method必须是post
 2.form表单的enctype必须是multipart/form-data 以二进制字节流
 进行提交 传统接收参数的方式无效
 DiskFileItemFactory:环境
     void setSizeThreshold(int sizeThreshold)
     设置缓冲区大小,默认10KB 超出将使用临时文件上传
     void setRepository(File repository)
     设置临时文件路径
 ServletFileUpload:核心操作类
     public void setSizeMax(long sizeMax)设置总文件的大小
     public void setFileSizeMax(long fileSizeMax):设置单个文件的大小
     public List parseRequest(javax.servlet.http.HttpServletRequest req)
     解析请求正文内容
     public static boolean isMultipartContent(HttpServletRequest req)//判断enctype
 FileItem:输入域
     boolean  isFormField():判断是否是普通字段
     String getName():获取上传文件名
     String getFieldName():获取普通字段的字段名
     String getString():获取普通字段的值
     String getContentType() 获得文件类型
     InputStream  getInputStream()以流的形式返回上传文件的主体内容
     void  delete()删除临时文件
 文件上传中需要注意的问题
    1.保证安全 
        上传文件放在WEB-INF目录中
    2.中文乱码问题
        普通字段乱码
        String fieldValue = item.getString("GBK");
          文件名乱码
          request.setCharacterEncoding("GBK");
      3.重名文件覆盖
          1.UUID
          2.使用文件上传日期分类存储
          3.System.currentMillions()
      4.限制文件上传类型
         1.endsWith("")这种方式不可取
         2.判断其mime类型 getContentType()
      5.限制用户上传文件的大小
          1.限制单个上传文件的大小
          upload.setFileSizeMax(4*1024*1024);
          2.限制总文件大小
        upload.setSizeMax()
     6.临时文件
         item.delete();
     7.多个文件上传时,没有上传内容的问题
         if(fileName==null||"".equals(fileName.trim())){
                        continue;
        }
     8.上传进度检测
            upload.setProgressListener(new ProgressListener(){
                参数一:已上传的字节数
                参数二:总字节数
                参数三:第几项
                @Override
                public void update(long arg0, long arg1, int arg2) {
                    // TODO Auto-generated method stub
                    System.out.println(arg0+"  "+arg1+"  "+arg2);
                }
                
            });

 

  1 package cn.gs.ly;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.OutputStream;
  8 import java.util.List;
  9 
 10 import javax.servlet.ServletException;
 11 import javax.servlet.http.HttpServlet;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletResponse;
 14 
 15 import org.apache.commons.fileupload.FileItem;
 16 import org.apache.commons.fileupload.FileUploadException;
 17 import org.apache.commons.fileupload.ProgressListener;
 18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 20 
 21 
 22 public class FileUploadServlet extends HttpServlet {
 23     @Override
 24     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 25         try {
 26         //得到上传文件的保存目录。 将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
 27         String realPath = this.getServletContext().getRealPath("/upload");//  /WEB-INF/files
 28         System.out.println("文件存放位置:"+realPath);
 29         //设置临时目录。 上传文件大于缓冲区则先放于临时目录中
 30         String tempPath = "E:\\tempPath";
 31         System.out.println("临时文件存放位置:"+tempPath);
 32         
 33         
 34         //判断存放上传文件的目录是否存在(不存在则创建)
 35         File f = new File(realPath);
 36             if(!f.exists()&&!f.isDirectory()){
 37                 System.out.println("目录或文件不存在! 创建目标目录。");
 38                 f.mkdir();
 39             }
 40         //判断临时目录是否存在(不存在则创建)
 41         File f1 = new File(tempPath);
 42             if(!f1.isDirectory()){
 43                 System.out.println("临时文件目录不存在! 创建临时文件目录");
 44                 f1.mkdir();
 45             }
 46         
 47        /**
 48         * 使用Apache文件上传组件处理文件上传步骤:
 49         * 
 50         * */
 51         //1、设置环境:创建一个DiskFileItemFactory工厂    
 52         DiskFileItemFactory factory = new DiskFileItemFactory();
 53         
 54             //设置上传文件的临时目录
 55         factory.setRepository(f1); 
 56         
 57         //2、核心操作类:创建一个文件上传解析器。
 58         ServletFileUpload upload = new ServletFileUpload(factory);
 59             //解决上传"文件名"的中文乱码
 60         upload.setHeaderEncoding("UTF-8");
 61         
 62         //3、判断enctype:判断提交上来的数据是否是上传表单的数据
 63         if(!ServletFileUpload.isMultipartContent(req)){
 64             System.out.println("不是上传文件,终止");
 65              //按照传统方式获取数据
 66             return;
 67         }
 68         
 69         //==获取输入项==
 70 //            //限制单个上传文件大小(5M)
 71 //            upload.setFileSizeMax(1024*1024*4);
 72 //            //限制总上传文件大小(10M)
 73 //            upload.setSizeMax(1024*1024*6);
 74         
 75         //4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
 76             List<FileItem> items =upload.parseRequest(req);
 77             for(FileItem item:items){
 78                 //如果fileitem中封装的是普通输入项的数据(输出名、值)
 79                 if(item.isFormField()){
 80                     String filedName = item.getFieldName();//普通输入项数据的名
 81                     //解决普通输入项的数据的中文乱码问题
 82                     String filedValue = item.getString("UTF-8");//普通输入项的值
 83                     System.out.println("普通字段:"+filedName+"=="+filedValue);
 84                 }else{
 85                     //如果fileitem中封装的是上传文件,得到上传的文件名称,        
 86                     String fileName = item.getName();//上传文件的名
 87                     //多个文件上传输入框有空 的 异常处理
 88                     if(fileName==null||"".equals(fileName.trim())){  //去空格是否为空
 89                         continue;// 为空,跳过当次循环,  第一个没输入则跳过可以继续输入第二个
 90                     }
 91                     
 92                     //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
 93                     //处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
 94                     fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
 95                     //拼接上传路径。存放路径+上传的文件名
 96                     String filePath = realPath+"\\"+fileName;
 97                     //构建输入输出流
 98                     InputStream in = item.getInputStream(); //获取item中的上传文件的输入流 
 99                     OutputStream out = new FileOutputStream(filePath); //创建一个文件输出流
100                     
101                     //创建一个缓冲区
102                     byte b[] = new byte[1024];
103                     //判断输入流中的数据是否已经读完的标识
104                     int len = -1;
105                      //循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
106                     while((len=in.read(b))!=-1){  //没数据了返回-1
107                     //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
108                         out.write(b, 0, len);
109                     }
110                     //关闭流
111                     out.close();
112                     in.close();
113                     //删除临时文件
114                     try {
115                         Thread.sleep(3000);
116                     } catch (InterruptedException e) {
117                         e.printStackTrace();
118                     }
119                     item.delete();//删除处理文件上传时生成的临时文件
120                     System.out.println("文件上传成功");
121                 }    
122             }    
123         } catch (FileUploadException e) {
124             //e.printStackTrace();
125             throw new RuntimeException("服务器繁忙,文件上传失败");
126         }    
127     }
128     
129     @Override
130     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
131         this.doPost(req, resp);
132     }

 

posted @ 2018-01-16 21:52  Mr·Liu  阅读(27907)  评论(3编辑  收藏  举报