开始
E:\学习中\Java架构师体系课:还原千万级项目从0到100全过程,技术&思维双提升-wjw\阶段一:单体电商项目架构,开发与上线(1~5周)\04.用户中心 ,订单\评价管理开发\第2章 用户中心 -上传头像功能开发
完善代码,文件上传
file有个方法,getOriginalFilername获取文件的原始文件名。
我们要操作字符串类型的话,还是要判断是否为空。不为空的情况下,才能对文件名进行处理。
我们以这种形式去保存
这种上传,属于覆盖式的上传。因为每次上传的文件名都是一样的。
文件最终上传保存的地址
判断这个路径是否为空,如果为空就生成这样一个路径
加上s,把它的父级目录都会生成
这里有个IO流的异常,这里先暂时不管。
获取文件的输入流
文件的保存
里面有很多的方法,这里我们使用这个方法。参数是需要一个inputStream和一个outputStream
把整个方法进行try catch
ctrl+alt+T 选中大代码 快速包在try catch里面。如果ctrl+alt+t不管用的话,那么再加上windows键
ctrl+alt+windows+t
这样刚才红色波浪线就就会被catch到。
fileOutputStream一旦使用完毕就要被关闭。首先把 fileOutputStream在上面声明
在finally里面关闭
这里也会有相应的异常
重启服务,测试
目前文件只到faces这个文件夹
启动服务,报错
再次重启
图片没有发生更改,这是因为我们后端代码还没有把路径给返回回来。
看磁盘路径
最终代码
@ApiOperation(value = "修改用户信息",notes = "修改用户信息",httpMethod = "POST")
@PostMapping("uploadFace")
public IMOOCJSONResult uploadFace(
@ApiParam(name = "userId",value = "用户id",required = true)
@RequestParam(name = "userId") String userId
,@ApiParam(name = "file",value = "用户头像",required = true) MultipartFile file
, HttpServletRequest request, HttpServletResponse response
) {
// 定义头像保存的地址
String fileSpace=IMAGE_USER_FACE_LOCATION;
//在路径上位每一个用户增加一个userId 用于区分不同用户上传
String uploadPathPrefix = File.separator+userId;
// 开始上传
if(file!=null){
FileOutputStream fileOutputStream=null;
try {
// 货的文件上传的文件名称
String fileName = file.getOriginalFilename();
if(StringUtils.isNotBlank(fileName)) {
// 保存文件的格式 face-{user-id}.png
String[] fileNameArr = fileName.split("\\.");
// 获得文件的后缀名
String suffix = fileNameArr[fileNameArr.length - 1];
// face-{user-id}.png
// 文件名称重组 覆盖式上传 增量式:自己额外拼接当前时间
String newFileName = "face-"+userId+"."+suffix;
// 上传的头像最终保存的位置
String finalFacePath = fileSpace+uploadPathPrefix+File.separator+newFileName;
File outFile=new File(finalFacePath);
if(outFile.getParentFile()!=null) {
// 创建文件夹
outFile.getParentFile().mkdir();
}
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("文件不能为空!");
}
return IMOOCJSONResult.ok();
}