• 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:a1.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     }
  • 相关阅读:
    再谈TextField
    IOS-TextField知多少
    leftBarButtonItems
    LeftBarButtonItems,定制导航栏返回按钮
    Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法 Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法
    Unrecognized Selector Sent to Instance问题之诱敌深入关门打狗解决办法
    UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
    Present ViewController,模态详解
    UILABEL AUTOLAYOUT自动换行 版本区别
    iOS自动布局解决警告Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
  • 原文地址:https://www.cnblogs.com/liuyangv/p/8298997.html
Copyright © 2020-2023  润新知