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

Vue實(shí)現(xiàn)文件切片上傳功能的示例代碼

 更新時間:2022年10月24日 14:44:03   作者:我是ed  
在實(shí)際開發(fā)項目過程中有時候需要上傳比較大的文件,然后呢,上傳的時候相對來說就會慢一些,so,后臺可能會要求前端進(jìn)行文件切片上傳。本文介紹了Vue實(shí)現(xiàn)文件切片上傳的示例代碼,需要的可以參考一下

在實(shí)際開發(fā)項目過程中有時候需要上傳比較大的文件,然后呢,上傳的時候相對來說就會慢一些,so,后臺可能會要求前端進(jìn)行文件切片上傳,很簡單哈,就是把比如說1個G的文件流切割成若干個小的文件流,然后分別請求接口傳遞這個小的文件流。

流程簡說

實(shí)現(xiàn)文件切片導(dǎo)入,首先我們使用 elementUI 也好,原生的 upload 標(biāo)簽也好,獲取到文件 file 文件流,然后需要做的一件事情就是 知道這個文件之前有沒有上傳過,我們需要向后臺提交一個這個文件唯一的標(biāo)識符,然后讓后端告訴我們這個問題后臺有沒有,這時候,后端可能返回我們?nèi)N狀態(tài):

  • 文件沒有,需要全部上傳。
  • 這個文件存在了,前端不需要再上傳。
  • 這個文件上傳了一部分,需要繼續(xù)把沒有上傳的部分上傳。

只有這三種狀態(tài),實(shí)現(xiàn)這個步驟的一個重要參數(shù)就是這個文件的唯一標(biāo)識符,這個標(biāo)識符,使用的就是這個文件的 MD5 標(biāo)識碼。所以我們首先需要獲取這個文件的 MD5 唯一標(biāo)識碼。

我們知道文件需要上傳或者是需要部分上傳的時候,我們就需要進(jìn)行切片操作了。這個就很簡單了,比如文件的二進(jìn)制字節(jié)流一共1個G,然后一般是 5M 切一片,所以說如果是1個G 的文件需要切 205 片,當(dāng)然最后一片不一定是 5M,然后我們走文件分片上傳的接口,發(fā)起文件分片導(dǎo)入的請求。

首先明確一點(diǎn),就是我們把這 205 個分片數(shù)據(jù)流提交完,后臺是需要合并的,就是把我們分片提交的在這 205 個文件流合成一個大的文件保存起來,這樣,后臺合并完的文件就是我們最終要提交導(dǎo)入的文件,既然后端需要合并,我們又是一片一片上傳的,總得讓后端知道每一片是這個文件的哪一部分吧?所以說我們提交分片請求的時候一般需要傳遞這幾個參數(shù):

  • chunk: 當(dāng)前是第幾個分片,一般從 0 開始。
  • chunkSize:分片的大小,一般是5M,即5242880字節(jié)。
  • chunks:一共有多少分片。
  • file:當(dāng)前分片的文件流。
  • md5:整個文件的 MD5 唯一標(biāo)識碼,不是分片的哈。
  • name:當(dāng)前文件的名稱。
  • size:當(dāng)前分片大?。ㄈ绻詈笠粔K不一定是 5M)。

這樣后端就知道怎么去合并最后的文件了。當(dāng)然了具體的字段需要后端去定義,然后我們按照這個思路去相應(yīng)的對接就可以了。

OK,等我們 205 個分片數(shù)據(jù)全部提交完成,需要再走一個接口,就是通知后端,好了,我前端分片都傳完了,你可以合并文件了。

然后后端合并完成,文件導(dǎo)入成功!

獲取文件的 MD5 唯一標(biāo)識碼

很多人說哈,MD5 不是加密嘛,其實(shí)這個想法在這里不是很對哈,MD5 是加密不了文件的,只會生成一個唯一的編碼,這么說呢,哎喲,就當(dāng)是加密吧,但是別妄想提交一個 MD5 編碼就當(dāng)把加密的文件提交給后端了哈,首先這個就是一個字符串,不是加密的文件,第二,這個玩意并不能解密。我們這里只是給文件生成一個唯一標(biāo)識符,讓后端判斷服務(wù)器之前有沒有存在過這個文件,如果唯一標(biāo)識有的話,就說明之前上傳過,直接用之前的就可以了,就不用再次上傳了,畢竟如果文件修改了,這個 MD5 標(biāo)識碼是會變的。

怎么獲取文件的 MD5 編碼很簡單哈,在vue里面需要使用一個庫 spark-md5。

一句命令安裝

npm install --save spark-md5

然后我們可以寫一個方法來封裝一下。

創(chuàng)建一個 fileMd5Sum.js 文件:

import SparkMD5 from 'spark-md5'

export default {
  // md5值計算
  fileMd5Sum(file) {
    return new Promise(resolve => {
      let fileReader = new FileReader()
      let Spark = new SparkMD5.ArrayBuffer()
      fileReader.readAsArrayBuffer(file)
      fileReader.onload = function (e) {
        Spark.append(e.target.result)
        let md5 = Spark.end()
        resolve(md5)
      }
    });
  }
}

然后在需要使用的時候就可以使用了,當(dāng)然這里返回的是一個 Promise,直接 .then 就可以獲取了。

或者是使用 async、 await 。

let md5Str = await this.fileMd5Sum.fileMd5Sum(file.raw)

文件切片

獲取了文件MD5標(biāo)識碼,后臺說需要提交,我們就需要把文件切片,從頭提交或者是提交部分操作了,如果不需要的話直接走合并接口就可以了,走合并接口其實(shí)是告訴后臺合并,我們要做的就是把其他除了文件相關(guān)的其他參數(shù)傳遞給后臺罷了。

文件切片就是類似于字符串截取,這里是截取字節(jié)。獲取需要的參數(shù)我們自己些就可以了。假設(shè)我們使用 elementUI 文件上傳組件獲取到了文件 file

獲取文件名 name

let fileName = file.name  // 獲取文件名

分片文件大小 chunkSize

let chunkSize = 5 * 1024 * 1024   // 一般是 5M,具體多少看后端想要多少

文件切片 chunkList 列表

            let chunkList = []  // 創(chuàng)建一個數(shù)組用來存儲每一片文件流數(shù)據(jù)
            if (file.size < chunkSize) {  // 如果文件大小小于5M就只有一片,不用切都
              chunkList.push(file.raw.slice(0))  // 文件流從第一個字節(jié)直接截取到最后就可以了
            } else {  // 如果文件大小大于5M 就需要切片了
              var start = 0, end = 0  // 創(chuàng)建兩個變量 開始位置 結(jié)束位置
              while (true) {  // 循環(huán)
                end += chunkSize  // 結(jié)束為止 = 結(jié)束位置 + 每片大小
                let blob = file.raw.slice(start, end)  // 文件流從開始位置截取到結(jié)束位置
                start += chunkSize  // 截取完,開始位置后移
                if (!blob.size) {  // 如果截取不到了就退出
                  break;
                }
                chunkList.push(blob)  // 把截取的每一片數(shù)據(jù)保存到數(shù)組
              }
            }

切片總數(shù) chunks

我們上一步已經(jīng)獲取到每片文件流的數(shù)組了,所以說呢,直接獲取就可以了。

let chunks = chunkList.length

切片大小 size

我們是按照 5 M 切割的,所以說每片大小應(yīng)該是 5 * 1024 * 1024 但是呢,不對,因為最后一片不一定就是正好的 5 M,所以說我們可直接 .size 獲取一下大小。比如:

chunkList[0].size  // 獲取第1片大小

參數(shù)都找齊了,然后就走切片提交接口開始提交數(shù)據(jù)就可以了。

合并

當(dāng)我們把分片數(shù)據(jù)全部提交成功,后臺返回說切片文件保存成功之后,我們就可以走最后一個接口,提交就可以了。

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

相關(guān)文章

  • 關(guān)于@click.native中?.native?的含義與使用方式

    關(guān)于@click.native中?.native?的含義與使用方式

    這篇文章主要介紹了關(guān)于@click.native中?.native?的含義與使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue中ref和$refs獲取元素dom、獲取子組件數(shù)據(jù)與方法調(diào)用示例

    vue中ref和$refs獲取元素dom、獲取子組件數(shù)據(jù)與方法調(diào)用示例

    在Vue3中要獲取子組件的DOM節(jié)點(diǎn),你可以使用ref來引用子組件,然后通過$refs來訪問子組件的DOM,下面這篇文章主要給大家介紹了關(guān)于vue中ref和$refs獲取元素dom、獲取子組件數(shù)據(jù)與方法調(diào)用的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • vue項目中的遇錯:Invalid?Host?header問題

    vue項目中的遇錯:Invalid?Host?header問題

    這篇文章主要介紹了vue項目中的遇錯:Invalid?Host?header問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vuejs 單文件組件.vue 文件的使用

    vuejs 單文件組件.vue 文件的使用

    本篇文章主要介紹了vuejs 單文件組件.vue 文件的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 用Cordova打包Vue項目的方法步驟

    用Cordova打包Vue項目的方法步驟

    這篇文章主要介紹了用Cordova打包Vue項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • vue-router路由簡單案例介紹

    vue-router路由簡單案例介紹

    本篇文章主要介紹了vue-router路由的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 粘貼可用的element-ui validateField局部校驗

    粘貼可用的element-ui validateField局部校驗

    這篇文章主要為大家介紹了粘貼可用element-ui中validateField局部校驗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 利用Vue3指令實(shí)現(xiàn)水印背景詳解

    利用Vue3指令實(shí)現(xiàn)水印背景詳解

    這篇文章主要為大家介紹了利用Vue3指令實(shí)現(xiàn)水印背景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 如何使用ant-design-vue的Table組件

    如何使用ant-design-vue的Table組件

    這篇文章主要介紹了如何使用ant-design-vue的Table組件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Vue自定義el-table表格表頭高度的多種實(shí)現(xiàn)方法

    Vue自定義el-table表格表頭高度的多種實(shí)現(xiàn)方法

    在Vue項目中,使用Element?UI的el-table組件可以輕松創(chuàng)建功能豐富的表格,然而,默認(rèn)情況下,el-table的表頭高度是固定的,本文將詳細(xì)介紹如何自定義el-table表頭的高度,提供多種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2024-10-10

最新評論

满洲里市| 瑞安市| 上犹县| 七台河市| 青川县| 正宁县| 来安县| 海丰县| 错那县| 澜沧| 灵宝市| 汉中市| 揭阳市| 鞍山市| 武定县| 乌鲁木齐市| 电白县| 瑞昌市| 许昌县| 沙洋县| 永仁县| 利辛县| 玉林市| 宜兴市| 杭州市| 青河县| 拉孜县| 赤峰市| 元江| 长沙市| 安岳县| 丰镇市| 兴海县| 前郭尔| 贵港市| 西乌珠穆沁旗| 荆州市| 牙克石市| 绿春县| 定兴县| 藁城市|