博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
apache_fileupload实现文件上传_上传多个文件
阅读量:7217 次
发布时间:2019-06-29

本文共 3915 字,大约阅读时间需要 13 分钟。

1、导包

核心类:

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

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

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

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

1 
2 File:
3
4

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、解析request19         try {20             //存储文件信息21             List
> imgs=new ArrayList
>();22 23 List
list=upload.parseRequest(request);24 //遍历多个上传文件,如果只有一个上传文件可以用list.get(0)获得25 for(FileItem item:list)26 {27 Map
map=new HashMap
();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);//设置同时上传文件的总大小100M3         //up.setFileSizeMax(1024*1024*10);//设置每一个文件的最大值10M

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

 

转载于:https://www.cnblogs.com/liuwt365/p/4149802.html

你可能感兴趣的文章
MySQL 5.7中的更多改进,包括计算列
查看>>
书评与访谈:Scrum for Managers
查看>>
借助Unity AR Foundation构建跨平台AR应用
查看>>
《The Coaching Booster》问与答
查看>>
独立云计算服务商的多维实践之道:用户需求驱动变革
查看>>
JavaMail邮件发送不成功的那些坑人情况及分析说明
查看>>
GitHub Checks API帮助应用实现进一步的持续集成
查看>>
庖丁解牛迭代器,聊聊那些藏在幕后的秘密
查看>>
勇敢的交流者在敏捷组织中的重要性
查看>>
Android Pie提供了自适应供电、神经网络API 1.1等新特性
查看>>
蓝云公布2019云生态战略,如何解决企业上云关键问题?
查看>>
FaaS、PaaS和无服务器体系结构的优势
查看>>
Ceylon语言加入Eclipse基金会
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵
查看>>
网站真分页js代码该怎么写?
查看>>
教你五分钟入门使用html5 svg绘制图形
查看>>
vue-concise-slider vue滑动组件
查看>>
ElectronOCR:基于Electron+React+Tesseract的MACOS下的OCR工具
查看>>
Mysql 架构及优化之-定时计划任务
查看>>