文件上传和下载
之前在SpringMvc和使用原生态Servlet时都了解过如何操作文件上传和下载,过程都比较多,基本就是写一遍以后都是复制粘贴用。而是用SpringBoot操作文件上传和下载,则会更加简单和方便。
首先创建一个文件上传的表单,需要有一个单文件上传和多文件上传。
表单里面首先声明enctype为multipart/form-data,请求方式为post,设置好接受提交参数的请求,使用了thymeleaf语法就不用写全路径,直接用thymeleaf语法写一个请求地址剩下的会由thymeleaf补全,设置好了后,在表单里面要注意的就是,多个文件上传时,设置input属性multiple,就能实现多个文件上传
<form th:action="@{/fileUp}" method="post" enctype="multipart/form-data">
? ?<label>用户名</label>
? ?<input type="text" name="username" placeholder="请输入用户名">
? ?<label>密码</label>
? ?<input type="password" name="password" placeholder="请输入密码">
?<input type="file" name="userImg" value="单个文件">
?<input type="file" name="files" value="多个文件" multiple>
?<input type="submit" name="上传">
</form>
然后在控制器中
建立一个接收POST请求的控制器方法,方法参数名一样就直接用,不一样就用注解@RequestParam,接收文件类型的参数,在SpringBoot中提供了MultipartFile类来接收,十分方便。单个文件就用单个对象接收,多个文件就用数组来接收。
在这个类里面提供了很多操作上传文件的方法,getName方法获取的是上传的文件参数name属性值,getOriginalFilename方法获取的是上传文件的真实名称。除此之外,SpringBoot提供了更加方便的操作文件的方法transferTo,能够直接将文件接收在本地指定地址中,也能通过getInputStream方法直接获取上传的文件流,爱怎么操作这个文件流都能操作
@Controller
public class FileUploadController {
?
? ?@RequestMapping("/upload")
? ?public String upload() {
? ? ? ?return "fileUp";
? }
?
? ?@PostMapping("/fileUp")
? ?public String fileUp(String username,
? ? ? ? ? ? ? ? ? ? ? ? String password,
? ? ? ? ? ? ? ? ? ? ? ? MultipartFile userImg,
? ? ? ? ? ? ? ? ? ? ? ? MultipartFile[] files) throws IOException {
? ? ? ?System.out.println("用户名:" + username);
? ? ? ?System.out.println("文件名:" + userImg.getOriginalFilename());
? ? ? ?System.out.println("files的长度:" + files.length);
?
? ? ? ?userImg.transferTo(new File("D:\\Apache\\image\\" + userImg.getOriginalFilename()));
? ? ? ?for (MultipartFile file : files) {
? ? ? ? ? ?file.transferTo(new File("D:\\Apache\\image\\" + file.getOriginalFilename()));
? ? ? }
? ? ? ?System.out.println("success");
? ? ? ?return "redirect:/main";
? }
?
}
可能会出错的问题:
在SpringBoot中,由MultipartAutoConfiguration类管理文件上传。在操作中会出现文件过大报错,就能搜索这个类,在里面看见,有一个MultipartProperties配置类,点进去就能看见
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
说他跟配置文件中的以前缀spring.servlet.multipart开头的配置项绑定,然后里面的属性都是设置默认文件上传大小的,那么就可以通过在application配置文件中设置
以下这两项,规定单次文件上传最大值,和总请求上传文件最大值。
spring:
servlet:
? multipart:
? ? max-file-size: 10MB
? ? max-request-size: 120MB
?
然后就能看见文件们都被上传到你指定的本地位置了
以上就是文件上传和下载,SpringBoot的很方便。
|