org.apache.commons.fileupload.DiskFileUpload
1.setSizeMax方法
setSizeMax方法用于设置请求消息实体内容的最大允许大小,以防止客户端故意通过上传特大的文件来塞满服务器端的存储空间,单位为字节。 2.setSizeThreshold方法 限的(笔者测试不大于100M),超出限制时将会发生“java.lang.OutOfMemoryError”错误,如果上传的文件很大,例如上传800M的文件,在 内存中将无法保存该文件内容,Apache文件上传组件将用临时文件来保存这些数据;但如果上传的文件很小,例如上传600个字节的文件,显然 将其直接保存在内存中更加有效。setSizeThreshold方法用于设置是否使用临时文件保存解析出的数据的那个临界值,该方法传入的参数的单。 3. setRepositoryPath方法 “<tomcat安装目录>/temp/”目录。 4. parseRequest方法 “multipart/form-data”,该方法将抛出FileUploadException异常。parseRequest 方法解析出FORM表单中的每个字段的数据,并将它们分别 包装成独立的FileItem对象,然后将这些FileItem对象加入进一个List类型的集合对象中返回。parseRequest 方法的完整语法定义如下: isMultipartContent方法是一个静态方法,不用创建DiskFileUpload类的实例对象即可被调用,其完整语法定义如下: 文件路径名等信息,如后面的图1.3所示。不管FORM表单采用的是“application/x-www-form-urlencoded”编码,还是“multipart/form-data ”编码,它们仅仅是将各个FORM表单字段元素内容组织到一起的一种格式,而这些内容又是由某种字符集编码来表示的。关于浏览器采用何种 字符集来编码FORM表单字段中的内容,请参看笔者编著的《深入体验java Web开发内幕——核心基础》一书中的第6.9.2的讲解, “multipart/form-data”类型的表单为表单字段内容选择字符集编码的原理和方式与“application/x-www-form-urlencoded”类型的表单是 相同的。FORM表单中填写的文本内容和文件上传字段中的文件路径名在内存中就是它们的某种字符集编码的字节数组形式,Apache文件上传组 件在读取这些内容时,必须知道它们所采用的字符集编码,才能将它们转换成正确的字符文本返回。 法用于设置转换时所使用的字符集编码,其原理与笔者编著的《深入体验java Web开发内幕——核心基础》一书中的第6.9.4节讲解的 ServletRequest.setCharacterEncoding方法相同。setHeaderEncoding 方法的完整语法定义如下: 段元素的数据。FileItem是一个接口,在应用程序中使用的实际上是该接口一个实现类,该实现类的名称并不重要,程序可以采用FileItem接 口类型来对它进行引用和访问,为了便于讲解,这里将FileItem实现类称之为FileItem类。FileItem类还实现了Serializable接口,以支持序 列化操作。 界线间的内容称为一个分区,每个分区中的内容可以被看作两部分,一部分是对表单字段元素进行描述的描述头,另外一部是表单字段元素的 主体内容,如图1.3所示。 象,它内部用了两个成员变量来分别存储描述头和主体内容,其中保存主体内容的变量是一个输出流类型的对象。当主体内容的大小小于 DiskFileUpload.setSizeThreshold方法设置的临界值大小时,这个流对象关联到一片内存,主体内容将会被保存在内存中。当主体内容的数据 超过DiskFileUpload.setSizeThreshold方法设置的临界值大小时,这个流对象关联到硬盘上的一个临时文件,主体内容将被保存到该临时文件 中。临时文件的存储目录由DiskFileUpload.setRepositoryPath方法设置,临时文件名的格式为“upload_00000005(八位或八位以上的数字) .tmp”这种形式,FileItem类内部提供了维护临时文件名中的数值不重复的机制,以保证了临时文件名的唯一性。当应用程序将主体内容保存 到一个指定的文件中时,或者在FileItem对象被垃圾回收器回收时,或者Java虚拟机结束时,Apache文件上传组件都会尝试删除临时文件,以 尽量保证临时文件能被及时清除。 true,否则返回false。该方法的完整语法定义如下: 如果FileItem类对象对应的是普通表单字段,getName方法将返回null。即使用户没有通过网页表单中的文件字段传递任何文件,但只要设置了 文件表单字段的name属性,浏览器也会将文件字段的信息传递给服务器,只是文件名和文件内容部分都为空,但这个表单字段仍然对应一个 FileItem对象,此时,getName方法返回结果为空字符串"",读者在调用Apache文件上传组件时要注意考虑这个情况。getName方法的完整语法 定义如下: 文件的名称部分。 。getFieldName方法的完整语法定义如下: 顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文 件系统中。其完整语法定义如下: 素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称。 “image/gif”,即“Content-Type”字段的值部分。如果FileItem类对象对应的是普通表单字段,该方法将返回null。getContentType 方法 的完整语法定义如下: false。其完整语法定义如下: 使用了多种方式来尽量及时清理临时文件,但系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。在有些情况下,可以调用 这个方法来及时删除临时文件。其完整语法定义如下: 了四个异常类,其中FileUploadException是其他异常类的父类,其他几个类只是被间接调用的底层类,对于Apache组件调用人员来说,只需对 FileUploadException异常类进行捕获和处理即可。 1.2.5 文件上传编程实例 表单,表单的enctype属性设置值为“multipart/form-data”,表单的action属性设置为“servlet/UploadServlet”。 <html> (2)在<tomcat的安装目录>/webapps/fileupload/src目录中按例程1-2创建一个名为UploadServlet.java的Servlet程序,UploadServlet.java 调用Apache文件上传组件来处理FORM表单提交的文件内容和普通字段数据。 import java.io.*; public class UploadServlet extends HttpServlet //设置保存上传文件的目录 if (!DiskFileUpload.isMultipartContent(request)) DiskFileUpload fu = new DiskFileUpload(); //得到所有表单字段对象的集合 //处理每个表单字段 if(pathSrc.trim().equals("")) fi.write(pathDest); } //显示处理结果 StringBuffer filelist = new StringBuffer(); } private void makeUpList(StringBuffer result,String fragment) 在Windows资源管理器窗口中将UploadServlet.java源文件拖动到compile.bat文件的快捷方式上进行编译,修改Javac编译程序报告的错误,直 到编译成功通过为止。 所示。 <web-app> <servlet-mapping> 如图1.6所示。 通过浏览器上传了一个名称为test.jsp的文件,那么用户接着就可以在浏览器中访问这个test.jsp文件了,对于本地浏览器来说,这个jsp文件 的访问URL地址如下所示: 程序来上传自己编写的jsp文件,然后又可以通过浏览器来访问这个jsp文件,如果用户在jsp文件中编写一些有害的程序代码,例如,查看服务 器上的所有目录结构,调用服务器上的操作系统进程等等,这将是一个非常致命的安全漏洞和隐患,这台服务器对外就没有任何安全性可言了 。 1.3 Apache文件上传组件的源码赏析 ,从网址http://jakarta.apache.org/commons/fileupload可以下载到Apache组件的源程序包,在本书的附带带光盘中也提供了该组件的源程 序包,文件名为commons-fileupload-1.0-src.zip。该组件的设计思想和程序编码细节包含有许多值得借鉴的技巧,为了便于有兴趣的读者学 习和研究该组件的源码,本节将分析Apache文件上传组件的源代码实现。对于只想了解如何使用Apache文件上传组件来上传文件的读者来说, 不必学习本节的内容。在学习本节内容之前,读者需要仔细学习了笔者编著的《深入体验java Web开发内幕——核心基础》一书中的第6.7.2节 中讲解的“分析文件上传的请求消息结构”的知识。 中FileUpLoad类用暂时没有应用,是为了以后扩展而保留的。Apache文件上传组件中的各个类的关系如图1.7所示,图中省略了异常类。 DiskFileUpload类是文件上传组件的核心类,它是一个总的控制类,首先由Apache文件上传组件的使用者直接调用DiskFileUpload类的方法, DiskFileUpload类再调用和协调更底层的类来完成具体的功能。解析类MultipartStream和工厂类DefaultFileItemFactory就是DiskFileUpload 类调用的两个的底层类。MultipartStream类用于对请求消息中的实体数据进行具体解析,DefaultFileItemFactory类对MultipartStream类解 析出来的数据进行封装,它将每个表单字段数据封装成一个个的FileItem类对象,用户通过FileItem类对象来获得相关表单字段的数据。 DefaultFileItem类实现的功能。DefaultFileItem类使用了两个成员变量来分别存储表单字段数据的描述头和主体内容,其中保存主体内容的 变量类型为DeferredFileOutputStream类。DeferredFileOutputStream类是一个输出流类型,在开始时,DeferredFileOutputStream类内部使 用一个ByteArrayOutputStream类对象来存储数据,当写入它里面的主体内容的大小大于DiskFileUpload.setSizeThreshold方法设置的临界值 时,DeferredFileOutputStream类内部创建一个文件输出流对象来存储数据,并将前面写入到ByteArrayOutputStream类对象中的数据转移到文 件输出流对象中。这个文件输出流对象关联的文件是一个临时文件,它的保存路径由DiskFileUpload.setRepositoryPath方法指定。 “multipart/form-data”类型,如果是,该方法则创建MultipartStream类对象对request请求对象中的请求体进行解析。 字段元素的数据封装成FileItem类对象。 后加入到一个List类型的集合对象中,parseRequest方法返回该List集合对象。 工厂类把该表单字段元素封装成对应的FileItem类对象。 1.3.2 Apache文件上传组件的核心编程问题 析出每个分区的数据,接着再从每个分区中解析出描述头和主体内容部分。 HttpServletRequest.getReader方法返回的字符输入流,因为不管上传的文件类型是文本的、还是其他各种格式的二进制内容,WEB服务器程序 要做的工作就是将属于文件内容的那部分数据原封不动地提取出来,然后原封不动地存储到本地文件系统中。如果使用 HttpServletRequest.getReader方法返回的字符输入流对象来读取HTTP请求消息中的实体内容,它将HTTP请求消息中的字节数据转换成字符后 再返回,这主要是为了方便要以文本方式来处理本来就全是文本内容的请求消息的应用,但本程序要求的是“原封不动”,显然不能使用 HttpServletRequest.getReader方法返回的字符输入流对象来进行读取。 许客户端上传超过这个字节数组大小的实体内容。所以,只能创建一个一般大小的字节数组缓冲区来逐段读取请求消息中的实体内容,读取一 段就处理一段,处理完上一段以后,再读取下一段,如此循环,直到处理完所有的实体内容,如图1.9所示。 是被下一段数据覆盖,所以,解析和封装过程必须同步进行,程序一旦识别出图1.3中的一个分区的开始后,就要开始将它封装到一个FileItem 对象中。 等于找到了一个分区的开始。笔者在《深入体验java Web开发内幕——核心基础》一书中的第6.7.2节中已经讲过,上传文件的请求消息的 Content-Type头字段中包含有用作字段分隔界线的字符序列,如下所示: 数组缓冲区buffer中寻找分区的字段分隔界线。content-type头字段的boundary参数中指定的字段分隔界线是浏览器随机产生的,浏览器保证 它不会与用户上传的所有数据中的任何部分出现相同。在这里有一点需要注意,图1.3中的实体内容内部的字段分隔界线与content-type头中指 定的字段分隔界线有一点细微的差别,前者是在后者前面增加了两个减号(-)字符而形成的,这倒不是什么编程难点。真正的编程难点在于在 字节数组缓冲区buffer中寻找分隔界线时,可能会遇到字节数组缓冲区buffer中只装入了分隔界线字符序列的部分内容的情况,如图1.10所示 。 要解决这个问题的方法之一就是在查找字段分隔界线时,如果发现字节数组缓冲区buffer中只装入了分隔界线字符序列的部分内容,那么就将 这一部分内容留给字节数组缓冲区buffer的下一次读取,如图1.11所示。 |
org.apache.commons.fileupload.DiskFileUpload相关推荐
- org.apache.commons.fileupload.DiskFileUpload使用上
1.setSizeMax方法 setSizeMax方法用于设置请求消息实体内容的最大允许大小,以防止客户端故意通过上传特大的文件来塞满服务器端的存储空间,单位为字节. 2.setSizeThresho ...
- org.apache.commons.fileupload.DiskFileUpload使用
1.setSizeMax方法 setSizeMax方法用于设置请求消息实体内容的最大允许大小,以防止客户端故意通过上传特大的文件来塞满服务器端的存储空间,单位为字节. 2.setSizeThresh ...
- 文件上传之Apache commons fileupload使用
文件上传的方法主要目前有两个常用的,一个是SmartUpload,一个是Apache的Commons fileupload. 我们这里主要介绍下第二个的用法,首先要上传文件,注意几个问题: 1 for ...
- Apache Commons Fileupload 漏洞,可恶意操作文件
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | spoock 来源 | https://tinyurl.com/y34djpar ...
- Apache Commons fileUpload实现文件上传
Apache的commons-fileupload.jar可方便的实现文件的上传功能,本文通过实例来介绍如何使用commons-fileupload.jar. @author:ZJ 07-2-22 B ...
- Spring MVC-09循序渐进之文件上传(基于Apache Commons FileUpload)
概述 客户端编程 MultipartFile接口 利用Commons FileUpload上传文件 Domain类 控制器 配置文件 JSP页面 部署及测试 源码 概述 Servlet出现之前,文件上 ...
- Java Web——文件上传(Apache Commons FileUpload实现上传图片DEMO)
基本概念 Apache Commons FileUpload :Apache Commons FileUpload组件提供了一种简单而灵活的方法,可以将对多部分文件上传功能的支持添加到Servlet和 ...
- 【报错笔记】使用MultipartFile 出现异常:java.lang.ClassNotFoundException: org.apache.commons.fileupload...
使用MultipartFile出现异常:java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory ...
- Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?
在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".) 为 http 协议添加了这个功能.客户端的 ...
- org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException:
一:今天在使用struts2做文件上传时出现了该异常: 警告: Unable to parse request org.apache.commons.fileupload.FileUploadBase ...
最新文章
- ASP.NET MVC Bundles 之学习笔记
- 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )
- mysql innodb学习笔记
- Kettle使用_30 作业里使用参数
- Faster RCNN 训练中的一些问题及解决办法
- data-sap-ui-icon-content where does icon content come from
- Linux系统日志及日志分析
- 【Java 8 新特性】Java Stream.of()用法示例
- Python - 装饰器
- BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP
- python表单_python-基于添加表单的Django编辑表单?
- IntelliJ IDEA 2018 设置代码提示对大小写不敏感
- 简单易扩展的爬虫架构
- NFinal 控制器—URL
- 于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程
- 升级LINUX内核(支持8G内存)的命令
- keil5破解安装包下载及STM32固件包下载
- html5 左侧在线客服,在网页右侧漂浮的QQ在线客服代码,QQ在线状态代码(四种样式)...
- 如何恢复计算机隐藏的文件夹,隐藏文件夹,小编教你电脑隐藏文件夹怎么恢复...
- php final这个关键词代表什么,php中final关键字用法分析
热门文章
- Acad多窗体并排展现
- 超详细反编译python打包的exe
- WinGdi 和 GdiPlus绘图知识积累
- [Gdiplus]_[初级]_[使用插值模式控制图片的缩放质量]
- 炫炫炫的十六进制编辑器
- linux acpidtd 进程,MaciASL提取的原版的DTDS编译提示有错误,大牛帮忙看下吧。
- Win10 多出显示器无法删除的“通用非即插即用监视器”问题解决,intel hd graphics 4600 driver win 10
- EOS钱包开发注意交易消失的情况
- labview和python哪个易学_如何学好labview?
- 微信扫一扫服务器地址,微信扫一扫