前言
本文将实现在数据库中存储图片url,url可以在浏览器中访问查看。
整体思路为:
- 上传图片到本地指定地址
- 为图片分配url保存至数据库
- 根据分配url,进行物理地址映射到本地指定地址
具体实现
controller层:
上传图片到本地指定地址,为图片分配url保存至数据库
java
@PostMapping("/uploadImg")
@Operation(summary = "上传图片")
public Result<String> upload(MultipartFile file, HttpServletRequest request) {
String subPath = "\\upload\\Img\\";
String basepath = webFileUrl;
String path = "";
String vpath = "";
String fileType = "";
Map<String, Object> resultPath = WebFileUtils.saveFile(file, basepath + subPath, request);
path = resultPath.get("path").toString();
fileType = resultPath.get("fileType").toString();
vpath = "/statics/upload/" + "Img" + "/" + fileType + "/" + new File(path).getName();
return R2.ok(vpath,"上传成功");
}
其中的WebFileUtils类:
java
public static Map<String, Object> saveFile(MultipartFile file, String webFileUrl, HttpServletRequest request) {
System.out.println();
String realPath, rootPath = webFileUrl;
if (webFileUrl.equals("")) {
//设置主路径
realPath = request.getServletContext().getRealPath("");
//将路径设置到当前项目同级,并创建upload文件夹
rootPath = new File(realPath).getParent() + "\\upload\\";
}
//组合文件名
String filename = System.currentTimeMillis() + "_" + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("\\") + 1);
//获取文件后缀
String extension = "." + FilenameUtils.getExtension(filename);
//生成新的文件名
String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-","") + extension;
// 区分上传文件是图片还是视频
String fileType;
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = fileNameMap.getContentTypeFor(filename);
if (contentTypeFor == null){
fileType = "video";
rootPath = rootPath + "\\" + fileType +"\\";
}else{
fileType = "image";
rootPath = rootPath + "\\" + fileType +"\\";
}
String filePath = rootPath + newFileName;
File localFile = new File(filePath);
// 检测是否存在目录,不存在则创建
if (!localFile.getParentFile().exists()) {
localFile.getParentFile().mkdirs();
}
try {
//保存文件
file.transferTo(localFile);
} catch (IOException e) {
e.printStackTrace();
}
Map<String,Object> result = new MapUtils();
result.put("path", localFile.getAbsolutePath());
result.put("fileType", fileType );
//返回文件的绝对路径
return result;
}
此处webFileUrl,替换为上传文件本地保存地址。
config:
在此处完成物理地址映射到本地指定地址
java
@Configuration
public class UploadConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/api/statics/upload/Img/image/**")
.addResourceLocations("file:本地保存地址");
}
}
至此,如果需要实现前端图片预览查看功能,请求数据库中保存的图片url即可。