1 multipart/form-data
多部件传输方式,也就是说选择这种方式进行上传,可以上传文件和参数
使用Postman工具进行该方式提交数据,如下图所示
form-data.png
这里的file就对应了你需要上传的图片、或者其他文件;Text类型就是普通key-value参数和参数值,下面使用Java进行实现一下文件上传
1.1 实现文件上传
- 加入依赖包
<dependencies>
<!-- 文件上传 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
- 编写Java类
public void getFileFromHttpRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1. 创建磁盘文件工厂对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2. 创建文件上传核心类
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 2.1 设置上传文件的编码
servletFileUpload.setHeaderEncoding("UTF-8");
// 2.2 判断表单是否是文件上传表单
if (servletFileUpload.isMultipartContent(request)) { // 是多部文件上传表单
// 3. 解析request -> 获取表单项的集合
List<FileItem> list = servletFileUpload.parseRequest(request);
if (null != list) {
// 4. 遍历集合获取表单项
for (FileItem fileItem : list) {
// 5. 判断当前表单项 是不是普通表单项
if (fileItem.isFormField()) { // 普通表单项
String fieldName = fileItem.getFieldName();
// 设置编码
String fieldValue = null;//设置编码
try {
fieldValue = fileItem.getString("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(fieldName +" = " +fieldValue);
} else {
//文件上传项
//获取文件名
String fileName = fileItem.getName();
// 拼接新的文件名,使用UUID保证唯一性
String newFileName = String.format("%s_%s", UUIDUtils.getUUID(), fileName);
// 获取输入流
InputStream inputStream = fileItem.getInputStream();
//创建输出流
//1.获取项目的运行目录 J:\install\apache-tomcat-9.0.41\webapps\lagou_edu_home\
String realPath = this.getServletContext().getRealPath("/");
//2.截取到 webapps目录路径
String wabappsPath = realPath.substring(0, realPath.indexOf("lagou_edu_home"));
//3.拼接输出路径,将图片保存到 upload
FileOutputStream out = new FileOutputStream(wabappsPath+"/upload/" + newFileName);
//使用IOUtils完成 文件的copy
IOUtils.copy(inputStream,out);
//关闭流
out.close();
inputStream.close();
}
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
2 application/x-www-form-urlencoded
提交form表单,只能是key-value值
- Java获取form表单里面的参数值
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 获取post请求中from表单的数据
Map<String, String[]> parameterMap = request.getParameterMap();
parameterMap.entrySet().forEach(System.out::print);
}
3 raw
提交Json数据格式,在Servlet中使用工具类进行解析获取参数值
- Java获取Json数据格式的参数值
public String getPostJSON(HttpServletRequest request){
try {
//1.从request中 获取缓冲输入流对象
BufferedReader reader = request.getReader();
//2.创建StringBuffer 保存读取出的数据
StringBuffer sb = new StringBuffer();
//3.循环读取
String line = null;
while((line = reader.readLine()) != null){
//将每次读取的数据 追加到StringBuffer
sb.append(line);
}
//4.返回结果
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
总结:读取请求里面的流,然后转为Map结构