旁白
下面三个静态路径都写在properties文件里,要用到直接注入即可。
file.uploadPath是文件的上传路径
file.visitPath是返回完整的文件映射路径【携带端口号】
file.mapPath是返回映射路径【不带端口号】
测试
在浏览器中直接访问"http://localhost:9090/pictures/2021/12/05/68f61bc7-07b9-41c6-876b-22c9a57f5606.png"即可看到上传的照片了
上传单张照片代码实现
Controller层
// 上传图片
@ApiOperation("上传照片接口")
@PostMapping("/uploadImg")
public Result uploadImg(@ApiParam("图片") @RequestParam("file")MultipartFile multipartFile) {
return Result.success(articleService.uploadImg(multipartFile));
}
serviceImpl实现类
/**
单独拉出来
*/
@Value("${file.uploadPath}")
private String uploadPath;
@Value("${file.visitPath}")
private String visitPath;
/**
* 一二三步是生成文件名
* 四五六步是生成上传路径
* 第七步是上传并返回可视路径
* @param multipartFile
* @return
*/
@Override
public String uploadImg(MultipartFile multipartFile) {
// 1、获取真实文件名
String originalFilename = multipartFile.getOriginalFilename();
// 2、截取图片的后缀 lastIndexOf最后出现.的位置
String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 3、生成唯一文件名
String newFileName = UUID.randomUUID().toString()+imgSuffix;
// 4、日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String dataPath = dateFormat.format(new Date());
// 5、指定文件上传后的目录
File targetPath = new File(uploadPath, dataPath); // 拼接成新目录
// mkdirs:不存在则创建,mkdir:不存在则返回false
if(!targetPath.exists()) targetPath.mkdirs(); // 如果目录不存在,则递归创建
// 6、指定文件上传后的服务器完整路径[包括文件名]
File TargetFileName = new File(targetPath, newFileName);
// 7、文件上传到指定目录
try {
multipartFile.transferTo(TargetFileName); // 文件上传到指定目录
System.out.println(TargetFileName); // D:\2021\12\05\D:\2021\12\05\68f61bc7-07b9-41c6-876b-22c9a57f5606.png
String finalFileName = dataPath + "/" + newFileName;
return visitPath+"/"+finalFileName; // 返回可访问的地址
} catch (IOException e) {
e.printStackTrace();
return "fail";
}
}
springboot中springMVC的配置类,可以通过映射路径来访问
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${file.mapPath}")
private String mapPath;
@Value("${file.uploadPath}")
private String uploadPath;
// springMVC中的方法
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 相当于把后面位置那部分起个别名,外部可以通过别名直接访问,但是直接访问上传路径是不行的
// registry.addResourceHandler(访问的路径).addResourceLocations(上传的路径);
// 这个mapPath在本地测试的时候可以用到
registry.addResourceHandler(mapPath).addResourceLocations("file:"+uploadPath);
}
}
最后还要配置一下上传文件的最大限度[设定为最大不超过50MB]
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.enabled=true
上传多张照片
上传多张照片的方法与单张相似,只不过把照片改为了数组的形式
Controller
@ApiOperation("上传照片接口")
@PostMapping("/uploadImg")
public Result uploadImg(@ApiParam("图片") @RequestParam("file")MultipartFile multipartFile[]) {
return Result.success(articleService.uploadImg(multipartFile));
}
ServiceImpl
@Override
public HashMap<String, String> uploadImg(MultipartFile multipartFile[]) {
HashMap<String, String> imgPathList = new HashMap<>(); // 用来存储照片下标和路径并返回
for (int i = 0; i < multipartFile.length; i++) {
// 1、获取真实文件名
String originalFilename = multipartFile[i].getOriginalFilename();
// 2、截取图片的后缀 lastIndexOf从后往前找
String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 3、生成唯一文件名
String newFileName = UUID.randomUUID().toString()+imgSuffix;
// 4、日期目录
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
String dataPath = dateFormat.format(new Date());
// 5、指定文件上传后的目录
File targetPath = new File(uploadPath, dataPath); // 拼接成新目录
// mkdirs:不存在则创建,mkdir:不存在则返回false
if(!targetPath.exists()) targetPath.mkdirs(); // 如果目录不存在,则递归创建
// 6、指定文件上传后的服务器完整路径[包括文件名]
File TargetFileName = new File(targetPath, newFileName);
// 7、文件上传到指定目录
try {
multipartFile[i].transferTo(TargetFileName); // 文件上传到指定目录
// System.out.println(TargetFileName); // D:\2021\12\05\D:\2021\12\05\68f61bc7-07b9-41c6-876b-22c9a57f5606.png
// 8、返回映射的完整路径
String finalFileName = dataPath + "/" + newFileName;
String path = visitPath + "/" + finalFileName;
imgPathList.put("photo"+(i+1), path);
} catch (IOException e) {
e.printStackTrace();
imgPathList.put("photo" + (i + 1), "fail");
}
}
return imgPathList;
}
springboot中springMVC的配置类,可以通过映射路径来访问这一步代码同上面