zoukankan      html  css  js  c++  java
  • apache_fileupload实现文件上传_上传多个文件

    1、导包

    核心类:

           DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。

           ServletFileUpload  - 文件上传的核心类,此类接收request,并解析reqeust。

    2、设置表单为post,且enctype为multipart/form-data,传递的是字节码

      //req.getParameter("txt");//返回的是null

    1 <form action='<c:url value="/UpLoad"></c:url>' method="post" enctype="multipart/form-data">
    2 File:<input type="file" name="file" /><br/>
    3 <input type="submit" value="上传" />
    4 </form>

    3、Demo    /Upload

     1 request.setCharacterEncoding("utf-8");
     2         //获取项目的绝对地址
     3         String filepath= getServletContext().getRealPath("/file");
     4         String fileTemp=getServletContext().getRealPath("/temp");
     5         //1、声明工厂类,用于在指定磁盘上设置一个临时目录
     6         /*
     7          * 第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K
     8          *                如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。
     9          *              如果一个文件大于10K,就需要将文件先保存到临时目录中去。
    10          * 第二个参数 File 是指临时目录位置
    11          * 或者无参函数
    12          * disk.setSizeThreshold(sizeThreshold);
    13          * disk.setRepository(repository)
    14          * */
    15         DiskFileItemFactory disk=new DiskFileItemFactory(1024*10, new File(fileTemp));
    16         //2、声明,接收上面的临时目录
    17         ServletFileUpload upload=new ServletFileUpload(disk);
    18         //3、解析request
    19         try {
    20             //存储文件信息
    21             List<Map<String, String>> imgs=new ArrayList<Map<String,String>>();
    22             
    23             List<FileItem> list=upload.parseRequest(request);
    24             //遍历多个上传文件,如果只有一个上传文件可以用list.get(0)获得
    25             for(FileItem item:list)
    26             {
    27                 Map<String, String> map=new HashMap<String, String>();
    28                 
    29                 String fileType= item.getContentType();
    30                 if(fileType.contains("image/"))
    31                 {
    32                     //获取文件名,如果是IE,getFieldName获得全路径D:/xx/xxx.jpg,如果是非IE,只获得文件名xxx.xx.jpg
    33 String fileName=item.getName(); 34 fileName=fileName.substring(fileName.lastIndexOf("\")+1); 35 //获取扩展名 36 String extName=fileName.substring(fileName.lastIndexOf(".")); 37 fileName=UUID.randomUUID().toString().replace("-", "")+extName; //组成新文件名 38 39 InputStream in= item.getInputStream(); 40 int size=in.available();//获取文件大小 41 FileUtils.copyInputStreamToFile(in, new File(filepath+"/"+fileName));//使用工具类copy文件到流中 42 43 map.put("name", fileName); 44 map.put("size", ""+size); 45 map.put("type",fileType); 46 47 imgs.add(map); 48 item.delete();//删除缓存中缓存 49 } 50 request.setAttribute("list", imgs); 51 request.getRequestDispatcher("/show.jsp").forward(request, response); 52 } 53 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 58 }

     如果form表单中有说明,由于表单的enctype在上传文件时必须设为multipart/form-data,这样的话req.getParameter("txt");//返回的是null

    我们可以通过item.isFormFielda(),进行判断,分类提取内容

    1 if(item.isFormField())//如果是text|checkbox|radio|select这个值就是true.
    2    {
    3      String fileName= item.getFieldName();//获取的是文本框的name值
    4      String value= item.getString("utf-8");//获取的是文本框的value值
    5      System.out.println(fileName+"=="+value);
    6    }
    7else {
        
        //保存文件
      }

    在上面有提到,保存文件时,如果文件较大,需要先保存为缓存,在写入到文件中保存,这里可以使用迭代器,提高性能,加快保存速度。

    但是这种方法也是有缺点的,由于交换可以在内存中进行,或者使用tomcat的内存分区,所以会比较的占用内存

    Demo:

     1 String filePath=getServletContext().getRealPath("/file");
     2         DiskFileItemFactory disk=new DiskFileItemFactory();
     3         disk.setRepository(new File(getServletContext().getRealPath("/temp")));
     4         try{
     5             ServletFileUpload up=new ServletFileUpload(disk);
     6             FileItemIterator it= up.getItemIterator(request);//返回迭代器
     7             while(it.hasNext()){
     8                 FileItemStream itemStream= it.next();
     9                 String fileName= itemStream.getName();
    10                 fileName=fileName.substring(fileName.lastIndexOf("\")+1);
    11                 InputStream in= itemStream.openStream();
    12                 FileUtils.copyInputStreamToFile(in, new File(filePath+"/"+fileName));
    13                 
    14             }

    我们知道,在上传的时候有些需要设置上传文件的大小,我们可以设置全部文件大小上传限制,或者设置单个文件的大小

    1 ServletFileUpload up=new ServletFileUpload(disk);
    2         //up.setSizeMax(1024*1024*100);//设置同时上传文件的总大小100M
    3         //up.setFileSizeMax(1024*1024*10);//设置每一个文件的最大值10M

    这里两个限制大小一般情况下不用同时限制

  • 相关阅读:
    《我想进大厂》之mysql夺命连环13问
    抽象数据类型的表示与实现
    数据结构两个层次——逻辑结构和存储结构
    单链表的两种构造函数
    使用malloc函数或new运算符为链表结点分配内存空间
    基于Vue全家桶开发的前端组件管理平台
    JS菱形镂空
    JS使用for循环实现九九乘法表数字颜色不同
    JS——个人所得税
    JAVA常见关键字
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4149802.html
Copyright © 2011-2022 走看看