1、编辑application.properties文件,配置文件上传目录
#图片保存目录
file-save-path=E:/images/
2、在controller中写入方法
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Slf4j
@RestController
@RequestMapping("file")
public class FileController {
/**
* 时间格式化
*/
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");
/**
* 图片保存路径,自动从yml文件中获取数据
* 示例: E:/images/
*/
@Value("${file-save-path}")
private String fileSavePath;
@PostMapping("/upload")
public ReturnResult upload(MultipartFile file, HttpServletRequest request) {
//1.后半段目录: 2020/03/15
String directory = simpleDateFormat.format(new Date());
/**
* 2.文件保存目录 E:/images/2020/03/15/
* 如果目录不存在,则创建
*/
File dir = new File(fileSavePath + directory);
if (!dir.exists()) {
dir.mkdirs();
}
log.info("图片上传,保存位置:" + fileSavePath + directory);
//3.给文件重新设置一个名字
//后缀
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String newFileName= UUID.randomUUID().toString().replaceAll("-", "")+suffix;
//4.创建这个新文件
File newFile = new File(fileSavePath + directory + newFileName);
//5.复制操作
try {
file.transferTo(newFile);
//协议 :// ip地址 :端口号 / 文件目录(/images/2020/03/15/xxx.jpg)
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/images/" + directory + newFileName;
log.info("图片上传,访问URL:" + url);
return ReturnResult.success("上传图片成功", url);
} catch (IOException e) {
return ReturnResult.fail("上传图片失败");
}
}
}
ReturnResult类是数据封装类,用于响应给前端数据,可以使用自己的
3、配置资源映射
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 图片保存路径,自动从yml文件中获取数据
* 示例: E:/images/
*/
@Value("${file-save-path}")
private String fileSavePath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* 配置资源映射
* 意思是:如果访问的资源路径是以“/images/”开头的,
* 就给我映射到本机的“E:/images/”这个文件夹内,去找你要的资源
* 注意:E:/images/ 后面的 “/”一定要带上
*/
registry.addResourceHandler("/images/**")
.addResourceLocations("file:"+fileSavePath);
}
}
如果添加了拦截器,记得放行/images/**
4、测试上传并访问图片,返回的数据:
{
"retMsg": "上传图片成功",
"code": 0,
"data": "http://localhost:8080/images/2022/03/23/c0436ac80dc643c8b58ea390d42905f2.jpg"
}