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

JavaScript實(shí)現(xiàn)大文件上傳的示例代碼

 更新時間:2022年11月18日 09:17:06   作者:freeman_Tian  
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)大文件上傳功能的示例代碼,文中的代碼講解詳細(xì),對我們學(xué)習(xí)JavaScript有一定幫助,感興趣可以跟隨小編一起學(xué)習(xí)一下

下面就是JavaScript實(shí)現(xiàn)大文件上傳功能的代碼

bigFileUpload.js

const path = require('path')
import axios from 'axios'
import { resolve } from 'path';
import { promised } from 'q';

// 遞歸調(diào)用請求
async function dg(requestMargreList, options, key = 0) {
  let index = key
  const requestList = requestMargreList[key].map(({ formData }) =>
    {
      return multipartUploadUpload(formData, options)
    }
  );
  const resArr = await Promise.all(requestList);
  let boolean = resArr.every(item => item?.data?.status == 'SUCCEED')
  if(boolean){
    index++
    if(index ==  requestMargreList.length) {
      return {uploadFlag: true, msg: '上傳切片文件成功' }
    }
    return dg(requestMargreList, options, index)
  } else {
    const res_err = resArr.map(item => item?.data?.status != 'SUCCEED')
    return {uploadFlag: false, msg: '切片文件上傳出錯,請重新嘗試' }
  }

}

//  文件切片
function createFileChunk(file, size){
    let fileChunkList = [];
    let cur = 0;
    while (cur < file.size) {
        fileChunkList.push({file:file.slice(cur, cur + size)})
        cur += size;
    }
    return fileChunkList
}

function calculateHash(fileChunkList, container,options ={}) {
    return new Promise(resolve => {
        // 添加 worker 屬性
        container.worker = new Worker("/static/hash.js");
        container.worker.postMessage({ fileChunkList });
        container.worker.onmessage = e => {
            const { percentage, hash } = e.data;
            //  總進(jìn)度變化
            // hashPercentage = percentage;
            options.showHash(percentage)
            if (hash) {
                resolve(hash);
            }
        };
    })
}

function getMultipartLogId(params){
    return new Promise(resolve =>{
        axios.post('api/multipartUploadInit',params)
        .then(res=>{
          resolve(res)
        })
    })
}

let globalPercentage = 0;

function multipartUploadUpload(formData, options) {

  return  axios.post('api/multipartUploadUpload',formData,{
        onUploadProgress: function (upEvent) {   //  文件上傳總進(jìn)度
            let percentage = ((options.size * (formData.get('chunkIndex')- 1) + upEvent.loaded) / options.fileSize)*100
            //options.size為分片后每片的大小 options.fileSize為文件總大小 percentage為計算后總進(jìn)度
            if(percentage > globalPercentage){
              globalPercentage = percentage;
            }
            if(globalPercentage>100) globalPercentage = 100;
            options.showFileProgress(globalPercentage)
        }
    })
}


async function uploadChunks(fileChunkList, options) {
    let reqMargeArr = [], reqSize = 3, uploadResObj = {};
    let reqBeforeList = fileChunkList.map(({ multipartLogId,hash,file,fileName,chunkIndex }) => {
      const formData = new FormData();
      formData.append("multipartLogId", multipartLogId);
      formData.append("hash", hash);
      formData.append("file", file);
      formData.append("fileName", fileName);
      formData.append("chunkIndex", chunkIndex);
      return { formData };
    })

    if(reqBeforeList.length > reqSize) {
      for (let i = 0; i < reqBeforeList.length; i += reqSize) {
        reqMargeArr.push(reqBeforeList.slice(i, i + reqSize))
      }
      const {uploadFlag, msg} = await dg(reqMargeArr, options,)
      uploadResObj = { uploadFlag, msg}
    } else {
      const requestList = reqBeforeList.map(({ formData }) =>
        {
          return multipartUploadUpload(formData, options)
        });
      let resArr = await Promise.all(requestList);
      const uploadFlag = resArr.every(item => item?.data?.status == 'SUCCEED')
      uploadResObj = { uploadFlag, msg: uploadResObj.uploadFlag?'上傳切片文件成功':'切片文件上傳出錯,請重新嘗試'}
    }
    if(uploadResObj.uploadFlag) {
      // completeFunc函數(shù)中有回調(diào)接口判斷是否合并成功
      setTimeout(()=>{
        completeFunc(fileChunkList[0].multipartLogId,options)
      }, 1000)
    } else {
      return uploadResObj
    }
}

function completeFunc(multipartLogId, options) {

  return axios.post('api/multipartUploadComplete',{multipartLogId})
      .then(res=>{
        options.completeFunc(res)
      })

}

async function bigFileUpload(file, options={},fileOptions) {
    let container = {}
    let fileChunkList = createFileChunk(file,options?.size);
    const fileHash = await calculateHash(fileChunkList, container,options);

    fileOptions.hash = fileHash
    const upFileParams = await getMultipartLogId(fileOptions)
    //  刪除已上傳的文件片
    let fileChunkListArr = [];
    let percentage = 0;
    if(upFileParams.data.status == 'SUCCEED'){
        let chunkIndexs = upFileParams?.data?.data?.chunkIndexs;
        if(chunkIndexs?.length>0){
            fileChunkList.map(({ file },index) => {

                if(!chunkIndexs.includes(index+1)){
                    fileChunkListArr.push({
                        multipartLogId: upFileParams.data.data.multipartLogId,
                        chunkIndex: index + 1,
                        hash: fileHash,
                        file: file,
                        fileName: fileOptions.fileName,
                    })
                }
            });
            percentage = percentage + (chunkIndexs.length * fileOptions.chunkSize / options.fileSize)*100
            options.showFileProgress(percentage)

        } else {
            fileChunkList.map(({ file },index) => {
                fileChunkListArr.push({
                        multipartLogId: upFileParams.data.data.multipartLogId,
                        chunkIndex: index + 1,
                        hash: fileHash,
                        file: file,
                        fileName: fileOptions.fileName,
                    })
                }
            );
        }
        if(fileChunkListArr.length>0){
          //  上傳文件切片
          const uploadRes = await uploadChunks(fileChunkListArr, options,percentage)
          return uploadRes
        } else {
          completeFunc(upFileParams.data.data.multipartLogId,options)
        }

    } else {
      return { uplodFlag: false, msg: upFileParams.data.extMessage }
    }
}

export default bigFileUpload
import bigFileUpload from './components/bigFileUpload'
//  大文件上傳
        //  分片大小 bigFileUpload
 let fileParams = {
          size: bigSize, // 切片大小
          fileSize: fileTem.size,
          showHash: this.showHash,
          showFileProgress: this.showFileProgress,
          completeFunc: this.completeFunc,
        }
        this.fileOptions = fileOptions
        const res = await bigFileUpload(fileTem, fileParams,fileOptions)
console.log("=====big up res========", res)
        if(res && !res.uplodFlag) {
          _this.$Notice.error({
            title: '提醒',
            desc: res.msg
          })
          return
        }

到此這篇關(guān)于JavaScript實(shí)現(xiàn)大文件上傳的示例代碼的文章就介紹到這了,更多相關(guān)JavaScript大文件上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript Tab 導(dǎo)航插件 (23個)

    Javascript Tab 導(dǎo)航插件 (23個)

    實(shí)現(xiàn)tab頁很多方法,有一些是用純CSS實(shí)現(xiàn),其他大多數(shù)是基于jquery、mootools或者其他js框架實(shí)現(xiàn),既然有這么多可以拿來即用的插件,又何苦重復(fù)造輪子。
    2009-06-06
  • JavaScript判斷是否手機(jī)瀏覽器的五種方法

    JavaScript判斷是否手機(jī)瀏覽器的五種方法

    現(xiàn)在手機(jī)網(wǎng)站已經(jīng)很普及了,有時候前端網(wǎng)頁需要判斷,用戶使用的是手機(jī)瀏覽器還是電腦瀏覽器。這篇文章整理了JavaScript判斷是否手機(jī)瀏覽器的五種方法,通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2022-11-11
  • JavaScript之BOM?location對象+navigator對象+history?對象

    JavaScript之BOM?location對象+navigator對象+history?對象

    這篇文章主要介紹了JavaScript?BOM中的?location對象、navigator對象、history?對象,下面圍繞他們的相關(guān)語法及各種資料展開文章詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對大家有所幫助
    2021-12-12
  • 使用Three.js制作一個3D獎牌頁面

    使用Three.js制作一個3D獎牌頁面

    本文將使用React+Three.js技術(shù)棧,制作一個專屬的3D獎牌頁面,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-01-01
  • 讀取input:file的路徑并顯示本地圖片的方法

    讀取input:file的路徑并顯示本地圖片的方法

    input:file是一個文件上傳控件,如何讀取input:file的路徑并顯示圖片,具體實(shí)現(xiàn)如下,需要注意的是在IE8中由于IE8自作聰明的將真實(shí)路徑隱藏起來
    2013-09-09
  • javascript 密碼框防止用戶粘貼和復(fù)制的實(shí)現(xiàn)代碼

    javascript 密碼框防止用戶粘貼和復(fù)制的實(shí)現(xiàn)代碼

    本篇文章主要是對javascript 密碼框防止用戶粘貼和復(fù)制的實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • in.js 一個輕量級的JavaScript顆?;K加載和依賴關(guān)系管理解決方案

    in.js 一個輕量級的JavaScript顆?;K加載和依賴關(guān)系管理解決方案

    近一年來,國內(nèi)外都十分熱衷于異步加載的研究,為了加快頁面的載入速度,無阻塞加載Javascript的方法和框架成為了前端開發(fā)的焦點(diǎn)和亮點(diǎn)之一。
    2011-07-07
  • JavaScript一文帶你玩轉(zhuǎn)web表單網(wǎng)頁

    JavaScript一文帶你玩轉(zhuǎn)web表單網(wǎng)頁

    表單通常用來收集網(wǎng)頁訪問者信息,常見的表單比如搜索引擎的搜索框、各網(wǎng)頁應(yīng)用的注冊或者登陸界面等,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-10-10
  • 完美的js div拖拽實(shí)例代碼

    完美的js div拖拽實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了完美的js div拖拽實(shí)例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • javascript基礎(chǔ)知識之html5輪播圖實(shí)例講解(44)

    javascript基礎(chǔ)知識之html5輪播圖實(shí)例講解(44)

    這篇文章主要為大家詳細(xì)介紹了javascript基礎(chǔ)知識之html5輪播圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論

西宁市| 洛宁县| 当雄县| 肃北| 宽城| 湄潭县| 明光市| 清水县| 陇川县| 江山市| 台东市| 孟津县| 出国| 萍乡市| 象山县| 客服| 荆州市| 千阳县| 逊克县| 蕉岭县| 会泽县| 卢龙县| 大丰市| 和平县| 贵定县| 玛纳斯县| 商水县| 易门县| 平利县| 宝清县| 明水县| 东辽县| 颍上县| 砀山县| 文成县| 海林市| 黄浦区| 西盟| 沁源县| 中西区| 贺兰县|