这是我在学jsp时抽离出来的模块,文件上传和下载,把它单独拿出来写的原因是为了更加彻透的了解它!其实上传文件的组件CommonsFileUpload组件最核心的就是FileUpload类的parseRequest( request)解析请求把表单字段数据封装成FileItem对象,就不用我们去一个个的接收表单的参数了!
作为有趣的博主,我就从一篇有趣的文字开始吧。送大家一张手机的壁纸(在之前的文字中一直都是电脑的壁纸,现在由于图片比较大我就放在了文章的结尾)
我们上传文件一般用的就是表单,那么用于上传文件的表单需要注意以下几点!
<form enctype="multipart/form-data” method="post" > <input type="file" name="myfile"/> </br> </form>
①表单的entype必须是multipart/form-data 发送的方式必须是post
②type的类型必须是file ,并且必须带有名字,这样才方便接受input提交文件的这个参数
文件上传一般都是使用表单,表单提交文件时,文件数据都是附带在HTTP请求消息体中的,并且采用MIME类型(多用途互联网邮件扩展)进行描述。在后台使用request提供的getInputStream()方法可以读取到客户端提交过来的的数据,但是由于用户可能同时提交多个文件,而在servlet端直接读取上传数据,并分别解析出相应的文件数据时一项麻烦的工作。所以Apache组织提供了开源组件Commons-FileUpload(平民-文件上传)。(在我们的传统上传文件时如果上传是单个文件,我们通常时直接用request.getInputStream(),获取这个请求中的文件的输入流,直接读出来写到文件中(并不需要获取参数),但是如果上传的是多个文件的话,那么我们就要对这个请求进行解析,这样子就很麻烦)。
注:我们在使用这个上传的组件时,要在Apache官网中下载两个jar包
**工作流程:**下图很重要,认真看完再看下面分析
Commons-FileUpload组件实现了Fileltem(翻译过来是文件条)接口
Fileltem的作用:封装数据,用于封装单个表单字段元素的数据 。(fileitem实现了序列化接口,所以也支持序列化)
比如:下面这个表单提交了text普通字符串字段和file文件字段,那么text的字段数据会封装为一个Fileltem对象,file字段数据会封装为一个fileitem对象。每个字段都会封装为一个Fileltem对象。
eg; <form enctype="multipart/form-data” method="post" > <input type="text" name="name"/> <input type="file" name="myfile"/> </form>
Fileltem类提供的方法:
方法 | 作用 | |
---|---|---|
1 | boolean isFormField() | 用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。 |
2 | String getName() | 用于获得文件上传字段中的文件名,如果时普通文本表单字段返回null。注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。 |
3 | String getFieldName() | 方法用于返回表单标签name属性的值。即form的name值 |
4 | void write(File file) | 用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。 |
5 | String getString() | getString(),使用默认的字符编码将FileItem的主体内容转化为字符串 |
getString(String encoding),用参数指定字符编码FileItem的主体内容转化为字符串 | ||
7 | boolean isInMemory() | isInMemory方法用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false。 |
8 | void delete() | delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete方法将删除该临时文件。 尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。 |