Vue 实现单个超大文件 分批上传

  1. 项目中有个系统更新的需求, 又不能整个文件上传,如果文件特别大,几个G大小,会直接把内存占满,卡死. 需求是,把整个文件分批发送, 后台拿到一部分 用一部分,然后就"扔"掉.这样即完成了系统更新,又不会把内存卡死
    下面是解决方法, 后端同事丢给我的js版本,用Vue的写法改造了一下, 亲测有效!
    有大神看懂的可以解释下:
    HTML代码:
	<el-button type="primary" @click="$refs.file.click()">上传<i class="el-icon-upload el-icon--right"></i></el-button> 
	 <input
              type="file"
              id="el1"
              ref="file"
              @change="change"
              style="display: none"
            />
 	<el-button class="shengji" type="primary" @click="shengji">升级</el-button>

JS代码:

 data() {
    return {
      setStatus: "",
      f: "",
    };
  },
   methods: {
    sendFileData(name, data, chunkSize) {
      var sendChunk = (offset) => {
        this.jindu = (offset / data.length) * 100;
        var chunk = data.subarray(offset, offset + chunkSize) || "";
        var opts = { method: "POST", body: chunk };
        var url =
          "/upload?offset=" + offset + "&name=" + encodeURIComponent(name);
        this.setStatus =
          "sending bytes " +
          offset +
          ".." +
          (offset + chunk.length) +
          " of " +
          data.length;
        // console.log(data);
        fetch(url, opts).then(function () {
          // console.log(res);
          if (chunk.length > 0) sendChunk(offset + chunk.length);
        });
      };
      sendChunk(0);
    },
    change(ev) {
      if (!ev.target.files[0]) return;
      let ff = ev.target.files[0];
      this.f = ev.target.files[0];
      let r = new FileReader();
      r.readAsArrayBuffer(ff);
      // r.onload = () => {
      //   ev.target.value = "";
      //   this.sendFileData(f.name, new Uint8Array(r.result), 4096);
      // };
      //  this.jindu = 0;   // 也是进度条, 再次上传,进图条归零
    },
    shengji() {
      // console.log(this.f.size);
     //  this.tiji = this.f.size;		// 这块是 为了计算文件大小, 写上传进度条用的
      let r = new FileReader();
      r.readAsArrayBuffer(this.f);
      r.onload = () => {
        // ev.target.value = "";		// 不知道这块为啥报错,但注释了对上传又没影响
        this.sendFileData(this.f.name, new Uint8Array(r.result), 4096);     // 应该是每次上传4096KB(4Mb)的文件
      };
    },
  },

这是从上一篇js版本文章改编过来的,本来文件上传成功到浏览器后,自动触发,更新到浏览器. 为了确认文件,又加了手动上传提交的按钮.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3是一种流行的JavaScript框架,用于构建用户界面。要实现视频上传功能,可以使用Vue 3结合一些其他库和技术来完成。 首先,你可以使用Vue 3的组件化特性创建一个上传视频的组件。在该组件中,你可以使用HTML的`<input type="file">`元素来让用户选择要上传的视频文件。 接下来,你可以使用一些第三方库来处理视频上传的逻辑。例如,你可以使用`axios`库来发送HTTP请求将视频文件上传到服务器。你可以在组件中监听文件选择事件,并在事件处理程序中使用`axios`发送POST请求将视频文件上传到服务器。 以下是一个简单的示例代码: ```vue <template> <div> <input type="file" @change="handleFileChange"> <button @click="uploadVideo">上传视频</button> </div> </template> <script> import axios from 'axios'; export default { methods: { handleFileChange(event) { this.videoFile = event.target.files; }, uploadVideo() { const formData = new FormData(); formData.append('video', this.videoFile); axios.post('/api/upload', formData) .then(response => { // 处理上传成功的逻辑 }) .catch(error => { // 处理上传失败的逻辑 }); } } } </script> ``` 在上面的代码中,`handleFileChange`方法会在用户选择视频文件时被调用,将选择的文件保存到`videoFile`变量中。`uploadVideo`方法会在用户点击上传按钮时被调用,使用`axios`库发送POST请求将视频文件上传到服务器的`/api/upload`接口。 请注意,上述代码只是一个简单的示例,实际的视频上传功能可能需要更多的处理逻辑,例如文件类型验证、文件大小限制、进度条显示等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值