接到一个需求:实现上传文件(图片)功能,并把文件(图片)保存到服务器文件夹下,返回可以访问的路径url(因为前端需要“回显”上传的图片)。
1、设置绝对路径
在spring boot项目打成jar包后,可以成功上传。但是根据返回的url,找不到上传成功的文件。这时候我们需要为上传文件设置绝对路径。
#文件上传目录(注意Linux和Windows上的目录结构不同)
file:
uploadFolder: D:///szzb-welfarework/import/img/zzysj/
注意文件路径最后的 “/”
2、设置虚拟路径,映射访问绝对路径下资源
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置资源映射:设置虚拟路径,访问绝对路径下资源:访问 http://localhost:9090/api/file/xxx.txt访问d:///uploadFiles/下的资源
registry.addResourceHandler("/api/file/**") //虚拟路径
.addResourceLocations("file:" + "D:///szzb-welfarework/import/img/zzysj/"); //绝对路径
}
}
3、文件(图片)上传实现
/**
* 图片保存路径,自动从yml配置文件中获取数据
*/
@Value("${file.uploadFolder}")
private String uploadPath;
/**
* 文件(图片)上传
* @param file 图片文件
*/
@SneakyThrows
@Override
public String uploadFile(MultipartFile file, String projectId, HttpServletRequest request) {
//文件原名称
String oldFilename = file.getOriginalFilename();
//图片名后缀:.jpg、.png
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
//uuid
String uuid = UUID.randomUUID().toString();
//文件新名称
String newFileName = uuid + suffix;
//创建保存上传文件的文件夹
File folder = new File(uploadPath + newFileName);
if (!folder.getParentFile().exists()) {
folder.getParentFile().mkdirs();
}
//文件写入到该文件夹下
file.transferTo(folder);
//获得本机Ip(获取的是服务器的Ip)
InetAddress inetAddress = InetAddress.getLocalHost();
String ip = inetAddress.getHostAddress();
//返回保存的url,根据url可以进行文件查看或者下载
String fileDownloadUrl = request.getScheme() + "://" + ip + ":" + request.getServerPort() + "/api/file/" + newFileName;
//ps: 在这里可以把路径url存到数据库
//Entity entity = new Entity()
//entity.setUrl(fileDownloadUrl);
//返回保存的url
return fileDownloadUrl;
}