element 上傳組件 el-upload 的經驗總結

来源:https://www.cnblogs.com/leyili/archive/2019/07/29/element-el-upload.html
-Advertisement-
Play Games

前言 最近在做後臺管理項目,採用的 "vue element admin" ,上傳圖片是一個很常用的功能,也遇到了很多問題,剛好趁此機會做一些總結。 初步總結下會提到的問題,目錄如下: 1. el upload 自定義上傳方法 2. 圖片上傳到七牛雲 3. 圖片壓縮後再上傳(壓縮使用 "lrz" ) ...


前言

最近在做後臺管理項目,採用的 vue-element-admin ,上傳圖片是一個很常用的功能,也遇到了很多問題,剛好趁此機會做一些總結。

初步總結下會提到的問題,目錄如下:

  1. el-upload 自定義上傳方法
  2. 圖片上傳到七牛雲
  3. 圖片壓縮後再上傳(壓縮使用 lrz
  4. el-upload 進度條不顯示的問題

版本信息:

  • element-ui 2.3.4
  • vue 2.5.10

提示:
由於每個人做的業務不盡相同,所以文章里的代碼只是起一個引導作用,提供一個思路,具體可以根據自己的需求來調整。

正文

上傳圖片到七牛雲

這個需要前後端的配合才能實現,這裡 是官方的 JavaScript SDK 參考鏈接。

  • 在使用 JS-SDK 之前,您必須先註冊一個七牛帳號,並登錄控制台獲取一對有效的 AccessKey 和 SecretKey,您可以閱讀 快速入門  安全機制 以進一步瞭解如何正確使用和管理密鑰 。

  • JS-SDK 依賴服務端頒發 token,可以通過以下二種方式實現:
    1. 利用七牛服務端 SDK 構建後端服務
    2. 利用七牛底層 API 構建服務,詳見七牛上傳策略上傳憑證

前端通過介面請求以獲得 token 信息

前端需要去拿到後端生成的 token 才可以上傳圖片。

自定義上傳,上傳前可壓縮

http-request 屬性可以覆蓋預設的上傳行為,自定義上傳的實現。
主要來看一下這個自定義的函數的代碼實現:

// 自定義的上傳實現函數
handleHttpRequest(req) {
  // uid 作為唯一標識,方便上傳完成後精準地替換圖片 url
  const uid = req.file.uid 
  // 獲取文件尾碼名的函數
  const ext = getFileExt(req.file.name) 
  // 自定義 key ,上傳時對圖片的重命名會用到
  let keyname = this.$formatDate(new Date(), 'yyyyMMddhhmmss') + Math.floor(Math.random() * 1000) + '.' + ext
  // 壓縮圖片
  let newFile = null
  lrz(req.file, {
    quality: 0.7
  }).then(rst => {
    // 壓縮完成
    newFile = rst.file
    // 創建form對象,上傳七牛雲所需要的參數
    const fileData = new FormData() 
    fileData.append('file', newFile)
    fileData.append('token', this.token)
    fileData.append('key', keyname)
    const config = {
      headers: { 'Content-Type': 'multipart/form-data' },
      // 這一段代碼解決進度條不顯示的問題,屬於 axios 的使用知識。具體可以看文末的參考鏈接。
      onUploadProgress: progressEvent => {
       const percentCompleted = Math.floor((progressEvent.loaded * 100) / progressEvent.total)
       req.onProgress({ percent: percentCompleted })
     }
    }
    // 請求七牛雲的介面,具體看自己怎麼配置
    // 這裡的 action 是請求地址,fileData 是請求發送的內容,config 是 http 的相關配置
    // 官方的請求地址可以查看這個鏈接:https://developer.qiniu.com/kodo/manual/1671/region-endpoint
    axios.post($config[this.bucket].action, fileData, config).then(res => {
      const url = `${$config[this.bucket].domain}/${res.data.key}`
      // 修改 url
      this.fileList.forEach((item) => {
        if (item.uid === uid) {
          item.url = url
        }
      })
      req.onSuccess(res)
    }).catch(err => {
      req.onError(err)
    })
  }).catch(err => {
    console.log(err)
  })
}

壓縮圖片

這裡直接採用前人造的輪子,可以設置壓縮比例和圖片的尺寸限制。

想看更多細節的話地址在 這裡 ,上面代碼里也有用到,但是這個輪子作者已經不再維護了。

el-upload 進度條不顯示

使用自定義上傳後,我發現 el-upload 自帶的進度條顯示失效了,這個問題查找了比較久,一開始一直不知道應該在哪裡去監聽 progress 事件。

參考鏈接里的順序就是我思考的順序。

先是去查了下官方的 issue ,意識到是監聽 process 的問題,然後就想 axios 是不是有相關的設置呢?畢竟我這裡是用 axios 發請求的,所以又谷歌直接搜關鍵詞「axios upload progress」,找到了一些相關的信息,就是在 config 里去配置 onUploadProgress 函數,具體代碼見上面的例子。

參考鏈接:

  1. upload組件的 http:request 怎麼獲取進度值
  2. 谷歌 axios upload progress 找到的 其一
  3. 谷歌 axios upload progress 找到的 其二

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說起文本對齊,大家都知道text-align,最常用的有left、right、center,今天我們說一下justify,也就是文本兩端 對齊。說起來簡單,但是有些小坑大家還是要註意的。 現在我們有這樣的兩行文本,實際開發中我們經常會遇到這樣的情景:需要把姓名和電話號碼這兩段文字對齊。我們自然會想到 ...
  • position屬性 position屬性指定用於元素的定位方法的類型(靜態,相對,固定,絕對或粘性)。 有五種不同的值: static relative fixed absolute sticky 然後使用top,bottom,left和right屬性定位元素。但是,除非首先設置position屬 ...
  • 在人人手裡都有手機都能上網。在這樣一個信息傳播迅速的時代,怎麼樣讓別人足不出戶就能知道你的企業。 企業的建站是商戶之間網路的橋梁,我們可以通過上海網站建設公司創建一個電子商務的平臺為自己公司做一個網頁版的宣傳。 網站的標識,其目的市場可是一個年齡組或特定的連接鏈,因此採用一個高端大氣又趣味十足的能吸 ...
  • 預編譯四部曲 1.創建AO對象 2.找形參和變數聲明,將變數和形參名作為AO屬性名,值為undefined 3.將實參和形參統一 4.在函數體裡面找函數聲明,值賦予函數體 function fn(a){ console.log(a) //function a(){} var a = 123; con ...
  • description jQuery,顧名思義,也就是JavaScript和Query(查詢),即輔助JavaScript開發的庫。jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計 ...
  • 一 函數 1、字元串函數 s.tolowerCase( ); -- 變小寫 s.toupperCase( ); -- 變大寫 s.substr( 2 , 8 ); -- 截取 從索引2開始截取,截取8個字元長度 s.split( ); -- 指定字元分割,返回一個數組。 括弧里放一個字元,按照這個字 ...
  • 第一種:瀏覽器支持的轉換方式(Firefox,chrome,opera,safari,ie)等瀏覽器: JSON.parse(jsonstr); //可以將json字元串轉換成json對象 JSON.stringify(jsonobj); //可以將json對象轉換成json對符串   第 ...
  • 比如上面這個頁面, 分為三層:divOne是第外層,divTwo中間層,hr_three是最裡層; 他們都有各自的click事件,最裡層a標簽還有href屬性。 運行頁面,點擊“點擊我”,會依次彈出:我是最裡層 >我是中間層 >我是最外層 >然後再鏈接到百度. 這就是事件冒泡,本來我只點擊ID為hr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...