准备
- 要有一个form 标签,method=post 请求
- form 标签的encType 属性值必须为multipart/form-data 值
- 在form 标签中使用input type=file 添加上传的文件
- 编写服务器代码(Servlet 程序)接收,处理上传的数据。
- encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器
文件上传的 http协议说明
commons-fileupload.jar 常用API 介绍说明
- commons-fileupload.jar 需要依赖commons-io.jar 这个包,所以两个包我们都要引入。
- 第一步,就是需要导入两个jar 包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
- commons-fileupload.jar 和commons-io.jar 包中,我们常用的类有哪些?
- ServletFileUpload 类,用于解析上传的数据。FileItem 类,表示每一个表单项。
- boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 判断当前上传的数据格式是否是多段的格式。
- public List parseRequest(HttpServletRequest request) 解析上传的数据
- boolean FileItem.isFormField() 判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
true 表示普通类型的表单项
false 表示上传的文件类型
- String FileItem.getFieldName() 获取表单项的name 属性值
- String FileItem.getString() 获取当前表单项的值。
- String FileItem.getName(); 获取上传的文件名
- void FileItem.write( file ); 将上传的文件写到参数file 所指向抽硬盘位置。
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/fileDownload" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username"/> <br>
头像:<input type="file" name="photo"> <br>
<input type="submit" value="上传">
</form>
</body>
</html>
@WebServlet("/fileDownload")
public class FileDownloadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 先判断上传的数据是否多段数据(只有是多端的数据,才是文件上传的)
if (ServletFileUpload.isMultipartContent(request)) {
//创建 FileItemFactory 工厂实现类
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//创建用于解析上传数据的工具类 ServletFileUpload
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
//解析上传的数据,得到每一个表单项 FileItem
List<FileItem> list = servletFileUpload.parseRequest(request);
//循环判断,每一个表单是普通类型,还是上传的文件
for (FileItem e : list) {
//判断是是否是字段属性
if (e.isFormField()) {
//普通比表单项
System.out.println("表单项的 name属性值" + e.getFieldName());
//参数 utf-8.解决乱码问题
System.out.println("表单项的 value属性值" + e.getString("utf-8"));
} else {
//上传文件
System.out.println("表单项的 name属性值" + e.getFieldName());
System.out.println("上传文件名" + e.getName());
//使用 uuid进行随机文件名
String fileName = UUID.randomUUID() +
//截取后缀
e.getName().substring(e.getName().lastIndexOf("."));
System.out.println(fileName);
//- 把服务器保存到硬盘中
// e.write(new File("D:\\新建文件夹\\" + fileName));
//- 把文件保存在项目的image文件夹中::::保存在idea配置的tomcat目录中
String path = request.getServletContext().getRealPath("/image");
System.out.println(path);
System.out.println(path + File.separator + fileName);
//- 使用这个FileItem 写入
e.write(new File(path));
//或者使用 apache.commons.io.IOUtils; 工具类写入
// IOUtils.copy(e.getInputStream(), new FileOutputStream(fileName));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}