欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue項(xiàng)目中大文件切片上傳實(shí)現(xiàn)秒傳與斷點(diǎn)續(xù)傳的詳細(xì)實(shí)現(xiàn)過程

 更新時(shí)間:2023年08月14日 09:48:29   作者:專注的華華  
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中大文件切片上傳實(shí)現(xiàn)秒傳與斷點(diǎn)續(xù)傳的詳細(xì)實(shí)現(xiàn)過程, 在開發(fā)中,如果上傳的文件過大,可以考慮分片上傳,分片就是說將文件拆分來進(jìn)行上傳,將各個(gè)文件的切片傳遞給后臺,然后后臺再進(jìn)行合并,需要的朋友可以參考下

一、考察點(diǎn)

在Vue項(xiàng)目中,大圖片和多數(shù)據(jù)Excel等大文件的上傳是一個(gè)非常常見的需求。然而,由于文件大小較大,上傳速度很慢,傳輸中斷等問題也難以避免。因此,為了提高上傳效率和成功率,我們需要使用切片上傳的方式,實(shí)現(xiàn)文件秒傳、斷點(diǎn)續(xù)傳、錯(cuò)誤重試、控制并發(fā)等功能,并繪制進(jìn)度條。

在本文中,我們將從以下三個(gè)角度考察這個(gè)技術(shù):

技術(shù)方案:如何實(shí)現(xiàn)切片上傳、文件秒傳、斷點(diǎn)續(xù)傳、錯(cuò)誤重試、控制并發(fā)等功能;

代碼示例:基于Vue框架,如何使用axios庫和element-ui組件庫實(shí)現(xiàn)以上功能;

總結(jié):該技術(shù)的優(yōu)點(diǎn)和局限性,推薦應(yīng)用場景和未來發(fā)展方向。

二、技術(shù)方案

1. 實(shí)現(xiàn)切片上傳

切片上傳是指將大文件分成若干小塊進(jìn)行上傳,這樣不僅減輕了服務(wù)器的壓力,還可以提高上傳效率。我們使用File API進(jìn)行文件切割,將文件分割成固定大小的塊(例如每個(gè)塊的大小為1MB),并通過FormData將每個(gè)塊上傳到服務(wù)器。

2. 文件秒傳

文件秒傳是指當(dāng)上傳同一個(gè)文件時(shí),如果該文件已經(jīng)存在于服務(wù)器上,就不需要再次上傳,而是直接返回服務(wù)器中已有該文件的地址。實(shí)現(xiàn)文件秒傳可以通過計(jì)算文件的MD5校驗(yàn)值進(jìn)行判斷。

3. 斷點(diǎn)續(xù)傳

斷點(diǎn)續(xù)傳是指當(dāng)文件上傳中斷時(shí),再次上傳時(shí)可以從上一次斷點(diǎn)處繼續(xù)上傳,而不需要重新上傳整個(gè)文件。實(shí)現(xiàn)斷點(diǎn)續(xù)傳可以記錄上傳進(jìn)度,以及每個(gè)塊上傳的狀態(tài)(已上傳、未上傳、上傳失敗),并在上傳時(shí)根據(jù)這些信息判斷需要上傳的塊。

4. 錯(cuò)誤重試

由于網(wǎng)絡(luò)等原因,上傳可能會失敗。為了避免上傳失敗,我們需要對上傳過程進(jìn)行錯(cuò)誤處理和重試。我們可以設(shè)置一個(gè)最大重試次數(shù),在上傳失敗后進(jìn)行重試,直到達(dá)到最大重試次數(shù)為止。

5. 控制并發(fā)

由于上傳需要占用帶寬和服務(wù)器資源,同時(shí)上傳多個(gè)文件或多個(gè)塊可能會引起帶寬和服務(wù)器資源緊張。因此,我們需要限制同時(shí)上傳的文件數(shù)和塊數(shù),防止過度占用帶寬和服務(wù)器資源。

三、代碼示例

以下是一個(gè)基于Vue框架,使用axios庫和element-ui組件庫實(shí)現(xiàn)切片上傳的示例代碼:

<template>
  <div>
    <!--上傳組件-->
    <el-upload
      class="upload-demo"
      :action="uploadUrl"  // 上傳地址
      :auto-upload="false"  // 禁用自動上傳
      :on-change="handleChange"  // 文件選擇時(shí)觸發(fā)
      :before-upload="handleBeforeUpload"  // 文件上傳前觸發(fā)
      :on-progress="handleProgress"  // 上傳進(jìn)度變化時(shí)觸發(fā)
    >
      <el-button slot="trigger">選取文件</el-button>  // 選擇文件按鈕
      <!--上傳文件按鈕-->
      <el-button style="margin-left: 10px" type="primary" :loading="uploading" :disabled="files.length === 0" @click="handleUpload">
        上傳文件
      </el-button>
      <div class="clearfix"></div>
      <el-progress :percentage="percent"></el-progress>  // 上傳進(jìn)度條
    </el-upload>
  </div>
</template>
<script>
import axios from 'axios';
import { ElMessage } from 'element-ui';  // 引入Element UI庫中的消息提示組件
export default {
  data() {
    return {
      files: [],  // 選中的文件列表
      uploading: false,  // 是否正在上傳
      percent: 0,  // 上傳進(jìn)度
      uploadUrl: 'https://your.upload.url'  // 上傳地址
    };
  },
  methods: {
    // 切片上傳
    async upload(file) {
      const chunkSize = 1024 * 1024; // 每個(gè)塊的大小為 1MB
      const fileSize = file.size;  // 文件大小
      const chunks = Math.ceil(fileSize / chunkSize);  // 總塊數(shù)
      const tasks = [];  // 上傳任務(wù)數(shù)組
      let uploaded = 0;  // 已上傳塊數(shù)
      // 文件切割
      for (let i = 0; i < chunks; i++) {
        const start = i * chunkSize;
        const end = Math.min(start + chunkSize, fileSize);
        tasks.push(
          new Promise((resolve, reject) => {
            const formData = new FormData();
            formData.append('chunk_index', i);  // 塊編號
            formData.append('chunk_count', chunks);  // 總塊數(shù)
            formData.append('file_id', file.id);  // 文件ID
            formData.append('chunk_data', file.slice(start, end));  // 塊數(shù)據(jù)
            axios
              .post(this.uploadUrl, formData)  // 上傳塊數(shù)據(jù)
              .then(res => {
                uploaded++;
                this.percent = Math.floor((uploaded / chunks) * 100);
                resolve();
              })
              .catch(err => {
                reject(err);
              });
          })
        );
      }
      // 待所有塊上傳完成后,發(fā)送合并請求
      await Promise.all(tasks);
      const res = await axios.post(this.uploadUrl, { file_id: file.id, chunks });
      // 上傳成功,返回文件URL
      if (res.status === 200) {
        return `${this.uploadUrl}/${file.id}`;
      } else {
        throw new Error(res.data.message);
      }
    },
    handleChange(files) {
      this.files = files;
    },
    async handleUpload() {
      try {
        this.uploading = true;
        for (let i = 0; i < this.files.length; i++) {
          const file = this.files[i];
          const url = await this.upload(file);
          // 文件上傳成功,將url展示給用戶 
          ElMessage.success(`文件${file.name}上傳成功!URL:${url}`);
        }
      } catch (err) {
        ElMessage.error(`文件上傳失?。?{err.message}`);
      } finally {
        this.uploading = false;
      }
    },
    handleBeforeUpload() {
      // TODO: 檢查文件大小、類型等
    },
    handleProgress(event, file) {
      // 顯示上傳進(jìn)度
      this.percent = Math.floor((event.loaded / event.total) * 100);
    }
  }
};
</script>

以上代碼實(shí)現(xiàn)了一個(gè)簡單的切片上傳功能,包括文件秒傳、斷點(diǎn)續(xù)傳、錯(cuò)誤重試、控制并發(fā)等功能,并繪制進(jìn)度條。

四、總結(jié)

切片上傳技術(shù)是一種非常實(shí)用的技術(shù),特別適用于大文件上傳。它不僅可以提高上傳效率和成功率,還可以減輕服務(wù)器的壓力。但是,切片上傳技術(shù)也有其局限性,例如上傳前需要對文件進(jìn)行預(yù)處理,同時(shí)服務(wù)器需要支持該技術(shù)。因此,在使用切片上傳技術(shù)時(shí)需要權(quán)衡利弊,選擇適合自己的方案。

未來,隨著硬件和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,切片上傳技術(shù)將會得到更廣泛的應(yīng)用,并且會有更多的優(yōu)化和改進(jìn),使其更加高效、穩(wěn)定和易用。

到此這篇關(guān)于Vue項(xiàng)目中大文件切片上傳實(shí)現(xiàn)秒傳與斷點(diǎn)續(xù)傳的文章就介紹到這了,更多相關(guān)Vue大文件切片上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖

    vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖

    這篇文章主要為大家詳細(xì)介紹了vue使用Highcharts實(shí)現(xiàn)不同高度的3D環(huán)形圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue3動態(tài)組件使用詳解

    vue3動態(tài)組件使用詳解

    這篇文章主要介紹了vue3動態(tài)組件使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 使用ElementUI el-upload實(shí)現(xiàn)一次性上傳多個(gè)文件

    使用ElementUI el-upload實(shí)現(xiàn)一次性上傳多個(gè)文件

    在日常的前端開發(fā)中,文件上傳是一個(gè)非常常見的需求,尤其是在用戶需要一次性上傳多個(gè)文件的場景下,ElementUI作為一款非常優(yōu)秀的Vue.js 2.0組件庫,為我們提供了豐富的UI組件,本文介紹了如何使用ElementUI el-upload實(shí)現(xiàn)一次性上傳多個(gè)文件,需要的朋友可以參考下
    2024-08-08
  • Vue+UpLoad實(shí)現(xiàn)上傳預(yù)覽和刪除圖片的實(shí)踐

    Vue+UpLoad實(shí)現(xiàn)上傳預(yù)覽和刪除圖片的實(shí)踐

    本文主要介紹了Vue+UpLoad實(shí)現(xiàn)上傳預(yù)覽和刪除圖片的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • vue使用element-ui按需引入時(shí)踩過的那些坑

    vue使用element-ui按需引入時(shí)踩過的那些坑

    Element-UI是基于vue實(shí)現(xiàn)的一套不依賴業(yè)務(wù)的UI組件庫,提供了豐富的PC端組件,減少用戶對常用組件的封裝,降低了開發(fā)的難易程度,下面這篇文章主要給大家介紹了關(guān)于vue使用element-ui按需引入時(shí)踩過的那些坑,需要的朋友可以參考下
    2022-05-05
  • Vue中使用js-cookie詳情

    Vue中使用js-cookie詳情

    這篇文章主要介紹了Vue中使用js-cookie詳情,文章圍繞js-cookie的相關(guān)資料展開詳細(xì)內(nèi)容具有一定的的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • VSCode搭建vue項(xiàng)目的實(shí)現(xiàn)步驟

    VSCode搭建vue項(xiàng)目的實(shí)現(xiàn)步驟

    本文主要介紹了VSCode搭建vue項(xiàng)目的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • vue3 onMounted異步函數(shù)同步請求async/await實(shí)現(xiàn)

    vue3 onMounted異步函數(shù)同步請求async/await實(shí)現(xiàn)

    這篇文章主要為大家介紹了vue3 onMounted初始化數(shù)據(jù)異步函數(shù)/同步請求async/await實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • vue路由跳轉(zhuǎn)攜帶參數(shù)的方式總結(jié)

    vue路由跳轉(zhuǎn)攜帶參數(shù)的方式總結(jié)

    我們知道在vue中每個(gè)頁面都需要在路由中聲明,下面這篇文章主要給大家介紹了關(guān)于vue路由跳轉(zhuǎn)攜帶參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 基于Vue3+element-plus實(shí)現(xiàn)中英文切換功能

    基于Vue3+element-plus實(shí)現(xiàn)中英文切換功能

    在?Vue?3?項(xiàng)目中結(jié)合?vue-i18n?和?Element?Plus?實(shí)現(xiàn)中英文切換是一個(gè)常見的需求,下面是一個(gè)詳細(xì)的步驟指南,幫助你完成這個(gè)任務(wù),需要的朋友可以參考下
    2024-11-11

最新評論