1.controller代码
@ApiOperation(value = "用户头像修改", notes = "用户头像修改", httpMethod = "POST")
@PostMapping("uploadFace")
public IMOOCJSONResult uploadFace(
@ApiParam(name = "userId", value = "用户id", required = true)
@RequestParam String userId,
@ApiParam(name = "file", value = "用户头像", required = true)
MultipartFile file,
HttpServletRequest request, HttpServletResponse response) {
// .sh .php
// 定义头像保存的地址
// String fileSpace = IMAGE_USER_FACE_LOCATION;
String fileSpace = fileUpload.getImageUserFaceLocation();
// 在路径上为每一个用户增加一个userid,用于区分不同用户上传
String uploadPathPrefix = File.separator + userId;
// 开始文件上传
if (file != null) {
FileOutputStream fileOutputStream = null;
try {
// 获得文件上传的文件名称
String fileName = file.getOriginalFilename();
if (StringUtils.isNotBlank(fileName)) {
// 文件重命名 imooc-face.png -> ["imooc-face", "png"]
String fileNameArr[] = fileName.split("\\.");
// 获取文件的后缀名
String suffix = fileNameArr[fileNameArr.length - 1];
if (!suffix.equalsIgnoreCase("png") &&
!suffix.equalsIgnoreCase("jpg") &&
!suffix.equalsIgnoreCase("jpeg") ) {
return IMOOCJSONResult.errorMsg("图片格式不正确!");
}
// face-{userid}.png
// 文件名称重组 覆盖式上传,增量式:额外拼接当前时间
String newFileName = "face-" + userId + "." + suffix;
// 上传的头像最终保存的位置
String finalFacePath = fileSpace + uploadPathPrefix + File.separator + newFileName;
// 用于提供给web服务访问的地址
uploadPathPrefix += ("/" + newFileName);
File outFile = new File(finalFacePath);
if (outFile.getParentFile() != null) {
// 创建文件夹
outFile.getParentFile().mkdirs();
}
// 文件输出保存到目录
fileOutputStream = new FileOutputStream(outFile);
InputStream inputStream = file.getInputStream();
IOUtils.copy(inputStream, fileOutputStream);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.flush();
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
return IMOOCJSONResult.errorMsg("文件不能为空!");
}
// 获取图片服务地址
String imageServerUrl = fileUpload.getImageServerUrl();
// 由于浏览器可能存在缓存的情况,所以在这里,我们需要加上时间戳来保证更新后的图片可以及时刷新
String finalUserFaceUrl = imageServerUrl + uploadPathPrefix
+ "?t=" + DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);
// 更新用户头像到数据库
Users userResult = centerUserService.updateUserFace(userId, finalUserFaceUrl);
userResult = setNullProperty(userResult);
CookieUtils.setCookie(request, response, "user",
JsonUtils.objectToJson(userResult), true);
// TODO 后续要改,增加令牌token,会整合进redis,分布式会话
return IMOOCJSONResult.ok();
}
说明:
1.使用FileUpload类,用于读取properties配置文件的头像保存的地址等信息
2.要使用路径分隔符,避免夸平台找不到路径的错误
比如说要在temp目录下建立一个test.txt文件,在Windows下应该这么写:
File file1 = new File ("C:\tmp\test.txt");
在Linux下则是这样的:
File file2 = new File ("/tmp/test.txt");
如果要考虑跨平台,则最好是这么写:
File myFile = new File("C:" + File.separator + "tmp" + File.separator, "test.txt");
// 由于浏览器可能存在缓存的情况,所以在这里,我们需要加上时间戳来保证更新后的图片可以及时刷新
String finalUserFaceUrl = imageServerUrl + uploadPathPrefix
+ "?t=" + DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);
4.要配置静态资源的映射,才能访问路径中的图片资源,另外也要配置映射swagger2,资源默认放在classpath:/META-INF/resources/中
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 实现静态资源的映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/META-INF/resources/") // 映射swagger2
.addResourceLocations("file:/workspaces/images/"); // 映射本地静态资源
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
保存的数据库路径
http://localhost:8089/foodie/faces\1908189H7TNWDTXP/face-1908189H7TNWDTXP.jpg?t=20210222225944
浏览器可以直接访问图片
http://localhost:8089/foodie/faces\1908189H7TNWDTXP/face-1908189H7TNWDTXP.jpg
5.配置文件上传大小
servlet:
multipart:
max-file-size: 512000 # 文件上传大小限制为500kb
max-request-size: 512000 # 请求大小限制为500kb