Javaweb学习笔记(文件上传与下载)
- 如何实现文件上传
- 文件上传的相关API
-
- Fileltem接口
- DiskFileltemFactory类
- ServletFileUpload类
-
-
- setSizeMax(long sizeMax)和getSizeMax()方法
- setFileSizeMax(long fileSizeMax)方法
- parseRequest(javax.servlet.http.HttpServletRequest req)
- getItemlterator(HttpServletRequest request)
- isMultipartContent(HttpServletRequest req)
- getFileItemFactory()和setFileItemFactory(FileItemFactory factory)
- setHeaderEncoding(String encoding)方法和getHeaderEncoding()方法
-
- 应用案例——文件上传
- 文件下载
如何实现文件上传
在Web应用中,由于大数文件的上传都是通过表单的形式,提交给服务器的,因此要想在程序中实现文件上传的功能,首先要创建一个用于提交上传的表单页面。为了使Servlet程序可以获取到上传文件的数据,需要将表单页面的method属性设置为post方式,enctype属性设置为multipart/form-data类型,天剑文件的input标签设置为file类型。
当浏览器通过表单提交上传文件时,由于文件数据都附带在HTTP请求消息体中,并且文件数据都附带在HTTP请求消息体中,并且采用MIME类型进行描述。
请求正文分为多个部分,解析这部分内容比较麻烦,为此Apache组织提供了一个开源组件,该组件可以方便地将multipart/form-data类型请求中的各种表单域解析出来并实现一个或多个文件的上传,同时也可以限制文件上传的大小等内容并且性能优异,使用及其简单。需要注意的是在使用FileUpload组件时,需要导入commons-fileupload和commons-is两个jar包。
文件上传的相关API
Fileltem接口
File接口用于封装单个表单字段元素的数据,一个表单字段元素对应FileItem对象。为了便于讲解,为此将FilItem的实现类称为FileItem类,FileItem类实现Serializable接口,因此支持序列化操作,在FileItem类中定义了许多获取表单字段元素的方法。
boolean isFormFileld()方法
isFormField()方法用于判断,FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。
String getName()方法
getName()方法用于获得文件上传字段中的文件名,如果FileItem类对象对应的是普通表单字段,getName()方法将返回null,否则只要浏览器将文件的字段信息传递给服务器,getName()方法就会返回一个字符串类型的结果。
String getFieldName()方法
getFieldName()方法用于获取表单字段元素描述头name属性值,也是表单标签name属性的值。
void write(File file)方法
write()方法用于将FileItem对象中保存的主体保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,那么该方法顺利完成后,临时文件有可能被清除。
String getString()方法
getString()方法用于将FileItem对象中保存的数据流内容以一个字符串返回,两个重载的定义形式:
(1)public String getString()
(2)public String getString(java.lang.String.encoding)
在上面重载的方法中,前者使用默认字符集编码酱猪蹄内容转换成字符串,后者使用参数指定的字符集编码将主体内容转化成字符串。
String getContentType()方法
getContentType()方法用于获得上传文件的类型,即表单字段元素描述头属性“Content-Type”的值,如果FileItem类对象对应的是普通表单字段。
boolean isInMemory()方法
isInMeory()方法用来判断FileItem对象封装的数据内容时存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false。
void delete()方法
delete()方法用于清空FileItem类对象中存放的主体内容,如果主题内容被保存在临时文件中,delete()方法将删除临时文件。需要注意的是尽管FileItem对象被垃圾收集器收集会自动清除临时文件,但应该及时调用delete()方法清除临时文件,从而释放系统存储资源。
inputStream getInputStream()方法
getInputStream()方法以流的形式返回上传的数据内容。
long getSize()方法
getsize()方法返回该上传文件的大小。
DiskFileltemFactory类
DiskFileltemFactory类用于将请求消息实体中的每一个文件封装成单独的FileItem对象,入股上传文件较小,将直接保存在内存中,如果上传文件较大,则会以临时文件的形式,保存在磁盘临时文件夹中,默认情况下,默认保存在内存还是硬盘临时文件夹的临界值是10kb。DiskFileltemFactory有两个构造方法:
方法声明 | 功能描述 |
---|---|
DiskFileItemFactory() | 采用默认临界值和系统临时文件夹构造文件项对象 |
DiskFileItemFactory(int sizeThreshold,File repository) | 采用参数指定临界值和系统临时文件夹构造文件项工厂对象。 |
第二个构造方法需要传递两个参数,第一个参数sizeThreshold代表文件保存在内存还是磁盘临时文件夹的临界值,参数repository表示临时文件的存储路径。
常用方法: