出现问题的背景是做一个缩略图上传的功能,把接收到的文件生成缩略图然后上传到FastDFS的文件服务器,在生成缩略图的时候会生成一个临时文件,这个临时文件怎么都删不掉。
开始认为是在生成缩略图的时候使用流未关闭,可是检查了代码没有发现任何问题,流确实都关闭了
这是文件转换的代码:
public static File multipartFileToFile1(MultipartFile multipartFile) throws IOException {
InputStream inputStream = null;
OutputStream os = null;
try {
inputStream = multipartFile.getInputStream();
File file = new File(FileUtils.getPath() + UUidUtil.getStrUUID() + "." + FileUtils.getPrefix(multipartFile));
os = new FileOutputStream(file);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
return file;
} catch (Exception e) {
e.printStackTrace();
} finally {
inputStream.close();
os.flush();
os.close();
}
return null;
}
这是生成缩略图的代码:
public static void handlePicture(File file) {
try {
Thumbnails.of(file).scale(0.3f).toFile(file);//按比例缩小
} catch (IOException e) {
e.printStackTrace();
}
}
完整上传的代码:
@PostMapping(value = "/uploadHandlePic", headers = "content-type=multipart/form-data")
@ApiOperation(value = "上传文件到fastDFS并返回缩略图")
public ResultMessage getHandlePicture(@ApiParam(name = "file", value = "file", required = true)
@RequestParam("file") MultipartFile multipartFile) throws CoreServiceException {
File file = null;
try {
file = FileUtils.multipartFileToFile1(multipartFile);
FileUtils.handlePicture(file);
String uploadFile = fastDFSClient.uploadFile(file);
return ResultMessage.success(uploadFile);
} catch (Exception e) {
e.printStackTrace();
throw new CoreServiceException(ExceptionCode.EXCEPTION.getCode(), ExceptionCode.EXCEPTION.getMessage());
} finally {
FileUtils.deleteFile(file);
}
}
但临时文件就是删除不了,经过断点调试发现在断点里等几秒再通过就可以删除,然后想到会不会是fastDfs的问题,于是进去看代码:
这里使用到了流却没有关闭流,当初是直接从网上找的代码,没有仔细检查,出了这么个问题,浪费的几个小时的时间,出了删除不了文件的问题,大部分的原因还是没有关闭流,一定要认真检查代码。