SpringBoot Vue 实现文件分片上传

SpringBoot Vue 实现文件分片上传



前言

分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。


一、使用场景

1、大文件上传
2、网络环境环境不好,存在需要重传风险的场景(马上快传完了,结果网络不稳定,又要重头开始,心态爆炸!!!)

二、使用步骤

1.前端上传分片


实现思路,前端在文件上传的时候先计算文件根据片的大小计算分片数、记录当前分片数,再一起传给后端。

这里前端只是简单写一下,没有引入Elementui

  <div>
    <input type="file" @change="selectFile">
    <button @click="upload">分片上传</button>
  </div>

data() {
    return {
      file: null,
      chunk: 0,  // 当前分片
      chunks: 0, // 总分片数
      name: ''   // 文件名
    }
  },
  methods: {
    // 可以根据后端配置的上传文件大小进行判断是否需要分片
    selectFile(e) {
      this.file = e.target.files[0]
      this.name = this.file.name
      // 分片大小根据实际需要 调整 可以配置在前端配置文件中
      this.chunks = Math.ceil(this.file.size / 1024 / 1024 / 2) // 2MB一片
    },
    upload() {
      // 现将文件分片
      const formData = new FormData()
      formData.append('file', this.file.slice(this.chunk * 1024 * 1024 * 2, (this.chunk + 1) * 1024 * 1024 * 2))
      formData.append('chunk', this.chunk)
      formData.append('chunks', this.chunks)
      formData.append('name', this.name)
      // 然后递归调用文件上传接口
      axios.post('http://localhost:8090/file/v1/upload/splitFileUpload', formData)
          .then(() => {
            this.chunk++
            if (this.chunk < this.chunks) {
              this.upload()
            }
          })
    }
  }

2.后端接收分片


  1. 接收分片文件、分片序号、总分片数和文件名;
  2. 保存上传的分片文件;
  3. 最后一个分片上传完成后,合并所有分片为完整文件;
  4. 合并完成后删除分片文件;(可以使用Apache Commons FileUtils工具类等)
  5. 返回成功响应。
 /**
     * 分片上传
     *
     * @param file   文件
     * @param chunk  块
     * @param chunks 块
     * @param name   名字
     * @return {@link ResponseEntity}<{@link String}>
     * @throws IOException ioexception
     */
    @PostMapping("/splitFileUpload")
    public ResponseEntity<String> splitFileUpload(@RequestParam("file") MultipartFile file,
                                                  @RequestParam("chunk") int chunk,
                                                  @RequestParam("chunks") int chunks,
                                                  @RequestParam("name") String name) throws IOException {
        String folder = uploadDir;
        File dir = new File(folder);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        String path = folder + name + "_" + chunk + ".part";
        try {
            file.transferTo(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件保存失败!");
        }
        if (chunk == chunks - 1) {
            // 合并所有分片
            File[] content = new File[chunks];
            for (int i = 0; i < chunks; i++) {
                content[i] = new File(folder + name + "_" + i + ".part");
            }
            FileUtil.mergeFile(content, new File(folder + name));
            // 删除分片文件
            for (int i = 0; i < chunks; i++) {
                new File(folder + name + "_" + i + ".part").delete();
            }
        }
        return ResponseEntity.ok("上传成功");
    }

注意点
Tomcat默认文件大小有限制,需要在配置文件中修改

spring:
  servlet:
    multipart:
      # 最大文件上传大小配置 防止出现The field file exceeds its maximum permitted size of 1048576 bytes错误
      max-file-size: 50MB
      max-request-size: 50MB

3.测试上传效果

在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
SpringBootVue是一种常用的前后端分离开发框架组合,可以实现前后端分离开发的需求。前端使用Vue框架进行页面开发和交互逻辑实现,后端使用SpringBoot框架进行业务逻辑和数据处理。 在实现前后端分片上传的场景中,可以通过以下步骤来实现: 1. 前端实现:在Vue上传组件中,设置相关参数,如上传文件大小、允许上传文件类型等。在Vue组件中监听文件选择事件,将文件切割成多个片段进行上传。使用FormData对象将切割后的文件上传到后端。同时,记录每个片段的索引信息,方便后端进行文件的合并和处理。 2. 后端实现SpringBoot提供了丰富的文件处理方式,在此可以使用MultipartFile接口进行文件接收。后端接收到前端传递的文件片段时,根据片段索引进行存储,并记录已经接收到的片段。当所有片段全部接收完毕后,根据索引信息进行文件合并,并进行相关处理,如文件的保存、数据库记录等等。 3. 进度展示:可以在前端实现一个进度条,通过监听每个片段的上传进度进行展示,提供更好的用户体验。 4. 错误处理:在前后端分片上传的过程中,可能会出现文件丢失、上传超时等情况。因此,需要在前后端进行错误处理,保证上传过程的可靠性。可以在前端设置超时时间,并做相应的处理,如重传片段。在后端进行错误信息的记录和处理。 总结来说,SpringBootVue可以很好地实现前后端分片上传。通过前端将文件切割成片段,并使用FormData对象进行上传,后端接收并合并片段,最终完成文件上传和处理。这样可以提高文件上传的速度和效率,同时保证可靠性和用户体验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值