DiskFileItemFactory 文件上传存储

来源:互联网 发布:sqlserver 按月统计 编辑:程序博客网 时间:2024/06/08 10:49

请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务

org.apache.commons.fileupload.FileItemFactory 接口的默认实现
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成
当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。

DiskFileItemFactory 主要的两个方法
(1)setSizeThreshold(int i) 设置内存临界值(默认位10240 10kb)
(2)setRepository(new File(“”)) 设置临时文件存储去(内存空间不足或者超出缓冲区大小时进行临时文件夹存储)

在不设置setSizeThreshold()情况下,在内存不溢出的情况下,上传文件超过1kb也会读入内存中
上面两种方法分别对应各自get方法进行参数获取

代码:

public void upload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, FileUploadException {//文件临时保存区String savePath = FileConfig.getUploadTempPath();File f1 = new File(savePath);System.out.println(savePath);if (!f1.exists()) {f1.mkdirs();}DiskFileItemFactory fac = new DiskFileItemFactory();//设置内存临界值为30kbfac.setSizeThreshold(30*1024);//超出临界值设置临时文件存储区  对过大文件不进行设置会影响系统运行效率fac.setRepository(new File("D:\\temp"));ServletFileUpload upload = new ServletFileUpload(fac);upload.setHeaderEncoding("utf-8");//设置单个文件上传最大限制 1Mupload.setFileSizeMax(1024*1024);//设置方法中整个request请求的最大限制  10Mupload.setSizeMax(1024*1024*1024);List fileList = null;try {//单文件上传list size为 3 分别有fieldName 为//Filename Filedata Upload 三个对象元素fileList = upload.parseRequest(request);} catch (FileUploadException ex) {return;}//迭代器遍历Iterator<FileItem> it = fileList.iterator();String name = "";String extName = "";while (it.hasNext()) {FileItem item = it.next();//判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段if (!item.isFormField()) {//getName方法用来获得文件上传字段中的文件名name = item.getName();if(CheckTheFile.isValidFileFormat(name)) {//返回文件大小long size = item.getSize();String type = item.getContentType();if (name == null || name.trim().equals("")) {continue;}//文件格式 .jpg              name=name.substring(name.lastIndexOf("."),name.length());name= getMonth() + new Date().getTime()+""+name;//最终文件存储路径File saveFile = new File(savePath +name);try {item.write(saveFile);break;} catch (Exception e) {e.printStackTrace();}}else{name = "1";}}}//response响应response.getWriter().print(name.trim());}

文件超出内存临界值时 临时文件夹存放的文件(下图为两次上传后的临时文件)

这里写图片描述

阅读全文
0 0
原创粉丝点击