文件流操作

背景:文件流的应用很广泛,各种图片,视频,文件的上传、下载都需要使用到文件流。最近项目中有使用到文件操作,所以总结出来,下面是具体流程

multipartfile

我们项目中使用到的框架是springboot, 采用前后端分离技术,前端在进行文件传递是,后端接受到的文件参数是multipartfile, 我们需要将文件上传到微信,这期间遇到问题,如果直接将multipartfile作为参数上传,是有异常的。必须转换格式上传,那么应该转换成什么格式呢,该怎么转换呢。

file

答案是file,对,没错,就是file,那么问题了,我们该如何将multipartfile转换file呢,话不多说,先上代码,后面一一讲解

示例代码

 /**
     * 图片上传
     * @param file
     * @return
     */
    @RequestMapping("/uploadPic")
    @ResponseBody
    @NoSign
    public Result uploadPic(MultipartFile file){
        String pathName = "/mnt/tempfile/";
        String originalName = file.getOriginalFilename();
        //1
        File path = new File(pathName);
        //2
        if(!path.exists()){
            path.mkdirs();
        }
        //3
        File f = new File(path, originalName);
        try {
            //4
            file.transferTo(f);
            //5
            File uploadFile = new File(pathName+ originalName);
            //6
            //业务逻辑操作 需要使用到文件流
            //7
            uploadFile.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Result.success();
    }

首先创建一个目录/mnt/tempfile/,见1、2注释,如果目录不存在则创建,注释3处,根据文件名和刚刚创建的目录创建一个空文件,接下来,看注释4,核心方法,将multipartfile文件,以刚刚创建的目录文件写入到文件中。至此,聪明的你,应该可以看出来,这个方法的妙处,我们先将Multipartfile格式的数据写入到本地,然后通过队友的目录创建一个file,就可以轻松的将multipartfile转为file格式,如注释5处所示,我们获取到一个file格式的数据流,下面注释6处我们就可以通过这个file数据流处理我们的数据了

如果你以为就这样就结束了,那就很遗憾了,我们还有关键的一部,那就是对于刚刚在本地创建的文件的删除处理,试想下,那个文件只是一个临时中转文件,如果不删除,时间久了,上传文件多了,对磁盘也是一个消耗,哈哈~~,毕竟服务器的资源还是很宝贵的。眼睛精的你,一定会发现注释7中的文件删除方法,但是在你操作完之后,你会很奇怪的发现文件还是存在的,并没有被删除掉,这个什么原因呢,一脸蒙蔽,哪里出错了嘛?

好了,该揭晓答案了,原因是我们在对上面的文件流进行业务操作的时候,对文件流一直占用着,一直没有是否,所以,这边删除一直不能成功,而且也没有任何报错,是个很重要的细节点,代码如下所示:

public static String md5HashCode(InputStream fis) {
        try {
            MessageDigest MD5 = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[8192];
            int length;
            while ((length = fis.read(buffer)) != -1) {
                MD5.update(buffer, 0, length);
            }
            return new String(Hex.encodeHex(MD5.digest()));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }finally {
            if(fis != null){
                try {
                    //1
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

如注释1处所示,这边对文件流进行了操作,所以一定要进行关闭。

好了,今天的分享就到这边了,虽然不是很深入,但很实用,希望其他朋友不会再遇到这种坑了,若有哪边不正确,欢迎指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值