最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

結(jié)合el-upload組件實現(xiàn)大文件分片上傳功能

 更新時間:2022年09月15日 15:43:21   作者:zhtzhtx  
Element UI的el-upload上傳組件相信各位小伙伴都已經(jīng)非常熟悉,最近接了一個新需求,要求在el-upload組件基礎(chǔ)上實現(xiàn)分片上傳功能,即小于等于5M文件正常上傳,大于5M文件切成5M每片上傳,那么這個功能怎么實現(xiàn)呢?一起看看吧

前情提要

Element UI的el-upload上傳組件相信各位小伙伴都已經(jīng)非常熟悉,最近接了一個新需求,要求在el-upload組件基礎(chǔ)上實現(xiàn)分片上傳功能,即小于等于5M文件正常上傳,大于5M文件切成5M每片上傳。那么這個功能怎么實現(xiàn)呢?一起看看吧

代碼實現(xiàn)

首先,我們需要設(shè)置el-upload組件的http-request,這樣可以覆蓋默認(rèn)的上傳行為,可以自定義上傳的實現(xiàn)。

<!-- data是上傳時附帶的額外參數(shù),uploadFile是覆蓋默認(rèn)上傳的方法 -->
<el-upload :data="data" :http-request="uploadFile">
    <el-button icon="el-icon-upload2">本地文件</el-button>
</el-upload>

接下來,uploadFile方法中需要區(qū)分文件是否超過5M

async uploadFile({ data, file }) {
  // data是上傳時附帶的額外參數(shù),file是文件
  let url = "xxx" //上傳文件接口
  let loadingInstance = Loading.service({
    text: "正在上傳文件,請稍后...",
  });
  try {
    // 如果文件小于5MB,直接上傳
    if (file.size < 5 * 1024 * 1024) {
      let formData = new FormData();
      for (let key in data) {
        formData.append(key, data[key]);
      }
      formData.append("file", file);

      const res = await upload(url,formData);
      loadingInstance.close();
      return res;
    } else {
      // 如果文件大于等于5MB,分片上傳
      data.file = file;
      const res = await uploadByPieces(url,data);
      loadingInstance.close();
      return res;
    }
  } catch (e) {
    loadingInstance.close();
    return e;
  }
}

upload方法就是正常上傳方法,uploadByPieces是分片上傳方法,我們可以把它們一個單獨的js文件中,方便我們使用。

upload方法:

const upload = (url, data, headers = {}) => {
    return new Promise((resolve, reject) => {
        axios({
            url,
            method: "post",
            data,
            headers: {
                ...headers,
                'Content-Type': 'multipart/form-data'
            }
        }).then(res => {
            return resolve(res.data)
        }).catch(err => {
            return reject(err)
        })
    })
}

在uploadByPieces方法中我們可以使用file.slice對文件進(jìn)行切片

// 上傳過程中用到的變量
const chunkSize = 5 * 1024 * 1024; // 5MB一片
const chunkCount = Math.ceil(file.size / chunkSize); // 總片數(shù)
// 獲取當(dāng)前chunk數(shù)據(jù)
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 };
};

File對象沒有定義任何方法,但它從Blob對象中繼承了slice方法:MDN

完整代碼

upload.vue

<template>
    <el-upload :data="data" :http-request="uploadFile">
        <el-button icon="el-icon-upload2">文件上傳</el-button>
    </el-upload>
</template>
<script>
// 引入上傳文件方法
import { upload, uploadByPieces } from "@/utils/upload.js";
// Loading
import { Loading } from "element-ui";

export default {
    props: ["data"],
    methods: {
        async uploadFile({ data, file }) {
          // data是上傳時附帶的額外參數(shù),file是文件
          let url = "xxx" //上傳文件接口
          let loadingInstance = Loading.service({
            text: "正在上傳文件,請稍后...",
          });
          try {
            // 如果文件小于5MB,直接上傳
            if (file.size < 5 * 1024 * 1024) {
              let formData = new FormData();
              for (let key in data) {
                formData.append(key, data[key]);
              }
              formData.append("file", file);

              const res = await upload(url,formData);
              loadingInstance.close();
              return res;
            } else {
              // 如果文件大于等于5MB,分片上傳
              data.file = file;
              const res = await uploadByPieces(url,data);
              loadingInstance.close();
              return res;
            }
          } catch (e) {
            loadingInstance.close();
            return e;
          }
        }
    }
}
</script>

upload.js

import axios from "axios";
//正常上傳
const upload = (url, data, headers = {}) => {
    return new Promise((resolve, reject) => {
        axios({
            url,
            method: "post",
            data,
            headers: {
                ...headers,
                'Content-Type': 'multipart/form-data'
            }
        }).then(res => {
            return resolve(res.data)
        }).catch(err => {
            return reject(err)
        })
    })
}
//分片上傳
const uploadByPieces = async (url,{ fileName, file }) => {
    // 上傳過程中用到的變量
    const chunkSize = 5 * 1024 * 1024; // 5MB一片
    const chunkCount = Math.ceil(file.size / chunkSize); // 總片數(shù)
    // 獲取當(dāng)前chunk數(shù)據(jù)
    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) => {
        return new Promise((resolve, reject) => {
            axios({
                url,
                method: "post",
                data,
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            }).then(res => {
                return resolve(res.data)
            }).catch(err => {
                return reject(err)
            })
        })
    }
    // 針對單個文件進(jìn)行chunk上傳
    const readChunk = (index) => {
        const { chunk } = getChunkInfo(file, index);
        let fetchForm = new FormData();
        fetchForm.append("chunk", chunk);
        fetchForm.append("index", index);
        fetchForm.append("chunkCount", chunkCount);
        return uploadChunk(fetchForm)
    };
    // 針對每個文件進(jìn)行chunk處理
    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
    }
}

export { upload, uploadByPieces }

到此這篇關(guān)于結(jié)合el-upload組件實現(xiàn)大文件分片上傳的文章就介紹到這了,更多相關(guān)el-upload大文件分片上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VUE中V-IF條件判斷改變元素的樣式操作

    VUE中V-IF條件判斷改變元素的樣式操作

    這篇文章主要介紹了VUE中V-IF條件判斷改變元素的樣式操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧
    2020-08-08
  • 解決Echarts2豎直datazoom滑動后顯示數(shù)據(jù)不全的問題

    解決Echarts2豎直datazoom滑動后顯示數(shù)據(jù)不全的問題

    這篇文章主要介紹了解決Echarts2豎直datazoom滑動后顯示數(shù)據(jù)不全的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue實現(xiàn)購物車計算總價功能

    Vue實現(xiàn)購物車計算總價功能

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)購物車計算總價功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue監(jiān)聽瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式

    vue監(jiān)聽瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式

    這篇文章主要介紹了vue監(jiān)聽瀏覽器的后退和刷新事件,阻止默認(rèn)的事件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue使用中的內(nèi)存泄漏【推薦】

    vue使用中的內(nèi)存泄漏【推薦】

    內(nèi)存泄露是指new了一塊內(nèi)存,但無法被釋放或者被垃圾回收。這篇文章主要介紹了vue使用中的內(nèi)存泄漏,需要的朋友可以參考下
    2018-07-07
  • vue 輸入框輸入任意內(nèi)容返回數(shù)字的實現(xiàn)

    vue 輸入框輸入任意內(nèi)容返回數(shù)字的實現(xiàn)

    本文主要介紹了vue 輸入框輸入任意內(nèi)容返回數(shù)字的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Vue3 異步組件 suspense使用詳解

    Vue3 異步組件 suspense使用詳解

    vue在解析我們的組件時, 是通過打包成一個 js 文件,當(dāng)我們的一個組件 引入過多子組件是,頁面的首屏加載時間 由最后一個組件決定 優(yōu)化的一種方式就是采用異步組件,這篇文章主要介紹了Vue3 異步組件 suspense,需要的朋友可以參考下
    2022-12-12
  • vue實現(xiàn)個人信息查看和密碼修改功能

    vue實現(xiàn)個人信息查看和密碼修改功能

    本文通過實例代碼給大家介紹了vue實現(xiàn)個人信息查看和密碼修改功能,文中給大家補(bǔ)充介紹了vue實現(xiàn)密碼顯示隱藏切換功能,非常不錯,具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2018-05-05
  • vue-cli構(gòu)建的項目如何手動添加eslint配置

    vue-cli構(gòu)建的項目如何手動添加eslint配置

    這篇文章主要介紹了vue-cli構(gòu)建的項目如何手動添加eslint配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 解決nuxt 自定義全局方法,全局屬性,全局變量的問題

    解決nuxt 自定義全局方法,全局屬性,全局變量的問題

    這篇文章主要介紹了解決nuxt 自定義全局方法,全局屬性,全局變量的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論

尉氏县| 观塘区| 永川市| 陆良县| 纳雍县| 肃宁县| 华阴市| 东台市| 海晏县| 辉南县| 周口市| 安陆市| 衡南县| 内黄县| 郁南县| 巴林右旗| 寿光市| 海兴县| 亳州市| 柘城县| 西乌| 九台市| 宁强县| 建平县| 民丰县| 松原市| 于都县| 靖远县| 阿巴嘎旗| 洛南县| 绵竹市| 黄梅县| 拜城县| 民权县| 成都市| 托克托县| 彭阳县| 梁平县| 上思县| 芦溪县| 罗江县|