将请求消息实体中的每一个项目封装成单独的DiskFileItem (FileItem接口的实现) 对象的任务
由 org.apache.commons.fileupload.FileItemFactory 接口的默认实现 
org.apache.commons.fileupload.disk.DiskFileItemFactory 来完成。当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。

属性
1) public static final int DEFAULT_SIZE_THRESHOLD :将文件保存在内存还是磁盘临时文件夹的默认临界值,值为10240,即10kb。

2) private File repository:用于配置在创建文件项目时,当文件项目大于临界值时使用的临时文件夹,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir获取。如下代码:

System.getProperty("java.io.tmpdir");

3) private int sizeThreshold:用于保存将文件保存在内存还是磁盘临时文件夹的临界值

构造方法
1) public DiskFileItemFactory()

采用默认临界值和系统临时文件夹构造文件项工厂对象。

2) public DiskFileItemFactory(int sizeThreshold,File repository)

采用参数指定临界值和系统临时文件夹构造文件项工厂对象。

3) FileItem createItem() 
       根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。

4) void setSizeThreshold(int sizeThreshold)
        Apache文件上传组件在解析上传数据中的每个字段内容时,需要临时保存解析出的数据,以便在后面进行数据的进一步处理(保存在磁盘特定位置或插入数据库)。因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会抛出“java.lang.OutOfMemoryError”错误。如果上传的文件很大,例如800M的文件,在内存中将无法临时保存该文件内容,Apache文件上传组件转而采用临时文件来保存这些数据;但如果上传的文件很小,例如600个字节的文件,显然将其直接保存在内存中性能会更加好些。

setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值。

5) void setRepository(File repository)
        setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录。有一个对应的获得临时文件夹的 File getRespository() 方法。

注意:当从没有调用此方法设置临时文件存储目录时,默认采用系统默认的临时文件路径,可以通过系统属性 java.io.tmpdir 获取。如下代码:

System.getProperty("java.io.tmpdir");

Tomcat系统默认临时目录为“<tomcat安装目录>/temp/”。

使用Commons-Fileupload包进行大文件上传注意事项

项目中使用

commons-fileupload-1.2.1.jar

进行大文件上传。

测试了一把,效果很不错。

总结如下:

  1. 必须设置好上传文件的最大阀值

    final long MAX_SIZE = 10 * 1024 * 1024 * 1024;// 设置上传文件最大为 10G

  2. 必须设置文件上传服务器上的临时目录

    // 文件上传参数配置
    // 创建一个新的文件上传句柄  
    DiskFileItemFactory factory = new DiskFileItemFactory();  
    // 设置内存缓冲区,超过后写入临时文件
    factory.setSizeThreshold(4096);  
    // 设置上传到服务器上文件的临时存放目录 -- 非常重要,防止存放到系统盘造成系统盘空间不足
    factory.setRepository(new File("F:\\uploadFileTemp"));
    ServletFileUpload upload = new ServletFileUpload(factory);  
    upload.setHeaderEncoding("utf-8"); 
     
    // 设置单个文件的最大上传值
    upload.setSizeMax(MAX_SIZE);  // 文件上传上限10G

  3. 上传成功后一定要删除临时目录的临时文件

    fileItem.delete(); // 请务必调用,在文件上传结束后,删除临时目录的文件...

  4. 最好记录下文件从开始上传到上传结束的时间点,这个对今后文件上传时间的分析很有用

另外,因为Struts2的上传功能也引入了该包,但是却做了拦截器限制文件的最大上传大小为2M,可以通过修改它的配置文件动态更改上传文件的大小;而且,Struts会在文件上传成功后,帮你删除掉临时文件。

我这里使用的是Spring MVC,需要在上传类中指定最大上传文件大小,(这玩意一般不动态设置,最大上传文件大小一般是系统的标准,是让使用者遵循滴),而且必须在上传成功后删除临时文件。

DiskFileItemFactory类的使用相关推荐

  1. 文件上传: FileItem类、ServletFileUpload 类、DiskFileItemFactory类

    文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...

  2. commons-fileupload的ServletFileUpload类

    ServletFileUpload类 1.前言 在看本篇文章之前请你确保自己已经知道DiskFileItemFactory类的属性,作用以及其内部的一些常用方法.因为本篇的ServletFileUpl ...

  3. java.lang.ClassNotFoundException: org.apache.commons.fileupload.disk.DiskFileItemFactory

    您好,我是码农飞哥,感谢您阅读本文!本文主要介绍文件上传报的错 问题复现 [dispatcherServlet] in context with path [/coep-rest] threw exc ...

  4. FileItem类的使用

    文件上传: FileItem类.ServletFileUpload 类.DiskFileItemFactory类 文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输 ...

  5. fileitem方法_FileItem类的getContentType ()方法,用于获得上传文件的类型。_学小易找答案...

    [判断题]我们经常调用createItem()方法将请求消息实体创建成FileItem实例对象. [单选题]下面用于判断FileItem类对象封装的数据是否为普通文本表单字段的方法是() [单选题]关 ...

  6. java 文件上传 demo_java文件上传Demo

    说到文件上传我们要做到: 1.引入两个包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 2.将form改为上传文件模式:enctype=" ...

  7. Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?

    在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".) 为 http 协议添加了这个功能.客户端的 ...

  8. 十二、文件上传与下载

    一.如何实现文件上传 要实现Web开发中的文件上传功能,通常需完成两步操作:一是在Web页面中添加上传输入项,二是在Servlet中读取上传文件的数据,并保存到本地硬盘中. 由于大多数文件的上传都是通 ...

  9. java 中传输文件的代码_java文件上传Demo(必看篇)

    说到文件上传我们要做到: 1.引入两个包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 2.将form改为上传文件模式:enctype=" ...

最新文章

  1. java 调用mysql存储过程
  2. Java非线程安全问题的解决方法
  3. sqlserver启用xm_cmdshell
  4. 【AWSL】之Linux进程和计划任务管理(ps、top、pgrep、pstree、pkill、at、crontab)
  5. HBase总结(九)Bloom Filter概念和原理
  6. CSS3属性之圆角效果——border-radius属性
  7. 从头到尾再讲一遍ThreadLocal
  8. SSRF(服务端请求伪造)原理/防御
  9. VC++删除浮动工具条中“关闭”按钮
  10. 微信缓存dat怎么转图片_图片怎么转PDF?这个方法完美解决!
  11. MariaDB修改端口号
  12. 深入理解React、Redux
  13. google protobuf_websoket解析protobuf协议
  14. 线性代数 课堂笔记 +思维导图
  15. IDEA查看Java源码技巧
  16. 将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值。
  17. 『UVA 437』巴比伦塔
  18. 在GraphPad Prism Mac中处理多份文件
  19. 用计算机控制操作照相机,摄影教程:用电脑控制相机远程拍摄
  20. 有关swin transformer相对位置编码的理解:

热门文章

  1. java word转pdf_java里实现Word转PDF的几种方案
  2. java怎么让遮罩层下面滚动_vue项目弹出层后禁止body底层的滚动事件
  3. 机器人编程python代码_自己动手开发智能聊天机器人完全指南(附python完整源码)...
  4. 运用div css和java_如何将css应用于div模式
  5. vue中ast生成render
  6. 多段图的动态规划算法(C/C++)
  7. html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例
  8. 计算机循环语句for,计算机for循环语句相关知识.doc
  9. 服务器响应submit,任务操作:submitJob (REST)
  10. python微控制器编程从零开始 pdf_Python极客项目编程_(美)Mahesh Venkitachalam.pdf