Vue使用Plupload上传插件实现文件切片上传

Element原生的上传组件很好用,但是不支持分片上传功能,在上传大文件的过程中,直接上传可能因为接口访问时间过长上传中断导致文件上传失败,所以使用Plupload插件来实现文件上传功能。

用到的插件:
1、Plupload(实现文件分片上传)
2、axios(如果需要额外的调用接口可以使用,我的是需要获取uuid,才额外引用的)
3、Element(样式实现)

npm安装plupload:
npm install --save plupload

代码:

<template>
  <div style="padding-top:20px;">
    <el-button ref="VideoChose" id="VideoChose" size="mini">选择文件</el-button>
    <el-button ref="VideoChose" type="primary"  size="mini" @click="FileUplodeOn">开始上传</el-button>
    <el-card style="margin-top:20px;">
      <el-table :data="fileList" style="width: 100%">
        <el-table-column prop="id" label="文件id"></el-table-column>
        <el-table-column prop="name" label="文件名称"></el-table-column>
        <el-table-column prop="type" label="文件类型"></el-table-column>
        <el-table-column prop="size" label="文件大小" v-slot="{row}">
          {{row.size}}MB
        </el-table-column>
        <el-table-column label="进度" v-slot="{row}">
          <el-progress :text-inside="true" :stroke-width="16" :percentage="row.percentage"></el-progress>
        </el-table-column>
        <el-table-column label="取消上传" v-slot="{row}">
          <el-button
            type="danger"
            icon="el-icon-delete"
            size="mini"
            circle
            @click="removeFile(row.id)"
          ></el-button>
        </el-table-column>
        <el-table-column label="上传状态" v-slot="{row}">
          <el-link
            :type="row.loadType==0?'info':row.loadType==1?'warning':row.loadType==2?'success':'danger'"
            :underline="false"
          >{{row.loadType==0?'等待上传':row.loadType==1?'正在上传':row.loadType==2?'上传成功':'上传失败'}}</el-link>
        </el-table-column>
      </el-table>
    </el-card>
  </div>
</template>

<script>
import plupload from "plupload";
import axios from "axios";
export default {
  data() {
    return {
      show: false,
      fileList: [],
      fileOptions: {
        browse_button: "VideoChose",
        url: "你的url",
        flash_swf_url: "script/Moxie.swf",
        silverlight_xap_url: "script/Moxie.xap",
        chunk_size: "1mb",
        max_retries: 3,
        unique_names: true,
        multi_selection: true,
        views: {
          list: true,
          thumbs: true, // Show thumbs
          active: "thumbs"
        },
        filters: {
          mime_types: [
            //文件格式
            {
              title: "movie files",
              extensions: "mp4,rmvb,mpg,mxf,avi,mpeg,wmv,flv,mov,ts" //文件格式
            }
          ],
          max_file_size: "1024mb", //最大上传的文件
          prevent_duplicates: true //不允许选取重复文件
        },
        multipart_params: {
          uuid: "" //参数
        }
      }
    };
  },

  mounted() {
    //实例化一个plupload上传对象
    this.uploader.init();
    //绑定进队列
    this.uploader.bind("FilesAdded", this.FilesAdded);
    //绑定进度
    this.uploader.bind("UploadProgress", this.UploadProgress);
    //上传之前
    this.uploader.bind("BeforeUpload", this.BeforeUpload);
    //上传成功监听
    this.uploader.bind("FileUploaded", this.FileUploaded);
    //获取uuid
    axios.get("你的url").then(({ data }) => {
      this.fileOptions.multipart_params.uuid = data;
    });
  },
  computed: {
    //实例化一个plupload上传对象
    uploader() {
      return new plupload.Uploader(this.fileOptions);
    }
  },
  methods: {
    //绑定进队列
    FilesAdded(uploader, files) {
      let objarr = files.map((val, ind) => {
        let obj = {};
        obj.id = val.id;
        obj.name = val.name;
        obj.type = val.type;
        obj.size = parseInt((val.origSize / 1024 / 1024) * 100) / 100;
        obj.percentage = 0;
        obj.loadType = 0;
        return obj;
      });
      this.fileList.push(...objarr);
    },
    //上传之前回调
    BeforeUpload(uploader, file){
      this.fileList = this.fileList.map((val, ind) => {
        if (val.id == file.id) {
          val.loadType = 1;
        }
        return val;
      });
    },
    //上传进度回调
    UploadProgress(uploader, file) {
      this.fileList = this.fileList.map((val, ind) => {
        if (val.id == file.id) {
          val.percentage = file.percent;
        }
        return val;
      });
    },
    // 上传成功回调
    FileUploaded(uploader, file, responseObject) {
      this.fileList = this.fileList.map((val, ind) => {
        if (val.id == file.id) {
          if (JSON.parse(responseObject.response).status == 0) {
            val.loadType = 2;
          } else {
            val.loadType = 3;
          }
        }
        return val;
      });
    },
    //取消上传回调
    removeFile(id) {
      this.uploader.removeFile(id);
      this.fileList = this.fileList.filter((val, ind) => {
        if (val.id == id) {
          return false;
        } else {
          return true;
        }
      });
    },
    //开始上传
    FileUplodeOn() {
      this.uploader.start(); 
    }
  }
};
</script>

Plupload参数配置:
在这里插入图片描述文档参考地址: https://www.phpin.net/tools/plupload/

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件切片上传是一种将大文件分割成多个小片段进行上传的方法,这种方式可以有效地提高文件上传的效率和稳定性。在Vue实现文件切片上传可以按照以下步骤进行: 1. 首先,需要在Vue项目引入文件切片上传插件或者封装的组件。可以选择一些已经成熟的插件,例如`vue-slice-upload`或`vue-slice-upload-component`。 2. 在Vue组件使用`<input type="file">`标签创建一个文件选择框,用于选择要上传文件。 3. 监听文件选择框的`change`事件,获取选文件。 4. 利用文件对象的`slice`方法将文件切分成小片段。可以根据切片的大小,将文件分成固定大小的块。可以选择每个块的大小,常见的大小为1MB或者2MB。 5. 使用`FormData`对象创建一个空的表单对象。 6. 遍历切片后的文件块,将每个块添加到表单对象,并需要设置一个标识符来表示这个块在整个文件的位置。 7. 在表单对象添加其他的参数,例如文件名、文件类型等。 8. 使用Vue的HTTP库(例如axios)发送表单数据到后端服务器。 9. 后端服务器接收到文件切片后,将每个切片存储到相应位置。 10. 后端服务器接收到所有切片后,将切片合并为完整的文件。 11. 后端完成文件合并后,返回给前端上传成功的响应。 12. 前端接收到上传成功的响应后,进行相应的提示或者跳转。 需要注意的是,在文件切片上传过程,还需要处理上传失败、上传断等异常情况,并进行相应的处理和提示。 以上就是在Vue实现文件切片上传的基本流程,通过这种方式可以有效地提高大文件上传速度和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值