MultipartFile实现文件上传功能

发表于:2022-4-08 09:57

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Cz范特西    来源:稀土掘金

  前言
  MultipartFile是spring类型,代表HTML中form data方式上传的文件,包含二进制数据+文件名称。在文件上传这方面能帮助我们快速简洁实现。
  使用
  1、yml配置文件
  spring:
    servlet:
      multipart:
        max-file-size: 10MB     #单个最大文件大小,默认是1MB
        max-request-size: 100MB   #总请求文件大小

  2、API介绍
  multipartFile.getContentType()//在控制台打印文件的类型
  multipartFile.getName()//返回文件的名称
  multipartFile.getOriginalFilename()//返回文件的原文件名
  multipartFile.getSize() //单位为字节
  multipartFile.getInputStream() //文件转换为输入流
  multipartFile.transferTo(new File("D:/"));
    /*上传的文件需要保存的路径和文件名称,
              本质上还是使用了流,只不过是封装了步骤,相当于:
  File file = new File("D:/");
          file.createNewFile();
          FileOutputStream stream = new FileOutputStream(file);
          stream.write(multipartFile.getBytes());
          stream.close();
    */
  
  3、文件上传示例
  @RestController
  @Slf4j
  public class UploadTest {
      @RequestMapping("/upload")
      public String upLoad(@RequestPart("file") MultipartFile multipartFile){
          log.info("文件上传开始");
          log.info("文件{}",multipartFile.getOriginalFilename());
          
          if (!multipartFile.isEmpty()){
              try {
                  //上传的文件需要保存的路径和文件名称,路径需要存在,否则报错
                  multipartFile.transferTo(new File("D:/"++multipartFile.getOriginalFilename()));
              } catch (IllegalStateException | IOException e){
                  e.printStackTrace();
                  return "上传失败";
              }
          } else {
              return "请上传文件";
          }
          return "上传成功";
      }
  }
  
  注意:
  @RequestPart("file")主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数。
  因此在此处,前端上传文件时,key为file,value为文件。
  4、postman测试
  由于本人只会后端不会做前端,懒得查资料写前端上传文件功能,就使用postman进行测试
  1)将请求方式改为post。
  2)Headers中设置设置key=Content-Type,value=multipart/form-data(默认已设置)。
  3)在Body中选择form-data,选择File格式,KEY填写在后端代码中编写的@RequestPart("file")中的file,value选择你想要上传的文件。
  4)点击send即可实现上传功能。
  文件下载
  既然文件上传功能有了,就在此介绍一下如何实现文件下载功能。
  @RestController
  public class DownTest {
      @RequestMapping("/download")
      public ResponseEntity<Object> download() throws IOException {
          //提供下载的文件的路径
          FileSystemResource file = new FileSystemResource("D:\\cloud/pom.xml");
          HttpHeaders headers = new HttpHeaders();
          headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
          //这里定制下载文件的名称
          headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getFilename()));
          headers.add("Pragma", "no-cache");
          headers.add("Expires", "0");
          return ResponseEntity.ok()
                  .headers(headers)
                  .contentLength(file.contentLength())
                  .contentType(MediaType.parseMediaType("application/octet-stream"))//以二进制流的形式返回
                  .body(new InputStreamResource(file.getInputStream()));
      }
  }

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号