对文件流MD5后,该文件流上传到阿里云后文件为空

发布时间 2023-06-27 13:38:10作者: 进击的小蔡鸟

背景

对于前端上传的文件,后端对文件进行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;
    }