SpringBoot中图片上传在Linux服务器部署找不到的问题
说明
在Windows部署是, 写的默认指定盘符(C), 这种方法在Linux部署时是不可行的, 所以要将路径改成相对路径, windows部署路径就在所部属的盘符, linux部署路径就在根路径。
一 配置WebMvcConfig
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private AccessLimtInterceptor accessLimtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(accessLimtInterceptor);
super.addInterceptors(registry);
}
@Value("/jiuqi/upload/")
private String imagePath;
@Value("/upload/")
private String upload;
/**
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler()里配置需要映射的文件夹
//addResourceLocations()配置文件夹在系统中的路径,使用绝对路径,格式为“file:你的路径”
//registry.addResourceHandler(upload + "**").addResourceLocations("file:C:\\jiuqi\\upload\\");
registry.addResourceHandler(upload + "**").addResourceLocations("file:" + imagePath);
}
}
这里将
addResourceLocations("file:C:\\jiuqi\\upload\\")
指的是将图片保存到指定的
C
盘改成
addResourceLocations("file:" + imagePath)
这样可以理解为保存在文件运行的更目录下,
Windows
运行保存在项目运行的盘符目录下,
Linux
运行保存在根目录下。
二 编写uploadController
引入一个图片处理依赖
Thumbnailator
<!-- https://mvnrepository.com/artifact/org.tinygroup/org.tinygroup.thumbnails -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.14</version>
</dependency>
思路:
(1)
首先获取图片: xxx.jpg
(2)
将图片重命名并且加上图片原有的后缀: xx-xx-xx.jpg
(3)
将图片保存在固定目录中: /jiuqi/upload/xx-xx-xx.jpg
(4)
最后返回服务器IP+端口号+目录(反射的目录)+图片名称: http://localhost:8080/upload/xx-xx-xx.jpg
注意:
(3)中/jiuqi/upload/是物理真实路径
(4)中/upload是反射的虚拟路径
//配置图片保存的路径
@Value("/jiuqi/upload")
private String folder;
//配置图片反射
@Value("/upload/")
private String uploadPath;
//文章图片的上传
@PostMapping("/blogs/imgUpload")
@ResponseBody
public FileInfo imageUpload(HttpServletRequest request, @RequestParam(value = "editormd-image-file", required = false) MultipartFile file) throws IOException {
/**
* filename 图片名
* basePath 服务器IP加端口号
* simpleUUID 图片重命名
* photoName 图片重命名加后缀
* fileNamePath 图片加保存的路径
* fileUrl 图片的链接地址
*/
String filename, basePath, simpleUUID, photoName, fileNamePath, fileUrl;
if (file != null && !file.isEmpty()) {
//获取文件名
filename = file.getOriginalFilename();
//获取协议号
basePath = request.getScheme()
+ "://"
+ request.getServerName()//获取IP地址
+ ":"
+ request.getServerPort()//获取端口号
+ request.getContextPath();//获取工程路径
String[] split = filename.split("\\.");
//只接受jpg、png、gif、jpeg、bmp、webp文件
if ("jpg".equalsIgnoreCase(split[1]) ||
"png".equalsIgnoreCase(split[1]) ||
"gif".equalsIgnoreCase(split[1]) ||
"jpeg".equalsIgnoreCase(split[1]) ||
"bmp".equalsIgnoreCase(split[1]) ||
"webp".equalsIgnoreCase(split[1])) {
simpleUUID = IdUtil.simpleUUID();
photoName = simpleUUID + "." + split[1];
fileNamePath = folder + File.separator + photoName;
File destFile = new File(fileNamePath);
判断是否存在, 不存在就创建
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
//压缩图片并保存
Thumbnails.of(file.getInputStream()).scale(0.8).toFile(destFile);
fileUrl = basePath + uploadPath + photoName;
return new FileInfo(1, "上传成功", fileUrl);
}
}
return null;
}
最后返回是一个实体类
FileInfo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileInfo {
private int success = 1;
private String message = "上传成功";
private String url;
}