一、前端发送请求
前端向后端发送请求,上传附件。Post请求体中是二进制流,后端接口接收请求并封装成MultipartFile实例。通过接口方法把流对象存储到硬盘上。
1.1、前端代码
<!-- 上传开始
:show-file-list 是否展示已上传文件列表
on-success 文件上传成功时的钩子
inline-block则是“行内块级元素”,它具有行内元素的特征(即不会自动换行)
-->
<div>
<el-upload
action="http://localhost:9090/file/upload/"
:on-success="handsuccess"
style="display: inline-block"
:show-file-list="true">
<el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</div>
1.2、代码说明
说明:当show-file-list属性为true时,上传附件后显示文件。
二、后端接收请求
2.1、后端接口
/**
* 文件上传接口
*/
//MultipartFile是SpringMVC提供简化文件流操作的接口
// produces,判断请求头中的accept是否包含指定的格式, 如果有就走该映射
@PostMapping(value = "/upload",produces = "application/json;charset-UTF-8")
public String upload(@RequestParam MultipartFile file) throws IOException {
System.out.println("fileUploadPath值"+fileUploadPath);
//1 此处不知道为啥用RequestParam接收,因为这个注解应该只从请求头获取数据?
// 1 获取上传文件的名称,来源SpringMVC提供的MultipartFile
String originalFilename = file.getOriginalFilename();
System.out.println(originalFilename);
//2 FileNameUtil.extName(FileUtil.file(文件名)):获取文件后缀格式,比如pdf,来源hutool
String type = FileNameUtil.extName(FileUtil.file(originalFilename));
//获取上传文件的长度
Long size = file.getSize();//单位是字节
System.out.println(size);
//3 UUID全称通用唯一识别码,hutool
String uuid = IdUtil.fastSimpleUUID();
// // 定义一个文件唯一的标识码fileUUid(即新文件名)=uuid +. +文件类型
String fileUUID = uuid + StrUtil.DOT + type;//ad2a8785be4e468ca2fde7d8d5a4e765.jpeg
System.out.println(fileUploadPath);
//4 创建一个文件对象,构造方法就是文件的绝对路径(fileUploadPath+fileUploadPath)
System.out.println(fileUploadPath + fileUUID);
File uploadFile = new File(fileUploadPath + fileUUID);
//5 判断文件所在的目录是否存在,注意不是文件是否存在
File parentFile = uploadFile.getParentFile();
boolean b1 = parentFile.exists();// b1=true,文件所在的目录存在
if (b1 = false) {
//创建目录
parentFile.mkdir();
}
System.out.println(b1);
上传文件到磁盘,MultipartFile方法,transferTo方法用来将接收文件传输到给定目标路径
file.transferTo(uploadFile);
url = "http://localhost:9090/file/"+fileUUID;
// 上传完附件,把上传的附件的有关信息,保存到数据中
//创建实体类对象
Files savaFile = new Files();
savaFile.setName(originalFilename);//文件名称
savaFile.setMd5(md5);// 文件md5
savaFile.setSize(size / 1024);// 文件长度,单位M
savaFile.setType(type);// 文件类型
savaFile.setUrl(url);
filesService.insertFiles(savaFile);
}
return "他日若得凌云志,敢笑黄巢不丈夫";
}
//该参数配置在yml文件中为你要存储文件的磁盘路径
@Value("${files.upload.path}")
private String fileUploadPath;
2.2、代码说明
1、MultipartFile接口
MultipartFile接口是SpringMVC提供简化文件流操作的接口,相当于一个输入流。接口内包含获取MultipartFile实例的名称,把实例转成字节数据等方法。
2、@RequestParam注解
前端向后端传二进制流,后端接收数据并封装成MultipartFile实例。这是一个Post请求,为什么可以用@RequestParam。@RequestParam可以接收Post请求的参数?