前端:el-upload文件上傳與FormData 對象

在這里插入圖片描述

<el-uploadclass="uploadDemo":limit="1"dragaccept=".xls,.xlsx"  <!-- 只保留Excel格式 -->:on-exceed="handleExceedFileLimit":on-change="handleChangeExcelFile":on-remove="handleRemoveExcelFile":before-remove="beforeRemoveFile":file-list="uploadExcelFileList":auto-upload="false"action=""
><i class="el-icon-upload"></i><center><div class="el-upload__text">將文件拖到此處,或<em>點擊上傳文件</em></div><div slot="tip" class="el-upload__tip">支持上傳EXCEL文件(.xls,.xlsx)<br />一次只允許上傳一個文件且文件大小不超過{{ maxFileSize }}MB)</div></center>
</el-upload>
<div><el-buttontype="primary"v-show="uploadExcelFileList.length > 0"@click="confirmExcelUpload">上傳</el-button>
</div>

(1)限制只能上傳 Excel 類型文件

修改accept屬性的值(accept=".pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx"),只保留 Excel 相關的文件格式。

同時,在handleChangeExcelFile方法中添加類型驗證(以 Vue 為例):

methods: {handleChangeExcelFile(file, fileList) {// 獲取文件后綴名const fileName = file.name;const suffix = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();// 驗證文件類型if (suffix !== '.xls' && suffix !== '.xlsx') {this.$message.error('請上傳Excel格式的文件(.xls或.xlsx)');// 從文件列表中移除不符合要求的文件this.uploadExcelFileList = fileList.filter(item => item.uid !== file.uid);return false;}// 后續的處理邏輯...}
}

①accept屬性在文件選擇對話框層面就過濾掉非 Excel 文件;
②代碼中的二次驗證可以防止用戶通過修改文件后綴名繞過限制;

(2)el-upload組件屬性

  1. :on-exceed="handleExceedFileLimit"
    作用:當上傳的文件數量超過 limit 限制時觸發的回調函數。
    場景:例如設置了 :limit=“1”(最多傳 1 個文件),當用戶嘗試上傳第 2 個文件時觸發。
    參數:接收兩個參數 files(超出的文件列表)和 fileList(當前所有文件列表)。
/*** 圖片超出個數限制*/
handleExceedFileLimit() {this.$message.error('已超出最大文件個數');
},
  1. :on-change="handleChangeExcelFile"
    作用:文件狀態發生變化時觸發(包括文件選擇、上傳成功 / 失敗、進度更新等)。
    場景:選擇文件后、文件上傳中、上傳完成(成功 / 失敗)等時機都會觸發。
    參數:接收三個參數 file(當前操作的文件對象)、fileList(當前所有文件列表)、event(原生事件)。
    典型用途:
    ①驗證文件類型 / 大小
    ②更新上傳進度顯示
    ③處理上傳成功 / 失敗的邏輯
/*** 文件狀態發生改變時觸發*/
handleChangeExcelFile(file, fileList) {// 獲取文件后綴名const fileName = file.name;const suffix = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();// 驗證文件類型if (suffix !== '.xls' && suffix !== '.xlsx') {this.$message.error('請上傳Excel格式的文件(.xls或.xlsx)');// 從文件列表中移除不符合要求的文件this.uploadExcelFileList = fileList.filter(item => item.uid !== file.uid);return false;}// 添加文件this.uploadExcelFileList.push(file);
},
  1. :on-remove="handleRemoveExcelFile"
    作用:文件被成功刪除后觸發的回調函數。
    場景:用戶刪除已選中 / 上傳的文件,且通過了 before-remove 驗證后觸發。
    參數:接收兩個參數 file(被刪除的文件對象)和 fileList(刪除后的文件列表)。
    典型用途:
    ①同步更新本地文件列表數據
    ②向后端發送刪除文件的請求(如果文件已上傳)
/*** 刪除文件*/
handleRemoveExcelFile(file, fileList) {this.uploadExcelFileList = [];
},
  1. :before-remove="beforeRemoveFile"
    作用:刪除文件前觸發的回調函數,用于確認是否允許刪除。
    場景:用戶點擊刪除按鈕時,先執行此方法,再決定是否執行刪除操作。
    參數:接收兩個參數 file(要刪除的文件對象)和 fileList(當前所有文件列表)。
    特殊說明:
    ①返回 true 或 Promise resolve 時,允許刪除
    ②返回 false 或 Promise reject 時,阻止刪除
/*** 刪除文件之前的鉤子,參數為上傳的文件和文件列表,* 若返回 false 或者返回 Promise 且被 reject,則停止刪除。* @param file 移除的圖片* @param fileList 圖片列表*/
beforeRemoveFile(file, fileList) {return this.$confirm(`確定移除 ${file.name}`);
},

(3)FormData 對象構建表單數據

FormData 對象,用于構建表單數據,專門用于在客戶端(瀏覽器)向服務器發送文件、鍵值對等數據,尤其適合文件上傳場景。

①數據容器:FormData 就像一個 “虛擬表單”,可以通過 append() 方法添加各種數據(字符串、數字、文件等)。

②適配文件上傳:由于要上傳 Excel 文件(二進制數據),普通的 JSON 格式無法處理二進制數據,而 FormData 是瀏覽器原生支持的、專門用于傳輸二進制數據(如文件)鍵值對的格式,能完美適配文件上傳場景。

③與請求配合:通過 this.$request.post(url, formData) 發送請求時,瀏覽器會自動設置正確的請求頭(Content-Type: multipart/form-data),確保服務器能正確解析表單數據(包括文件)。

/*** 文件上傳*/
confirmExcelUpload(){this.$confirm('確認上傳', '提示', {confirmButtonText: '確定',cancelButtonText: '取消',type: 'info'}).then(() => {const loading = this.$loading({lock: true,text: 'Loading',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)'})if(this.yourId!='' && this.myId!=''){if(this.excelTemplateFileData.length > 0){this.$jitsoseVue.MessageWarning('只能上傳一個文件')loading.close()}else{let formData = new FormData() //文件表單對象// 檢查上傳的文件大小是否超過限制if (this.uploadExcelFileList[0].size > this.maxFileSize * 1024 * 1024) {this.uploadExcelFileList = []this.$jitsoseVue.MessageWarning('文件過大,請重新上傳')return}formData.append('yourId', this.yourId)formData.append('myId', this.myId)formData.append('file', this.uploadExcelFileList[0].raw)this.loading = true;let url = 'file/insertExcelFile'this.$request.post(url, formData).then(res => {this.$message({type: 'info',message: res.data.obj})this.uploadExcelFileList = []this.getExcelTemplateFile()loading.close()this.loading = false;})}}else{this.$jitsoseVue.MessageWarning('請選擇yourId與myId')loading.close()}}).catch(error => {this.$message({type: 'info',message: '已取消上傳'})})
},

服務器端接收后,可以通過這些鍵(yourId、myId、file)獲取對應的數據,從而完成文件上傳和業務處理。

簡單說,formData 在這里就是一個 “數據包”,打包了上傳文件和相關業務參數,方便通過 HTTP 請求發送給服務器。

(4)el-upload 組件的文件對象結構

在 Element UI 的 el-upload 組件中,this.uploadExcelFileList[0].raw 中的 .raw 是獲取原始文件對象的關鍵屬性,這與組件對文件的處理機制有關:

  1. el-upload 組件的文件對象結構

當用戶選擇文件后,el-upload會將文件信息封裝成一個組件自定義的文件對象,存入 file-list 綁定的數組(即 uploadExcelFileList)中。這個對象包含兩類信息:

組件自定義的元數據:如 name(文件名)、size(文件大小)、uid(唯一標識)、status(上傳狀態)等。

瀏覽器原生的文件對象:通過 raw 屬性暴露,對應 HTML5 中的 File`對象(繼承自 Blob)。

  1. raw原因

原生 File 對象的必要性:
當需要通過 FormData 上傳文件、或在前端處理文件內容(如讀取 Excel 數據)時,必須使用瀏覽器原生的 File 對象。因為組件自定義的文件對象只是對文件信息的描述,而非實際可傳輸 / 可處理的文件數據

FormData上傳的要求:
formData.append('file', 文件對象) 方法要求傳入的必須是原生 FileBlob 對象,才能正確構建包含文件二進制數據的表單數據。如果直接傳入組件的自定義文件對象(而非 .raw),會導致文件數據無法被正確識別和上傳。

  1. 舉例說明
    如果打印 this.uploadExcelFileList[0],會看到類似結構:
{name: "數據表格.xlsx",    // 組件提取的文件名size: 20480,             // 組件計算的文件大小(字節)uid: "1629234567890",    // 組件生成的唯一標識status: "ready",         // 組件標記的狀態raw: File {              // 原生File對象(關鍵!)name: "數據表格.xlsx",lastModified: 1629234567890,size: 20480,type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}
}

這里的 raw 才是實際可用于上傳的文件數據載體。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96303.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自然處理語言NLP:One-Hot編碼、TF-IDF、詞向量、NLP特征輸入、EmbeddingLayer實現、word2vec

文章目錄自然語言處理&#xff08;NLP&#xff09;一、什么是自然語言處理&#xff08;NLP&#xff09;&#xff1f;二、NLP 的核心目標三、NLP 的主要應用方向&#xff08;應用場景&#xff09;四、NLP 的基本概念五、NLP 的基本處理流程1. 文本預處理2. 特征表示3. 模型選擇與…

單詞記憶-輕松記憶10個實用英語單詞(13)

1. board含義&#xff1a;板子&#xff1b;董事會&#xff1b;登機 讀音標注&#xff1a;/b??rd/ 例句&#xff1a;Write your name on the board. 譯文&#xff1a;把你的名字寫在板上。 衍生含義&#xff1a;董事會&#xff08;如“board of directors”&#xff09;&#…

Spring循環依賴源碼調試詳解,用兩級緩存代替三級緩存

Spring循環依賴源碼詳解&#xff0c;改用兩級緩存并實驗 背景 最近一直在研究Spring的循環依賴&#xff0c;發現好像兩級緩存也能解決循環依賴。 關于為何使用三級緩存&#xff0c;大致有兩個原因 對于AOP的類型&#xff0c;保證Bean生命周期的順序 對于有AOP代理增強的類型&am…

亞馬遜BALL PIT球池外觀專利侵權指控?不侵權意見書助力4條鏈接申訴成功!

兒童球池作為玩具品類中常見的一款產品&#xff0c;能夠給兒童提供游樂的安全空間&#xff0c;深受亞馬遜平臺用戶的喜愛。然而在近期&#xff0c;賽貝收到了部分亞馬遜賣家的咨詢&#xff0c;原因是他們在售的兒童球池產品鏈接被美國外觀專利USD1009203S&#xff08;下稱203專…

開源,LangExtract-Python庫用LLM從非結構化文本提取結構化信息

摘要&#xff1a; LangExtract是一個Python庫&#xff0c;利用大語言模型&#xff08;LLM&#xff09;根據用戶定義指令從非結構化文本文檔中提取結構化信息。它具備精確源定位、可靠結構化輸出、長文檔優化、交互式可視化、靈活LLM支持、適應任意領域等特點。可通過幾行代碼快…

如何根據團隊技術能力選擇最適合的PHP框架?

作為一名PHP開發者&#xff0c;面對眾多的PHP框架&#xff0c;你是否曾感到選擇困難&#xff1f;Laravel、Symfony、CodeIgniter、ThinkPHP…每個框架都有其特色和優勢&#xff0c;但沒有最好的框架&#xff0c;只有最適合的框架。而選擇合適框架的關鍵因素之一&#xff0c;就是…

多人同時導出 Excel 導致內存溢出

1、問題根因分析多人同時導出Excel導致內存溢出&#xff08;OOM&#xff09;的核心原因是&#xff1a;在短時間內&#xff0c;大量數據被加載到JVM堆內存中&#xff0c;且創建了大量大對象&#xff08;如Apache POI的Cell、Row、Sheet對象&#xff09;&#xff0c;超過了堆內存…

深入 RAG(檢索增強生成)系統架構:如何構建一個能查資料的大語言模型系統

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、前言 1、LLM 的局限&#xff1a;模型知識“封閉” vs 現實知識…

linux tftpboot燒寫地址分析

1&#xff0c;loadaddr 是一個環境變量&#xff0c;用于指定文件&#xff08;如內核鏡像、設備樹等&#xff09;加載到內存的起始地址。setenv loadaddr 0x82000000setenv loadaddr 0x80008000saveenv //.保存配置將 loadaddr 設置為 0x82000000&#xff0c;表示后續文件將加載…

硬件工程師9月實戰項目分享

目錄 簡介 人員情況 實戰項目簡介 功能需求 需求分析 方案設計 電源樹設計 時鐘樹設計 主芯片外圍設計 接口設計 模擬鏈路設計 PCB設計檢查要點 測試方案設計 硬件測試培訓 測試代碼學習 培訓目標 掌握基本的硬件設計流程 掌握以FPGA為核心的硬件設計業務知識 …

力扣刷題——59.螺旋矩陣II

力扣刷題——59.螺旋矩陣II 題目 給你一個正整數 n &#xff0c;生成一個包含 1 到 n2 所有元素&#xff0c;且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。示例 1&#xff1a;輸入&#xff1a;n 3 輸出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 輸…

win11系統還原點恢復系統

背景 系統換位bug11后&#xff0c;真的是各種以前的操作和設置找不到&#xff0c;太煩了&#xff0c;我是沒想到&#xff0c;連系統恢復還原點都這么難找。然后搜了一圈都是恢復系統之類的&#xff0c;真的崩潰。只好自己記錄了。 ?內容找到設置—>系統–>系統信息系統信…

DHCP 原理與配置(一)

應用場景隨著網絡規模的不斷擴大&#xff0c;網絡復雜度不斷提升&#xff0c;網絡中的終端設備例如主機、手機、 平板等&#xff0c;位置經常變化。終端設備訪問網絡時需要配置IP地址、網關地址、DNS服務器 地址等。采用手工方式為終端配置這些參數非常低效且不夠靈活。 IETF于…

SARibbon的編譯構建及詳細用法

目錄 1.1 源碼構建 1.2 搭建項目 1.3 詳細用法 1.4 不同風格 1.5 完整代碼 引言:SARibbon是一個專門為Qt框架設計的開源Ribbon風格界面控件庫,它模仿了微軟Office和WPS的Ribbon UI風格,適用于需要復雜菜單和工具欄的大型桌面程序。本文從源碼編譯構建到詳細使用,做了一…

CSS【詳解】性能優化

精簡 CSS移除未使用的 CSS&#xff08;“死代碼”&#xff09;&#xff0c;可借助工具如 PurgeCSS、UnCSS 自動檢測并刪除未被頁面使用的樣式。避免重復樣式&#xff0c;通過提取公共樣式&#xff08;如 mixin 或公共類&#xff09;減少代碼冗余。利用預處理器&#xff08;Sass…

Flutter 線程模型詳解:主線程、異步與 Isolate

一、主線程&#xff1a;默認的執行環境 所有代碼默認運行在主線程。下面的例子展示了一個會阻塞主線程的錯誤示范&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});ov…

ChartDB:可視化數據庫設計工具私有化部署

ChartDB:可視化數據庫設計工具私有化部署一、什么是ChartDB ChartDB 是一款基于 Web 的開源數據庫可視化工具&#xff0c;專為簡化數據庫設計與管理流程而開發。以下是其核心特性與功能概述: 1、核心功能 智能查詢可視化?&#xff1a;通過單條 SQL 查詢即可生成數據庫架構圖&a…

單片機-FreeRTOS(ing)

目錄 一、基礎介紹 1.1 調度策略 1.1.1 調度方式 1.1.2 調度器 1.2 任務以及優先級 1.2.1 任務與協程 1.2.2 任務狀態 1.2.3 任務優先級 1.2.4 任務優先級分配方案 1.3 任務間通信 - 信號量 1.3.1 信號量 1.3.2 任務間計數信號量的實現 1.3.3 中斷方式計數信號量的…

為什么調用API總返回404,該如何調試

當調用一個應用程序接口&#xff08;API&#xff09;時&#xff0c;持續地收到“404 未找到”的錯誤&#xff0c;其核心原因在于客戶端發起的“請求”&#xff0c;未能成功地&#xff0c;匹配到服務器上任何一個“真實存在”的、可供訪問的“資源路徑”。這本質上&#xff0c;是…

醫療信息化自主可控轉型的實踐探索 —— 以常德二院為例

目錄 頭雁領航 - 激發醫療新質生產力 核心支撐 - 電科金倉奠定數據底座 生態共建 - 攜手護航醫療信創發展 信創產業發展是國家經濟數字化轉型、提升產業鏈發展的關鍵&#xff0c;是科技自立自強的核心基座&#xff0c;其本質是實現中國信息化產業的自主可控。醫療信創作為關…