multipartfileUpload
MultipartFileUpload是一种处理包含文件上传的表单数据的有效方法。在Spring框架中,通过MultipartFile接口可以方便地处理文件上传操作。
过程复现
1.在idea新建的spring项目下创建jsp文件,并且创建一个类用来控制上传行为。(默认jsp是不解析的,需要我们在修改默认解析配置,并且在pom.xml中引入依赖)
类文件:
package com.example.fileuploaddemo.demos.web;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
@Controller
public class multipartfileController {
@Value("${file.upload.path}")
private String path;
@GetMapping("/")
public String uploadPage() {return "upload";}
@PostMapping("/upload")
@ResponseBody
public String create(@RequestPart MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
String filePath = path + fileName;
File dest = new File(filePath);
Files.copy(file.getInputStream(), dest.toPath());
return "Upload file success : " + dest.getAbsolutePath();
}
}
依赖:
<!-- servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- tomcat 的支持.-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
multipartfileUpload.jsp文件内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>文件上传页面</title>
</head>
<body>
<h1>文件上传页面</h1>
<form method="post" action="/upload" enctype="multipart/form-data">
选择要上传的文件:<input type="file" name="file"><br>
<hr>
<input type="submit" value="提交">
</form>
</body>
</html>
2.启动项目,并且在项目中通过访问路径看到如下界面,则表示搭建成功。
3.在application.properties中配置上传文件路径,选择文件上传。
上传成功截图:
代码解析
1.通过jsp页面中的html代码我们可以清晰的看见他通过post的形式提交文件上传至upload路径。
2.我们回到Controller来读一下java代码。
直接分为三步就可以理清他的逻辑。
第一步:
- @Controller: 这是一个Spring MVC注解,用于声明这个类是一个Spring Web MVC控制器。控制器负责处理通过HTTP请求映射到的方法。
- multipartfileController: 这是控制器的类名,通常我们会根据功能给类命名,这里命名为multipartfileController,表明它与处理MultipartFile(即文件上传)有关。
- @Value(“${file.upload.path}”): 这是Spring的属性注入注解,用于将配置文件(如application.properties或application.yml)中的file.upload.path属性的值注入到path变量中。这个路径用于指定文件上传后的存储位置。
第二步:
- @ GetMapping(“/”): 这是一个Spring MVC注解,用于将HTTP GET请求映射到uploadPage方法上。当用户访问根路径(/)时,会调用这个方法。
- uploadPage(): 这个方法返回一个字符串,表示要渲染的视图名称。在这个例子中,返回的视图名称是"upload"。这意味着Spring MVC将查找名为upload的视图模板(通常是一个HTML文件),并渲染它作为HTTP响应发送给客户端。
第三步:
- @PostMapping(“/upload”): 这是一个Spring MVC注解,用于将HTTP POST请求映射到create方法上。当用户向/upload路径发送POST请求时,会调用这个方法。
- @ResponseBody: 这个注解表明方法的返回值应该直接作为HTTP响应正文返回,而不是解析为视图模板的名称。
- create(@RequestPart MultipartFile file): 这个方法接受一个MultipartFile类型的参数,@RequestPart注解用于指示该参数是请求体中的一个部分(在文件上传时,文件通常作为请求体的一部分发送)。MultipartFile是Spring MVC提供的一个接口,用于表示上传的文件。
- 文件处理逻辑: 方法内部,首先获取文件的原始名称,然后将其与配置的文件路径拼接,形成文件的完整存储路径。接着,使用Files.copy方法将文件的内容从输入流复制到指定路径的文件中。
- 返回值: 方法最后返回一个字符串,表示文件上传成功,并附上了文件的绝对路径。这个字符串将直接作为HTTP响应正文发送给客户端。