Spring 框架的 MultipartFile

问题

最近在项目中需要使用文件的上传,传统的在Java中实现文件上传,一直是一种令人烦躁的工作。但是随着Spring框架的发展,使用Spring框架中的MultipartFile来处理文件就是一件比较简单的事情。今天就和大家讨论一下这个问题,如有问题可以在评论区点出,谢谢!

MultipartFile

MultipartFile为org.springframework.web.mutipart包下的一个类,也就是说如果想使用MultipartFile这个类就必须引入spring框架,换句话说,如果想在项目中使用MultipartFile这个类,那么项目必须要使用spring框架才可以,否则无法引入这个类。MultipartFile翻译成中文来讲就是“多组件的文档”,不用太在乎他的中文含义,一般来讲使用MultipartFile这个类主要是来实现以表单的形式进行文件上传功能
在这里插入图片描述
首先MultipartFile是一个接口,并继承自InputStreamSource,且在InputStreamSource接口中封装了getInputStream方法,该方法的返回类型为InputStream类型,这也就是为什么MultipartFile文件可以转换为输入流

通过以下代码即可将MultipartFile格式的文件转换为输入流。

multipartFile.getInputStream();

常用方法介绍

  • getName方法:
    getName方法获取的是前后端约定的传入文件的参数的名称,在SpringBoot后台中则是通过@Param(“uploadFile”) 注解定义的内容。

  • getOriginalFileName方法
    getOriginalFileName方法获取的是文件的完整名称,包括文件名称+文件拓展名。可以用此方法判断给定的文件是否符合相应的文件后缀需要。

  • getContentType方法
    getContentType方法获取的是文件的类型,注意是文件的类型,不是文件的拓展名。比如:image/jpeg

  • isEmpty方法
    isEmpty方法用来判断传入的文件是否为空,如果为空则表示没有传入任何文件。常用于做判空处理与参数判断

  • getBytes方法
    getBytes方法用来将文件转换成一种字节数组的方式进行传输,会抛出IOException异常。用于将文件转为字节数组,然后用输出流输出

  • getInputStream方法
    getInputStream方法用来将文件转换成输入流的形式来传输文件,会抛出IOException异常。

  • transferTo方法
    transferTo方法用来将接收文件传输到给定目标路径,会抛出IOException、IllegalStateException异常。

MultipartFile的一些使用技巧

  • 我们在使用MultipartFile作为参数传递的时候,可以将MultipartFile声明为一个数组,这样就能支持多文件传输,如果只需要传输一个文件,则去掉数组就好了。
  • 可以根据MultipartFile的getSize方法来获取到传输文件的大小,这样就能限定传输过来的文件的大小了。

案例

更新用户头像,并把照片保存到本地,这里采用单文件传输。

@PostMapping("/upload")
public String uploadHeader(MultipartFile headerImage, Model model) {
        // 判断有没有图片
        if (headerImage == null) {
            model.addAttribute("error", "您还没有选择图片!");
            return "site/setting";
        }

        // 通过图片的后缀名来判断图片格式
        String fileName = headerImage.getOriginalFilename(); // 获得原始文件名
        String suffix = fileName.substring(fileName.lastIndexOf(".")); // 获得文件后缀名
        if (StringUtils.isBlank(suffix)) { // 文件后缀名为空
            model.addAttribute("error", "文件格式不正确!");
            return "site/setting";
        }

        // 生成随机文件名
        fileName = CommunityUtil.generateUUID() + suffix;
        // 确定文件存放的路径,这里先存到本地服务器上
        File dest = new File(uploadPath + "/" + fileName);
        try {
            // 存储文件 (可以检查uploadPath是否存在, 否则创建该目录)
            headerImage.transferTo(dest);
        } catch (IOException e) {
            logger.error("上传文件失败:", e.getMessage());
            throw new RuntimeException("上传文件失败,服务器发生异常!", e);
        }

        // 更新当前用户头像的路径(web访问路径)
        // http://localhost:8083/community/user/header/xxx.png
        User user = hostHolder.getUser(); // 得到当前用户
        String headerUrl = domain + contextPath + "/user/header/" + fileName;
        userService.updateHeader(user.getId(), headerUrl); // 更新数据库

        return "redirect:/index";
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值