一.概述

Commons FileUpload软件包可以轻松地为您的servlet和Web应用程序添加强大的高性能文件上传功能。

FileUpload解析符合RFC 1867“HTML格式的文件上传”的HTTP请求 。也就是说,如果使用POST方法提交HTTP请求,并且内容类型为“multipart / form-data”,则FileUpload可以解析该请求,并以调用者轻松使用的方式使结果可用。

1.3版开始,FileUpload处理 RFC 2047编码的头值。

二.表单上传文件格式

向服务器发送多部分/表单数据请求的最简单的方法是通过Web表单,即

<form method="POST" enctype="multipart/form-data" action="">上传文件: <input type="file" name="upfile"><br/>上传文件备注: <input type="text" name="note"><br/><br/><input type="submit" value="Press"> 上传
</form>

三.DiskFileItemFactory

1. 默认的FileItemFactory实现,根据阈值判断是将上传的文件保存在内存还是缓存到本地磁盘
2. DiskFileItemFactory详见:DiskFileItemFactory简介
3. DiskFileFileItemFactory实例化
//为基于磁盘的文件项创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();// 缓存上传文件的本地文件夹路径
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository =(File)servletContext.getAttribute(“javax.servlet.context.tempdir”);
factory.setRepository(repository );

四.ServletFileUpload

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);// Parse the request
List<FileItem> items = upload.parseRequest(request);

五.处理解析出的item

解析完成后,您将有一个需要处理的文件item。在大多数情况下,您将需要处理与常规表单字段不同的文件上传,因此您可以像下列那样处理列表:
// Process the uploaded items
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {FileItem item = iter.next();if (item.isFormField()) {// item是表单字段processFormField(item);} else {// item是上传文件processUploadedFile(item);}
}

5.1 表单字段item

对于常规表单字段,您很可能只对该item的名称及其String值感兴趣。正如你所期望的,访问这些是非常简单的。
// Process a regular form field
if (item.isFormField()) {// item是表单字段String name = item.getFieldName();String value = item.getString();...
}

5.2 上传文件item

对于上传的文件,在处理内容之前,您可能需要了解几种不同的内容。以下是您可能感兴趣的一些方法的示例。
// Process a file upload
if (!item.isFormField()) {String fieldName = item.getFieldName();String fileName = item.getName();String contentType = item.getContentType();boolean isInMemory = item.isInMemory();long sizeInBytes = item.getSize();...
}

六.资源清理Resource cleanup

资源清理仅适用于使用 DiskFileItem。换句话说,只适用于上传文件在处理它们之前被写入临时文件。

如果不再使用这些临时文件,则会自动删除这些临时文件(更准确地说,如果相应的DiskFileItem实例 被垃圾回收,则可以通过org.apache.commons.io.FileCleanerTracker 类静默地创建这个临时文件,该类可以启动还原线程。

如果不再需要,这个收货人线程应该停止。在servlet环境中,这是通过使用一个名为FileCleanerCleanup的特殊servlet上下文监听器 完成的。为此,在web.xml中添加如下所示的部分:

<web-app>...<listener><listener-class>org.apache.commons.fileupload.servlet.FileCleanerCleanup</listener-class></listener>...
</web-app>

6.1 创建一个DiskFileItemFactory

FileCleanerCleanup提供了一个org.apache.commons.io.FileCleaningTracker的实例 。创建org.apache.commons.fileupload.disk.DiskFileItemFactory时必须使用此实例。这应该通过调用如下所示的方法来完成:
public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context, File repository) {FileCleaningTracker fileCleaningTracker  = FileCleanerCleanup.getFileCleaningTracker(context);DiskFileItemFactory factory  = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, repository);factory.setFileCleaningTracker(fileCleaningTracker);return factory;
}

6.2 禁用临时文件的清理

要禁用对临时文件的跟踪,可以将FileCleaningTracker设置 为null。因此,创建的文件将不再被跟踪。特别是,它们将不再被自动删除。

6.3 与病毒扫描器的互动

在与Web容器相同的系统上运行的病毒扫描程序可能会对使用FileUpload的应用程序造成一些意外的行为。本节介绍您可能遇到的一些行为,并提供了一些如何处理它们的想法。

FileUpload的默认实现将导致高于一定大小阈值的上传项目写入磁盘。一旦这样的文件关闭,系统上的任何病毒扫描程序将被唤醒并检查它,并可能隔离文件 - 也就是将其移动到不会导致问题的特殊位置。这当然对应用程序开发人员来说将是一个惊喜,因为上传的文件将不再可用于处理。另一方面,同一阈值以下的上传项目将被保存在内存中,因此病毒扫描程序将不会被看到。这允许以某种形式保留病毒的可能性(尽管如果将其写入磁盘,病毒扫描程序将定位并检查它)。

一个常用的解决方案是在系统上放置一个目录,其中将放置所有上传的文件,并配置病毒扫描程序以忽略该目录。这样可以确保文件不会被从应用程序中删除,但是后来将病毒扫描负责给应用程序开发人员。然后可以通过外部进程扫描上传的文件以进行病毒扫描,这可能会将干净或清除的文件移动到“已批准”位置,或者通过将病毒扫描程序集成到应用程序本身内。配置外部进程或将病毒扫描集成到应用程序中的细节不在本文档的范围之内。

七.看进度

如果您希望文件上传真的很大,那么向用户报告已经收到了多少。即使HTML页面允许通过返回多部分/替换响应或类似的方式来实现进度条。

观看上传进度可以通过提供进度侦听器来完成:

//Create a progress listener
ProgressListener progressListener = new ProgressListener(){public void update(long pBytesRead, long pContentLength, int pItems) {System.out.println("We are currently reading item " + pItems);if (pContentLength == -1) {System.out.println("So far, " + pBytesRead + " bytes have been read.");} else {System.out.println("So far, " + pBytesRead + " of " + pContentLength  + " bytes have been read.");}}
};
upload.setProgressListener(progressListener);

如果想实现自己的第一个进度监听器,就像上面那样。

它有一个缺陷:进度监听器被调用得很频繁。 
根据servlet引擎和其他环境工厂,进度监听器可能会被任何网络包调用! 换句话说,您的进度侦听器可能会成为性能问题! 典型的解决方案可能是减少进度侦听器的活动。 
例如,如果上传了兆字节数,才发送一条消息

commom fileupload简介相关推荐

  1. commom fileupload结构

    一.概述 文件上传是网站非常常用的功能,直接使用Servlet获取上传文件还得解析请求参数,比较麻烦,所以一般选择采用apache的开源工具,common-fileupload.这个jar包可以再ap ...

  2. java Apache Commons jar包简介

    一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI 说明 ...

  3. php 框架 laravel 简介

    目录 一.laravel简介 二.版本选择 三.laravel下载安装以及开发环境搭建 (一):环境搭建 (二):下载.安装及大致介绍 四.laravel路由 (一):简介 (二):路由学习 五.控制 ...

  4. (转)Apache Commons工具集简介

    (转)Apache Commons工具集简介 Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.我选了一些比较常用的项目做简单介绍.文中用了很多网上现成 ...

  5. java apache commons_Apache commons(Java常用工具包)简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  6. API Server简介

    一.API Server简介 1.1 API Server功能 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是 ...

  7. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  8. Docker学习(一)-----Docker简介与安装

    一.Docker介绍 1.1什么是docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植 ...

  9. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

最新文章

  1. 洛谷 P2888 [USACO07NOV]牛栏Cow Hurdles
  2. mybatis-plus 会自动增加 order by_python自动撸支付宝基金答题红包
  3. hive表ddl导出_Flink 1.11 与 Hive 批流一体数仓实践
  4. python读写excel模块pandas_如何用python pandas操作excel?
  5. hadoop的部署以及应用
  6. 洛谷 P2032 扫描
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_06-vuejs研究-vuejs基础-v-on指令...
  8. 因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配
  9. MATLAB代码:基于非对称纳什谈判的多微网电能共享运行优化策略
  10. Matlab用figure;subplot后合并子图
  11. 换工作的心路历程...吧
  12. 03-多线程下载网图
  13. 约瑟夫环:设编号为1,2,…n的n个人围坐一圈,约定标号为k的人从1考试报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止
  14. 【文献阅读笔记】CVX使用常用替换公式
  15. 【Codecs系列】X265编码器(七):多线程和wpp模块分析
  16. 闲来无事,过了三天“神雕侠侣”的生活
  17. 基金归因Brinson模型
  18. tiktok数据选品分析网站功能明细
  19. Hadoop个人心得笔记(一)
  20. B-树----(多插平衡树)

热门文章

  1. openwrt软路由重置firstboot重启reboot关机poweroff
  2. 备忘录怎么显示在电脑桌面上 可以将备忘内容显示到桌面的便签
  3. 2019年9月3日安卓凯立德全分辨率(路况)夏季版C3551-C7M24-3K21J25懒人包
  4. Brightcove任命Dan Freund为首席营收官
  5. QD75D2控制MR-J3-10A伺服电机
  6. 图像分割,语义分割,实例分割
  7. C# 改善程序的50种方法
  8. 国产分布式事务数据库在金融领域的实战经验
  9. linux subsystem,subsystem
  10. 计算机游戏比赛,计算机作品大赛优秀作品展示---数字动漫游戏栏目