JavaWeb实现文件的上传和下载
在JavaWeb中想要实现文件上传,通常需要完成两步操作:一是在web页面上添加上传输入项;二是在Servlet中读取上传文件的数据。
一:在web页面上添加输入项
大多数的文件上传都是通过表单形式提交给服务器,故若想实现文件上传,先创建一个用于上传文件的表单:
- 表单设置
- 将method设置为POST
- 将enctype设置为“multipart/form-data”类型(用于提交包含文件,非ASCII数据和二进制数据的表单)
- action设置为"UploadServlet"(响应表单的那个Servlet)
- input输入组件设置
- 必须设置input输入项的name属性,否则浏览器将不会发送上传的文件数据(下面详解)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<table width="300px">
<tr>
<td>上传者</td>
<td><input name="name" type="text" /></td>
</tr>
<tr>
<td>上传文件</td>
<td><input name="file" type="myfile" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
二: 在Servlet中读取上传文件的数据
实现文件上传目前使用较多的为开源组件Commons-FileUpload。
Commons-FileUpload组件实现文件上传流程
在servlet响应处理过程中有三个至关重要的类/接口:
FileItem接口:用于封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem对象
如下图就是两个表单字段元素,对应可以生成两个FileItem对象
在FileItem接口里定义了许多获取表单字段元素的方法,这些方法在实现文件上传时起了至关重要的作用
FIleItem的方法我写在了另外一篇博客,需要的可以查看
戳这看FileItem的具体方法
DiskFileItemFactory类
DiskFileItemFactory类用于将请求消息实体中的每一个文件封装陈单独的FileItem对象。在实际应用中我们更显而易见的是它设置上传文件缓存目录的功能
DiskFileItemFactory类的使用,戳它~
ServletFileUpload类
ServletFileUpload类,处理文件上传的核心高级类,通过使用parseRequest(HttpServletRequest)方法将HTML中的每个表单提交的数据封装成一个FileItem对象,然后一List列表形式返回。