<form action="s6" enctype="multipart/form-data" method="post">
姓名<input type="text" name="username"> <br>
头像<input type="file" name="photo">
<button>提交</button>
</form>
文件上传需要将form表单的enctype属性设置为multipart/form-data,
此时发送网络请求时的请求头中的content-type就是multipart/form-data,该内容类型会将请求提交的数据,以多段的形式进行拼接(每一个表单项就是一段),然后以二进制流的形式发送给服务器。
- content-Type如下图:
其中 boundary=-------------------------25637493772594131407875886362 表示每一段的分隔符是-------------------------25637493772594131407875886362。
我们再看下提交的数据
此时看到请求体中的数据,确实被这个指定的分割线分开了,而且每一段都有参数名信息和参数值(两者用空行分开)。
此时如果用request.getParameter(“username”)是获取不到的。因为所有数据都在request.getInputStream中。
- 通过输入流获取
/**
* 由于客户端的内容类型为 multipart/form-data,所以请求中的数据为二进制流,
* 用这种方式是获取不到参数的
*/
// System.out.println(req.getParameter("username"));
// System.out.println(req.getParameter("photo"));
ServletInputStream inputStream = req.getInputStream();
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes);
System.out.println(new String(bytes,0,read));
System.out.println("文件上传请求");
发现解析出来的字符串是和上传时请求体中的内容是一致的。
再将这个字符串解析出我们想要的数据。这里可以使用第三方类库解析 commons-io 和 commons-fileupload。