对文件流MD5后,该文件流上传到阿里云后文件为空
背景
对于前端上传的文件,后端对文件进行MD5以获取文件的唯一标识(极极小可能冲撞),然后查询文件表是否上传过,如果存在则不用再上传oss,从而节省存储空间
存在问题的代码
@SneakyThrows
public String uploadFile(MultipartFile file) {
InputStream inputStream = file.getInputStream();
String md5 = FileUtils.md5(inputStream);
//查询是否上传,否则上传oss
String url = ossTemplate.upload(inputStream);
return url;
}
出现的问题:
对文件流MD5后,该文件流上传到阿里云后文件为空
原因: 因为在计算MD5值时将输入流全部读取了一遍,并且没有重新指定位置,导致上传到OSS时InputStream已经到达了末尾,因此文件为空。
可将InputStream的位置重置为0,但InputStream不支持reset方法,方案无效
// 重置InputStream的位置
inputStream.reset();
解决方案
重新获取文件流,原因:file.getInputStream()每次获取的都是新的InputStream对象,
@SneakyThrows
public String uploadFile(MultipartFile file) {
String md5 = FileUtils.md5(file.getInputStream());
//查询是否上传,否则上传oss
String url = ossTemplate.upload(file.getInputStream());
return url;
}