国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳

這篇具有很好參考價(jià)值的文章主要介紹了基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 前言

文件上傳 小文件(圖片、文檔、視頻)上傳可以直接使用很多ui框架封裝的上傳組件,或者自己寫一個(gè)input 上傳,利用FormData 對(duì)象提交文件數(shù)據(jù),后端使用spring提供的MultipartFile進(jìn)行文件的接收,然后寫入即可。但是對(duì)于比較大的文件,比如上傳2G左右的文件(http上傳),就需要將文件分片上傳(file.slice()),否則中間http長(zhǎng)時(shí)間連接可能會(huì)斷掉。

分片上傳 分片上傳,就是將所要上傳的文件,按照一定的大小,將整個(gè)文件分隔成多個(gè)數(shù)據(jù)塊(我們稱之為Part)來(lái)進(jìn)行分別上傳,上傳完之后再由服務(wù)端對(duì)所有上傳的文件進(jìn)行匯總整合成原始的文件。

秒傳 通俗的說(shuō),你把要上傳的東西上傳,服務(wù)器會(huì)先做MD5校驗(yàn),如果服務(wù)器上有一樣的東西,它就直接給你個(gè)新地址,其實(shí)你下載的都是服務(wù)器上的同一個(gè)文件,想要不秒傳,其實(shí)只要讓MD5改變,就是對(duì)文件本身做一下修改(改名字不行),例如一個(gè)文本文件,你多加幾個(gè)字,MD5就變了,就不會(huì)秒傳了.

斷點(diǎn)續(xù)傳 斷點(diǎn)續(xù)傳是在下載或上傳時(shí),將下載或上傳任務(wù)(一個(gè)文件或一個(gè)壓縮包)人為的劃分為幾個(gè)部分,每一個(gè)部分采用一個(gè)線程進(jìn)行上傳或下載,如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)上傳或下載的部分開(kāi)始繼續(xù)上傳或者下載未完成的部分,而沒(méi)有必要從頭開(kāi)始上傳或者下載。本文的斷點(diǎn)續(xù)傳主要是針對(duì)斷點(diǎn)上傳場(chǎng)景。

關(guān)于vue-simple-uploader

vue-simple-uploader是基于 simple-uploader.js 封裝的vue上傳插件。它的優(yōu)點(diǎn)包括且不限于以下幾種:

  • 支持文件、多文件、文件夾上傳;支持拖拽文件、文件夾上傳
  • 可暫停、繼續(xù)上傳
  • 錯(cuò)誤處理
  • 支持“秒傳”,通過(guò)文件判斷服務(wù)端是否已存在從而實(shí)現(xiàn)“秒傳”
  • 分塊上傳
  • 支持進(jìn)度、預(yù)估剩余時(shí)間、出錯(cuò)自動(dòng)重試、重傳等操作
大文件上傳流程
  1. 前端對(duì)文件進(jìn)行MD5加密,并且將文件按一定的規(guī)則分片;
  2. vue-simple-uploader先會(huì)發(fā)送get請(qǐng)求校驗(yàn)分片數(shù)據(jù)在服務(wù)端是否完整,如果完整則進(jìn)行秒傳,如果不完整或者無(wú)數(shù)據(jù),則進(jìn)行分片上傳。
  3. 后臺(tái)校驗(yàn)MD5值,根據(jù)上傳的序號(hào)和分片大小計(jì)算相應(yīng)的開(kāi)始位置并寫入該分片數(shù)據(jù)到文件中。

建議先讀一遍simple-uploader.js的文檔,然后再讀一下vue-simple-uploader的文檔,了解一下各個(gè)參數(shù)的作用是什么
vue-simple-uploader文檔
simple-uploader.js文檔

安裝

npm install vue-simple-uploader --save

使用:

// 在main.js中:
import uploader from 'vue-simple-uploader'
Vue.use(uploader)

相關(guān)概念

  • chunkNumber: 當(dāng)前塊的次序,第一個(gè)塊是 1,注意不是從 0 開(kāi)始的。
  • totalChunks: 文件被分成塊的總數(shù)。
  • chunkSize: 分塊大小,根據(jù) totalSize 和這個(gè)值可以計(jì)算出總共的塊數(shù)。注意最后一塊的大小可能會(huì)比這個(gè)要大。
  • currentChunkSize: 當(dāng)前塊的大小,實(shí)際大小。
  • totalSize: 文件總大小。
  • identifier: 這個(gè)就是MD5值,每個(gè)文件的唯一標(biāo)示。
  • filename: 文件名
基于vue-simple-uploader封裝全局上傳組件

代碼參考:
git代碼

  1. 點(diǎn)擊按鈕,觸發(fā)文件上傳操作;
  2. 選擇文件后,將上傳的窗口展示出來(lái),開(kāi)始md5的計(jì)算工作
onFileAdded(file) {
    this.panelShow = true
    Bus.$emit('fileAdded')

    // 將額外的參數(shù)賦值到每個(gè)文件上,以不同文件使用不同params的需求
    file.params = this.params

    // 計(jì)算MD5,完成后開(kāi)始上傳操作
    this.computeMD5(file).then((result) => this.startUpload(result))
},

具體的MD5計(jì)算方法,會(huì)在下面講,這里先簡(jiǎn)單引出。
上傳過(guò)程中,會(huì)不斷觸發(fā)file-progress上傳進(jìn)度的回調(diào)

// 文件進(jìn)度的回調(diào)
onFileProgress(rootFile, file, chunk) {
    console.log(`上傳中 ${file.name},chunk:${chunk.startByte / 1024 / 1024} ~ ${chunk.endByte / 1024 / 1024}`)
},
  1. 文件上傳成功后
    文件上傳成功后,在“上傳完成”的回調(diào)中,通過(guò)服務(wù)端返回的needMerge字段,來(lái)判斷是否需要再發(fā)送合并分片的請(qǐng)求,
    如果這個(gè)字段為true,則需要給后臺(tái)發(fā)一個(gè)請(qǐng)求合并的ajax請(qǐng)求,否則直接上傳成功。
    注意:這里的needMerge是和后臺(tái)商議決定的字段名
onFileSuccess(rootFile, file, response, chunk) {
    let res = JSON.parse(response);

    // 服務(wù)器自定義的錯(cuò)誤,這種錯(cuò)誤是Uploader無(wú)法攔截的
    if (!res.result) {
        this.$message({ message: res.message, type: 'error' });
        return
    }
	
	// 如果服務(wù)端返回需要合并
    if (res.needMerge) {
        api.mergeSimpleUpload({
            tempName: res.tempName,
            fileName: file.name,
            ...file.params,
        }).then(data => {
            // 文件合并成功
            Bus.$emit('fileSuccess', data);
        }).catch(e => {});
    // 不需要合并    
    } else {
        Bus.$emit('fileSuccess', res);
        console.log('上傳成功');
    }
},

onFileError(rootFile, file, response, chunk) {
	console.log(error)
},
  1. 文件分片
    vue-simple-uploader自動(dòng)將文件進(jìn)行分片,在options的chunkSize中可以設(shè)置每個(gè)分片的大小。對(duì)于大文件來(lái)說(shuō),會(huì)發(fā)送多個(gè)請(qǐng)求,在設(shè)置testChunks為true后(在插件中默認(rèn)就是true),會(huì)發(fā)送與服務(wù)器進(jìn)行分片校驗(yàn)的請(qǐng)求,第一個(gè)get請(qǐng)求就是該請(qǐng)求;后面的每一個(gè)post請(qǐng)求都是上傳分片的請(qǐng)求。
    看一下發(fā)送給服務(wù)端的參數(shù),其中chunkNumber表示當(dāng)前是第幾個(gè)分片,totalChunks代表所有的分片數(shù),這兩個(gè)參數(shù)都是都是插件根據(jù)你設(shè)置的chunkSize來(lái)計(jì)算的。基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳

需要注意的就是在最后文件上傳成功的事件中,通過(guò)后臺(tái)返回的字段,來(lái)判斷是否要再給后臺(tái)發(fā)送一個(gè)文件合并的請(qǐng)求。

  1. MD5的計(jì)算過(guò)程
    斷點(diǎn)續(xù)傳及秒傳的基礎(chǔ)是要計(jì)算文件的MD5,這是文件的唯一標(biāo)識(shí),然后服務(wù)器根據(jù)MD5進(jìn)行判斷,是進(jìn)行秒傳還是斷點(diǎn)續(xù)傳。在file-added事件之后,就計(jì)算MD5,我們最終的目的是將計(jì)算出來(lái)的MD5加到參數(shù)里傳給后臺(tái),然后繼續(xù)文件上傳的操作,詳細(xì)的思路步驟是:
    1)把uploader組件的autoStart設(shè)為false,即選擇文件后不會(huì)自動(dòng)開(kāi)始上傳
    2)先通過(guò) file.pause()暫停文件,然后通過(guò)H5的FileReader接口讀取文件
    3)將異步讀取文件的結(jié)果進(jìn)行MD5,這里我用的加密工具是spark-md5,你可以通過(guò)npm install spark-md5 --save來(lái)安裝,也可以使用其他MD5加密工具。
    4)file有個(gè)屬性是uniqueIdentifier,代表文件唯一標(biāo)示,我們把計(jì)算出來(lái)的MD5賦值給這個(gè)屬性 file.uniqueIdentifier = md5,這就實(shí)現(xiàn)了我們最終的目的。
    5)通過(guò)file.resume()開(kāi)始/繼續(xù)文件上傳。
/**
 * 計(jì)算md5值,以實(shí)現(xiàn)斷點(diǎn)續(xù)傳及秒傳
 * @param file
 * @returns Promise
 */
computeMD5(file) {
  let fileReader = new FileReader()
  let time = new Date().getTime()
  let blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice
  let currentChunk = 0
  const chunkSize = 10 * 1024 * 1000
  let chunks = Math.ceil(file.size / chunkSize)
  let spark = new SparkMD5.ArrayBuffer()

  // 文件狀態(tài)設(shè)為"計(jì)算MD5"
  this.statusSet(file.id, 'md5')
  file.pause()

  // 計(jì)算MD5時(shí)隱藏”開(kāi)始“按鈕
  this.$nextTick(() => {
    document.querySelector(`.file-${file.id} .uploader-file-resume`).style.display = 'none'
  })

  loadNext()

  return new Promise((resolve, reject) => {
    fileReader.onload = (e) => {
      spark.append(e.target.result)

      if (currentChunk < chunks) {
        currentChunk++
        loadNext()

        // 實(shí)時(shí)展示MD5的計(jì)算進(jìn)度
        this.$nextTick(() => {
          const md5ProgressText ='校驗(yàn)MD5 '+ ((currentChunk/chunks)*100).toFixed(0)+'%'
          document.querySelector(`.custom-status-${file.id}`).innerText = md5ProgressText
        })

      } else {
        let md5 = spark.end()

        // md5計(jì)算完畢
        resolve({md5, file})

        console.log(
          `MD5計(jì)算完畢:${file.name} \nMD5:${md5} \n分片:${chunks} 大小:${file.size} 用時(shí):${
            new Date().getTime() - time
          } ms`
        )
      }
    }

    fileReader.onerror = function () {
      this.error(`文件${file.name}讀取出錯(cuò),請(qǐng)檢查該文件`)
      file.cancel()
      reject()
    }
  })

  function loadNext() {
    let start = currentChunk * chunkSize
    let end = start + chunkSize >= file.size ? file.size : start + chunkSize

    fileReader.readAsArrayBuffer(blobSlice.call(file.file, start, end))
  }
},

// md5計(jì)算完畢,開(kāi)始上傳
startUpload({md5, file}) {
    file.uniqueIdentifier = md5
    file.resume()
    this.statusRemove(file.id)
},

給file的uniqueIdentifier 屬性賦值后,請(qǐng)求中的identifier即是我們計(jì)算出來(lái)的MD5
基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳

  1. 秒傳及斷點(diǎn)續(xù)傳
    在計(jì)算完MD5后,我們就能談斷點(diǎn)續(xù)傳及秒傳的概念了。
    服務(wù)器根據(jù)前端傳過(guò)來(lái)的MD5去判斷是否可以進(jìn)行秒傳或斷點(diǎn)續(xù)傳:
    1)服務(wù)器發(fā)現(xiàn)文件已經(jīng)完全上傳成功,則直接返回秒傳的標(biāo)識(shí)。
    2)服務(wù)器發(fā)現(xiàn)文件上傳過(guò)分片信息,則返回這些分片信息,告訴前端繼續(xù)上傳,即斷點(diǎn)續(xù)傳。
    3)對(duì)于前端來(lái)說(shuō)在每次上傳過(guò)程的最開(kāi)始,vue-simple-uploader會(huì)發(fā)送一個(gè)get請(qǐng)求,來(lái)問(wèn)服務(wù)器我哪些分片已經(jīng)上傳過(guò)了,
    這個(gè)請(qǐng)求返回的結(jié)果也有幾種可能:
    a. 如果是秒傳,在請(qǐng)求結(jié)果中會(huì)有相應(yīng)的標(biāo)識(shí),比如我這里是skipUpload為true,且返回了url,代表服務(wù)器告訴我們這個(gè)文件已經(jīng)有了,我直接把url給你,你不用再傳了,這就是秒傳。
    圖1,秒傳狀態(tài)下返回值
    基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳
    b. 如果后臺(tái)返回了分片信息,這是斷點(diǎn)續(xù)傳。如圖,返回的數(shù)據(jù)中有個(gè)uploaded的字段,代表這些分片是已經(jīng)上傳過(guò)的了,插件會(huì)自動(dòng)跳過(guò)這些分片的上傳。
    基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳
    7.2 前端做分片檢驗(yàn):checkChunkUploadedByResponse
    前面講的是概念,現(xiàn)在說(shuō)一說(shuō)前端在拿到這些返回值之后怎么處理。
    插件自己是不會(huì)判斷哪個(gè)需要跳過(guò)的,在代碼中由options中的checkChunkUploadedByResponse控制,它會(huì)根據(jù) XHR 響應(yīng)內(nèi)容檢測(cè)每個(gè)塊是否上傳成功了,成功的分片直接跳過(guò)上傳
    你要在這個(gè)函數(shù)中進(jìn)行處理,可以跳過(guò)的情況下返回true即可。
checkChunkUploadedByResponse: function (chunk, message) {
	 let objMessage = JSON.parse(message);
     if (objMessage.skipUpload) {
         return true;
     }
     return (objMessage.uploaded || []).indexOf(chunk.offset + 1) >= 0
},
// 注:skipUpload 和 uploaded 是和后臺(tái)商議的字段,要按照后臺(tái)實(shí)際返回的字段名來(lái)。

整理了下vue-simple-uploader 常見(jiàn)的問(wèn)題:
vue-simple-uploader 常見(jiàn)問(wèn)題整理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462487.html

到了這里,關(guān)于基于vue-simple-uploader封裝文件分片上傳、秒傳及斷點(diǎn)續(xù)傳的全局上傳的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • springboot整合vue2-uploader文件分片上傳、秒傳、斷點(diǎn)續(xù)傳

    springboot整合vue2-uploader文件分片上傳、秒傳、斷點(diǎn)續(xù)傳

    vue-simple-uploader 是基于 simple-uploader.js 封裝的vue上傳插件。它的優(yōu)點(diǎn)包括且不限于以下幾種: 支持文件、多文件、文件夾上傳;支持拖拽文件、文件夾上傳 可暫停、繼續(xù)上傳 錯(cuò)誤處理 支持“秒傳”,通過(guò)文件判斷服務(wù)端是否已存在從而實(shí)現(xiàn)“秒傳” 分片上傳 支持進(jìn)度、預(yù)估

    2024年02月06日
    瀏覽(35)
  • vue使用elementUI的upload上傳文件封裝

    將文件上傳的方法封裝一下,供大家統(tǒng)一調(diào)用, 話不多說(shuō),直接上代碼 action 上傳的地址 accept 接受上傳的文件類型 multiple 是否開(kāi)啟多文件上傳模式 limit 限制上傳個(gè)數(shù) fileList 文件列表 disabled 是否禁用 before-upload 上傳文件之前的鉤子. on-success 上傳成功的鉤子函數(shù) on-error 文件上

    2024年02月09日
    瀏覽(22)
  • vue+el-upload(封裝華為云OBS上傳文件)前端直傳

    vue+el-upload(封裝華為云OBS上傳文件)前端直傳

    注釋:代碼中###是需要填寫自己東西的 以上代碼為封裝的組件代碼,需要引入父組件后調(diào)用配置 下面圖為組件調(diào)用,注冊(cè)跟引入就不用我多說(shuō)了吧,不會(huì)的自行百度 注:華為云前端直接上傳的話會(huì)出現(xiàn)跨域報(bào)錯(cuò),把華為云OBS CORS跨域規(guī)則設(shè)置一下 我設(shè)置的規(guī)則全部打開(kāi)了

    2024年02月05日
    瀏覽(113)
  • 前端vue elementUI upload上傳組件封裝&多文件上傳&進(jìn)度條,后端servlet request.getPart()接收文件信息

    前端vue elementUI upload上傳組件封裝&多文件上傳&進(jìn)度條,后端servlet request.getPart()接收文件信息

    選中多個(gè)文件上傳 通過(guò) axios請(qǐng)求 onUploadProgress 方法監(jiān)聽(tīng) on-progress on-success 用這兩個(gè)鉤子函數(shù)實(shí)現(xiàn)進(jìn)度條 下面有對(duì)應(yīng)的函數(shù)。 本文是每個(gè)文件一個(gè)請(qǐng)求上傳 也可以用一個(gè)請(qǐng)求上傳多個(gè)文件,需要將文件遍歷添加到 form 表單中,后端用 request.getParts(); 獲取集合,有需要的可以改

    2024年02月11日
    瀏覽(33)
  • vue3 - 使用element-plus組件庫(kù)el-upload上傳超大mp4視頻分片上傳,Upload上傳大文件mp4視頻進(jìn)行切片分段上傳到后端服務(wù)器教程,vue3如何上傳很大的視頻(詳細(xì)示例代碼

    vue3 - 使用element-plus組件庫(kù)el-upload上傳超大mp4視頻分片上傳,Upload上傳大文件mp4視頻進(jìn)行切片分段上傳到后端服務(wù)器教程,vue3如何上傳很大的視頻(詳細(xì)示例代碼

    在vue3+elementPlus中,使用el-upload組件\\\"切片分段\\\"上傳mp4大視頻到服務(wù)器,支持任意大視頻、大文檔、大壓縮包等超大文件,通用方法將其拆分成多個(gè)小段進(jìn)行逐個(gè)逐條上傳到后端(支持?jǐn)帱c(diǎn)續(xù)傳、下載預(yù)覽)。 詳細(xì)大文件分片功能源碼,可只拿前端源碼或只拿springboot(Java)后

    2024年03月16日
    瀏覽(41)
  • vue Element ui上傳組件el-upload封裝

    注釋: 1. limit 可上傳圖片數(shù)量 2. lableName 當(dāng)前組件name,用于一個(gè)頁(yè)面多次使用上傳組件,對(duì)數(shù)據(jù)進(jìn)行區(qū)分 3. upload 上傳圖片發(fā)生變化觸發(fā),返回已上傳圖片的信息 4. imgUrl 默認(rèn)圖片

    2024年02月11日
    瀏覽(30)
  • Vue Element upload組件和Iview upload 組件上傳文件

    Vue Element upload組件和Iview upload 組件上傳文件

    今天要分享的是使用這倆個(gè)UI組件庫(kù)的upload組件分別實(shí)現(xiàn)調(diào)用組件本身的上傳方法實(shí)現(xiàn)和后臺(tái)交互。接下來(lái)就是開(kāi)車的時(shí)間,請(qǐng)坐穩(wěn)扶好~ 一、element upload組件傳送門 ?1、html文件 注意事項(xiàng): 使用組件本身的上傳事件,必須加auto-upload屬性設(shè)置為false; ????????????????

    2024年02月11日
    瀏覽(27)
  • SpringBoot+vue文件上傳&下載&預(yù)覽&大文件分片上傳&文件上傳進(jìn)度

    SpringBoot+vue文件上傳&下載&預(yù)覽&大文件分片上傳&文件上傳進(jìn)度

    SpringBoot+vue 大文件分片下載 Blob File spark-md5根據(jù)文件內(nèi)容生成hash 大文件分片上傳(批量并發(fā),手動(dòng)上傳)vue組件封裝-form組件 vue上傳大文件/視頻前后端(java)代碼 springboot+vue自定義上傳圖片及視頻 SpringBoot + VUE實(shí)現(xiàn)前臺(tái)上傳文件獲取實(shí)時(shí)進(jìn)度( 使用commons-fileupload設(shè)置上傳監(jiān)聽(tīng)

    2024年02月05日
    瀏覽(68)
  • Vue - 使用Element UI Upload / importExcelJs進(jìn)行文件導(dǎo)入

    Vue - 使用Element UI Upload / importExcelJs進(jìn)行文件導(dǎo)入

    1 情景一 需求背景 : 后端配合 ,點(diǎn)擊\\\"導(dǎo)入\\\"按鈕,彈出“導(dǎo)入”彈窗,將電腦本地Excel表格數(shù)據(jù) 導(dǎo)入 到頁(yè)面中表格位置(需要調(diào)用后端接口),而頁(yè)面中表格通過(guò)后端接口獲取最新數(shù)據(jù)。 實(shí)現(xiàn)思路 :彈窗嵌入 Element UI Upload 上傳組件,獲取到文件后調(diào)后端接口。 action : 上傳

    2024年02月03日
    瀏覽(14)
  • springboot整合Minio + vue 實(shí)現(xiàn)文件分片上傳(完整代碼)

    springboot整合Minio + vue 實(shí)現(xiàn)文件分片上傳(完整代碼)

    網(wǎng)上關(guān)于minio分片上傳的資料不太詳細(xì),缺斤少兩,所以我基于他們的代碼做了一些修改,demo能夠正常運(yùn)行起來(lái),但是偶爾也會(huì)發(fā)生一些小bug,不過(guò)這些都無(wú)傷大雅,最終目的是理解代碼背后的邏輯和流程 流程: 前端獲取生成文件MD5,發(fā)送至后臺(tái)判斷是否有該文件緩存,有

    2024年02月02日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包