需求
做了一个博主的管理demo,新添加了上传头像的功能,需要通过前端form表单进行上传,后端进行处理,保存到项目的相对路径目录当中去,并持久化路径到相应的数据库字段,以供前端可以回显图片。
页面展示

在新增和编辑功能中,可以选择图片进行上传显示

思路
- 上传到后端项目的相对路径当中,因为运行的是target文件夹下的文件,所以获取到的路径也是,添加的图片也是要在target文件夹下,才可以访问到
- 如果放到本地项目开发代码的resources文件夹中,在项目运行时是无法访问到文件的,target文件夹下的文件不会同步更新,自然前端也是访问不到的

源码
java
@Slf4j
@RestController
public class UploadController {
@PostMapping("/upload")
public Result upload(@RequestParam("file") MultipartFile file) throws IOException {
log.info("接收的文件信息:{}",file);
// 获取源文件名
String originalFilename = file.getOriginalFilename();
// 重新设置文件名 (后缀不变)
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String newFileName = UUID.randomUUID().toString() + suffix;
// 在指定位置创建指定文件,这里先获取到相对路径下,对应的绝对路径
URL resource = this.getClass().getClassLoader().getResource("static/uploads/");
log.info("获取绝对路径:{}",resource);
log.info("getPath:::{}",resource.getPath());
//进行文件创建,通过获取到的文件存储路径进行拼接,确保文件存储到指定文件夹下
File image = new File(resource.getPath()+newFileName);
file.transferTo(image);
//返回值这里要和前端对应好,如果前端拼接了访问路径ip+端口号等等,这里就要省略,否则重复访问地址是不能进行图片显示的
return Result.success("success","uploads/"+newFileName);
}
}
返回值说明
- 前端可以回显的图片访问地址是:
http://localhost:8080/uploads/e16fbdcd-5f73-46e3-a824-b842529da04f.jpg - 上面返回的图片路径是
"uploads/"+newFileName,如果前端不进行处理,直接将返回的数据存储到数据库中,是无法显示图片的,这里前端进行了拼接,后端就不用处理了;否则可以写成"http://localhost:8080/uploads/"+newFileName
- 返回值这里设置了统一的返回类Result