文件上传,是指将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程。
文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
上传文件的原始form表单,要求表单必须具备以下三点(上传文件页面三要素):
-
表单必须有file域,用于选择要上传的文件
<input type="file" name="image"/>
-
表单提交方式必须为POST
通常上传的文件会比较大,所以需要使用 POST 提交方式
-
表单的编码类型enctype必须要设置为:multipart/form-data
普通默认的编码格式是不适合传输大型的二进制数据的,所以在文件上传时,表单的编码格式必须设置为multipart/form-data
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
后端:
-
首先在服务端定义这么一个controller,用来进行文件上传,然后在controller当中定义一个方法来处理
/upload
请求 -
在定义的方法中接收提交过来的数据 (方法中的形参名和请求参数的名字保持一致)
- 用户名:String name
- 年龄: Integer age
- 文件: MultipartFile image
Spring中提供了一个API:MultipartFile,使用这个API就可以来接收到上传的文件
package com.intelligent_learning_aid_system.controller;
import com.intelligent_learning_aid_system.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(String name, Integer age, MultipartFile image) {
log.info("文件上传 {} {} {}", name, age, image);
return Result.success();
}
}
本地传输
@PostMapping("/upload")
public Result upload(String name, Integer age, MultipartFile image) throws IOException {
log.info("文件上传 {} {} {}", name, age, image);
// 本地上传
String originalFileName = image.getOriginalFilename();
image.transferTo(new File("E:\\BaiduNetdiskDownload\\day11-SpringBootWeb案例\\day11-SpringBootWeb案例\\讲义\\images\\" + originalFileName));
return Result.success();
}
使用UUID获取随机文件名:保证每次上传文件时文件名都唯一的。
@PostMapping("/upload")
public Result upload(String name, Integer age, MultipartFile image) throws IOException {
log.info("文件上传 {} {} {}", name, age, image);
// 本地上传
String originalFileName = image.getOriginalFilename();
// image.transferTo(new File("E:\\BaiduNetdiskDownload\\day11-SpringBootWeb案例\\day11-SpringBootWeb案例\\讲义\\images\\" + originalFileName));
// 构造唯一的文件名 -- uuid(通用唯一标识符)
int index = originalFileName.lastIndexOf(".");
String extrname = originalFileName.substring(index);
String newFileName = UUID.randomUUID().toString() + extrname;
log.info("新的文件名:{}", newFileName);
image.transferTo(new File("E:\\BaiduNetdiskDownload\\day11-SpringBootWeb案例\\day11-SpringBootWeb案例\\讲义\\images\\" + newFileName));
return Result.success();
}
在SpringBoot中,文件上传时默认单个文件最大大小为1M
那么如果需要上传大文件,可以在application.properties进行如下配置:
#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大上传大小(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB