el-upload大文件切片上传实现示例详解

 更新时间:2023年03月15日 09:06:03   作者:小亮_money  
这篇文章主要为大家介绍了el-upload大文件切片上传实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

前端上传大文件时,会出现跨域错误等各类错误,另切片上传可以提高上传效率。固进行以下代码记录,方便后期cv(😄)

html

<el-upload action="" :data="uploadData" :http-request="uploadFileContinue">
</el-upload>

js

export default {
  name: '',
  data () {
    return {
    uploadData:{
        key: ""
    }
  },
  watch: {
  },
  computed: {
  },
  created () {
  },
  mounted () {
  },
  destroyed () {
  },
  methods: {
    async uploadFileContinue({ data, file }) {
            //data是上送的额外参数,也就是el-upload中的:data="uploadData",根据实际需求带入
            //file是文件
            let url = "/api/XXX" //上传文件接口
            try {
                data.file = file;
                data.key = file.name
                const res = await this.uploadByPieces(url, data);
                return res;
            } catch (e) {
                return e;
            }
        },
       async uploadByPieces:(url, { key,file }) {
            // 每5M一片,进行切片
            const chunkSize = 5 * 1024 * 1024; // 5MB一片
            // 总片数
            const chunkCount = Math.ceil(file.size / chunkSize); 
            // 生成promise集合,进行异步处理
            // 也就是Promise.all的使用
            const promiseList = []
            try {
                for (let index = 0; index < chunkCount; ++index) {
                    //异步执行分片上传
                    promiseList.push(readChunk(index))
                }
                const res = await Promise.all(promiseList)
                return res
            } catch (e) {
                return e
            }
            //-----以上是切片上传的主要逻辑,是比较简单的
            //-----以下是切片时需要调用的方法
            // 获取当前chunk数据
            const getChunkInfo = (file, index) => {
                let start = index * chunkSize;
                let end = Math.min(file.size, start + chunkSize);
                let chunk = file.slice(start, end);
                return { start, end, chunk };
            };
            // 分片上传接口
            const uploadChunk = (data) => {
            // 因该项目用到的是ajax,所以进行以下写法
            // 同样可更改为axios,原理一样,主要是配合插件,返回Promise
                return new Promise((resovle, reject) => {
                    $.ajax({
                        url: url,
                        type: 'POST',
                        data: data,
                        contentType: false,
                        processData: false,
                        success: function (res) {
                            resovle(res);
                        },
                        error: function (err) {
                            reject(err);
                        }
                    })
                })
            }
            // 针对单个文件进行chunk上传
            const readChunk = (index) => {
                const { chunk } = getChunkInfo(file, index);
                let formdata = new FormData();
                formdata.append("key", key);
                formdata.append("file", chunk);
                return uploadChunk(formdata)
            }
        },
  }
}

备注

切片上传后,需要将文件合并才能使用文件的预览,文件合并由服务端进行。

以上就是el-upload大文件切片上传实现示例详解的详细内容,更多关于el upload大文件切片上传的资料请关注脚本之家其它相关文章!

相关文章

  • Vue.js中数组变动的检测详解

    Vue.js中数组变动的检测详解

    这篇文章给大家主要介绍了Vue.js中数组变动的检测,文中给出了详细的示例代码和过程介绍,相信会对大家的理解和学习很有帮助,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 解决vue前后端端口不一致的问题

    解决vue前后端端口不一致的问题

    这篇文章主要介绍了解决vue前后端端口不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Vue3+vite路由配置优化(自动化导入)

    Vue3+vite路由配置优化(自动化导入)

    这篇文章主要介绍了Vue3+vite路由配置优化(自动化导入),需要的朋友可以参考下
    2023-09-09
  • webpack如何打包一个按需引入的vue组件库

    webpack如何打包一个按需引入的vue组件库

    在vue项目开发中,我们会将经常用到的逻辑或模块抽象成组件,对于那些多个项目都有用到的组件,可以考虑封装成组件库,这篇文章主要给大家介绍了关于webpack如何打包一个按需引入的vue组件库的相关资料,需要的朋友可以参考下
    2022-02-02
  • Vue3 计算属性computed的实现原理

    Vue3 计算属性computed的实现原理

    这篇文章主要介绍了Vue3 计算属性computed的实现原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Vue 大文件上传和断点续传的实现

    Vue 大文件上传和断点续传的实现

    文件上传在很多项目中都用的到,如果是几M的很快就传送完毕,如果是大文件呢?本文就介绍了Vue 大文件上传和断点续传的实现,感兴趣的可以了解一下
    2021-06-06
  • vuejs 动态添加input框的实例讲解

    vuejs 动态添加input框的实例讲解

    今天小编就为大家分享一篇vuejs 动态添加input框的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Vue3中defineEmits、defineProps 不用引入便直接用

    Vue3中defineEmits、defineProps 不用引入便直接用

    这篇文章主要介绍了Vue3中defineEmits、defineProps 不用引入便直接用,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • element-ui动态添加表单项并实现事件触发验证代码示例

    element-ui动态添加表单项并实现事件触发验证代码示例

    这篇文章主要给大家介绍了关于element-ui动态添加表单项并实现事件触发验证的相关资料,其实就是利用了vue的v-for循环渲染,通过添加数组实现动态添加表单项,需要的朋友可以参考下
    2023-12-12
  • Vue制作Todo List网页

    Vue制作Todo List网页

    这篇文章主要为大家详细介绍了Vue制作Todo List网页的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论