如何封裝一個上傳文件組件

????????#今天用el-upload感到很多不方便,遂決定自己封裝一個。注:本文不提供表面的按鈕樣式和文件上傳成功后的樣式,需要自己創建。本文僅介紹邏輯函數#

1,準備幾個表面用來指引上傳的元素

2,創造統一的隱藏文件上傳輸入框,監聽文件改變函數來監聽文件的上傳

    <input type="file"ref="fileInput" class="hidden" @change="handleFileUpload" :accept="currentFileType" 
/>

你放在哪里都行,反正要隱藏起來,用來調用點擊事件

3,準備文件上傳的Ref和上傳成功的文件的數組,記得ref要綁定上面的輸入框

  1. 創造ref綁定輸入框,用于讀取上傳到文件相關信息
  2. 創建上傳數組用于存放上傳文件組合,有文件名字,文件類型,文件路徑(圖片和視頻才有),文件大小
// 文件上傳ref
const fileInput = ref<HTMLInputElement | null>(null)
// 上傳的文件列表
const uploadedFiles = reactive<{name: string;type: 'file' | 'image' | 'video';url?: string;size: string;
}[]>([]);

4,點擊表面的上傳按鈕時,調用隱藏的上傳輸入框的click事件

? ? ? ? 事件要綁定在上面的隱藏輸入框

const handleFile = () => {fileInput.value?.click()
}

5, 處理文件上傳函數

  1. ?如果文件數組為空則返回
  2. 檢查文件大小,如果為video視頻文件并且文件大小大于100MB同樣返回
  3. 確定文件類型,同樣使用startsWith函數
  4. 添加到文件上傳列表中,包含名字,類型,創造的url(視頻或圖片才有),大小(格式化函數返回)
  5. 最后清除文件上傳框
const handleFileUpload = (event: Event) => {const input = event.target as HTMLInputElement;if (!input.files || input.files.length === 0) {alert('您沒有上傳文件')return};Array.from(input.files).forEach(file => {// 檢查視頻文件大小if( file.type.startsWith('video/') && file.size > 100 * 1024 * 1024){alert(`視頻文件${file.name}太大, 請限制在100MB以內`);return}// 確定文件類型let fileType: 'file' | 'image' | 'video' = 'file';if (file.type.startsWith('image/')) {fileType = 'image';} else if (file.type.startsWith('video/')) {fileType = 'video';}// 添加到上傳列表uploadedFiles.push({name: file.name,type: fileType,url: fileType !== 'file' ? URL.createObjectURL(file) : undefined,size: formatFileSize(file.size)});alert(`已經添加:${file.name}`)})input.value = '';
}

6,格式化函數,用來計算文件大小,傳入函數為文件的大小,單位B

  1. 定義大小四個單位
  2. 循環計算哪個大小單位,每次除以1024
  3. 最后返回得到的size是除完后的結果,toFixed保留一位小數
const formatFileSize = (bytes: number): string => {const units = ['B', 'KB', 'MB', 'GB']let size = byteslet unitIndex = 0while (size >= 1024 && unitIndex < units.length -1){size /= 1024unitIndex++;}return `${size.toFixed(1)} ${units[unitIndex]}`
}

7, 刪除文件函數,需要綁定在刪除元素上

比如綁定在文件刪除按鈕,點擊時觸發,傳入文件數組的對應索引

  1. 如果對應文件存在URL路徑,需要統一肢解路徑,使用函數URL.revokeObjectURL(對應url字符串)
  2. splice根據索引刪除對應元素
const removeFile = (index:number) =>{if (uploadedFiles[index].url)URL.revokeObjectURL(uploadedFiles[index].url)uploadedFiles.splice(index, 1)alert.warning('已刪除文件')
}

8,清除函數,在組件銷毀前調用

同第七條,在組件關閉前調用URL.revokeObjectURL函數解放url,防止永遠無法復用

// 清理函數
const cleanupBlobUrls = () =>{uploadedFiles.forEach(file => {if (file.url)URL.revokeObjectURL(file.url)})
}
// 在組件銷毀前調用
onBeforeUnmount(() => {cleanupBlobUrls()
})

9,最后在HTML中自由渲染函數即可?


??補充:

  • startWith函數:startsWith()用于確定此字符串是否以指定字符串的字符開頭,并根據需要返回truefalse

  • 輸入文件通過event.target.files去尋找,為上傳文件組成的數組,有type,name,size等屬性
  • URL.createObjectURL()接受文件(比如圖片和視頻),創建URL一個字符串,是一串指向傳入文件的URL路徑。
  • URL.revokeObjectURL()接受URL路徑,釋放URL和原本對應文件的鏈接

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

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

相關文章

【計網】數據包

期末復習自用的&#xff0c;處理得比較草率&#xff0c;復習的同學或者想看基礎的同學可以看看&#xff0c;大佬的話可以不用浪費時間在我的水文上了 1.數據包的定義&#xff1a; 數據包是網絡通信中的基本單元&#xff0c;它包含了通過網絡傳輸的所有必要信息。數據包的結構…

HTTP抓包Websocket抓包(Fiddler)

近期時常要和各個廠商的java云平臺打交道&#xff1a;登錄、上傳、下載等&#xff0c;程序的日志雖必不可少&#xff0c;但前期調試階段&#xff0c;免不了遇到問題&#xff0c;這時有一個稱手的抓包工具就顯得尤為重要了。 Fiddler Everywhere是一款跨平臺的網絡調試工具&…

Git和GitCode使用(從Git安裝到上傳項目一條龍)

第一步 菜鳥教程-Git教程 點擊上方鏈接&#xff0c;完成Git的安裝&#xff0c;并了解Git 工作流程&#xff0c;知道Git 工作區、暫存區和版本庫的區別 第二步 GitCode官方幫助文檔-SSH 公鑰管理 點擊上方鏈接&#xff0c;完成SSH公鑰設置 第三步&#xff08;GitCode的官方引…

基于 WebAssembly 的 Game of Life 交互實現

一、前言 在前期的實現中&#xff0c;我們使用 Rust 編寫核心邏輯&#xff0c;并通過 WebAssembly 將其引入到 Web 環境中&#xff0c;再利用 JavaScript 進行渲染。接下來&#xff0c;我們將在這一基礎上增加用戶交互功能&#xff0c;使模擬過程不僅能夠自動演化&#xff0c;…

【keil】單步調試

一、步驟 1、打開stc-isp軟件 2.打開keil仿真設置&#xff0c;選擇對應的單片機型號 3.點擊將所選目標單片機設置為仿真芯片&#xff0c;點擊下載&#xff0c;按一下單片機打下載按鈕 4.此時已經將仿真程序下載到單片機 5.此時點擊options,找到debug選擇STC Montor 51 Driv…

c++弱指針實現原理

在 C 中&#xff0c;弱指針&#xff08;std::weak_ptr&#xff09;是一種特殊的智能指針&#xff0c;其核心目標是?解決 std::shared_ptr 的循環引用問題?&#xff0c;同時不增加對象的引用計數。它的實現原理基于與 std::shared_ptr 共享的 ?控制塊&#xff08;Control Blo…

【ManiSkill】環境success條件和reward函數學習筆記

1. “PickCube-v1” info["success"]&#xff1a;用于指示任務是否成功完成 布爾型張量&#xff0c;在環境的evaluate()方法中計算并返回&#xff1a; "success": is_obj_placed & is_robot_static這確保了機器人不僅能將物體準確放置在目標位置&am…

用空閑時間做了一個小程序-二維碼生成器

一直在摸魚中賺錢的大家好呀~ 先向各位魚友們匯報一下情況&#xff0c;目前小程序已經有900的魚友注冊使用過。雖然每天都有新的魚友注冊&#xff0c;但是魚友增長的還很緩慢。自從國慶前的文字轉語音的工具上線到現在已經將近有1個月沒有更新小程序了。但是今天終終終終終于又…

31天Python入門——第14天:異常處理

你好&#xff0c;我是安然無虞。 文章目錄 異常處理1. Python異常2. 異常捕獲try-except語句捕獲所有的異常信息獲取異常對象finally塊 3. raise語句4. 自定義異常5. 函數調用里面產生的異常補充練習 異常處理 1. Python異常 Python異常指的是在程序執行過程中發生的錯誤或異…

PyQt6實例_批量下載pdf工具_使用pyinstaller與installForge打包成exe文件

目錄 前置&#xff1a; 步驟&#xff1a; step one 準備好已開發完畢的項目代碼 step two 安裝pyinstaller step three 執行pyinstaller pdfdownload.py&#xff0c;獲取初始.spec文件 step four 修改.spec文件&#xff0c;將data文件夾加入到打包程序中 step five 增加…

Axure項目實戰:智慧城市APP(完整交互匯總版)

親愛的小伙伴&#xff0c;在您瀏覽之前&#xff0c;煩請關注一下&#xff0c;在此深表感謝&#xff01; 課程主題&#xff1a;智慧城市APP 主要內容&#xff1a;主功能&#xff08;社保查詢、醫療信息、公交查詢等&#xff09;、活動、消息、我的頁面匯總 應用場景&#xff…

Appium Inspector使用教程

1.下載最新版本 https://github.com/appium/appium-inspector/releases 2.本地啟動一個Appium服務 若Android SDK已安裝Appium服務&#xff0c;則在任意terminal使用appium啟動服務即可 3.Appium Inspector客戶端配置連接到Appium服務 Configuring and Starting a Session…

Pycharm(七):幾個簡單案例

一.剪刀石頭布 需求&#xff1a;和電腦玩剪刀石頭布游戲 考察點&#xff1a;1.隨機數&#xff1b;2.判斷語句 import random # numrandom.randint(1,3) # print(num) # print(**30) #1.錄入玩家手勢 playerint(input(請輸入手勢&#xff1a;&#xff08;1.剪刀 2.石頭 3&…

Python Cookbook-4.13 獲取字典的一個子集

任務 你有一個巨大的字典&#xff0c;字典中的一些鍵屬于一個特定的集合&#xff0c;而你想創建一個包含這個鍵集合及其對應值的新字典。 解決方案 如果你不想改動原字典: def sub_dict(somedict,somekeys,default None):return dict([(k, somedict.get(k,default)) for k…

VMware Ubuntu 網絡配置全攻略:從斷網到暢通無阻

一、網絡連接模式選擇&#xff08;先搞懂原理&#xff09; VMware提供三種網絡模式&#xff0c;就像手機的不同網絡套餐&#xff1a; 模式適用場景特點類比NAT個人上網/新手首選虛擬機共享主機IP&#xff0c;能上網但隱身家用WiFi橋接服務器/需要被局域網訪問虛擬機會獲得獨立…

鏈表(C++)

這是本人第二次學習鏈表&#xff0c;第一次學習鏈表是在大一上的C語言課上&#xff0c;首次接觸&#xff0c;感到有些難&#xff1b;第二次是在大一下學習數據結構時&#xff08;就是這次&#xff09;&#xff0c;使用C再次理解鏈表。同時&#xff0c;這也是開啟數據結構學習寫…

【SPP】藍牙串口協議應用層深度解析:從連接建立到實戰開發

目錄 一、SPP應用層協議框架與角色模型 1.1 分層協議棧模型 1.2 設備角色模型&#xff08;DevA 與 DevB 交互&#xff09; 二、連接建立流程&#xff1a;從 SDP 到 RFCOMM 2.1 服務發現&#xff08;SDP&#xff09;流程&#xff08;SDP 記錄關鍵參數&#xff09; 2.2 連接…

Giteki 認證:無線產品進入日本市場的關鍵保障

目錄 適用產品認證范圍 認證項目及技術要求 認證流程 認證周期 與其他認證的對比 常見問題 注意事項 Giteki 認證&#xff0c;其名稱來源于日本語 “技適マーク”&#xff0c;羅馬字拼寫為 “GITEKI” &#xff0c;在行業內也常被稱為 Telec 認證、MIC 認證、RF 認證或技…

Ubuntu24.04 配置遠程桌面服務

一&#xff1a;安裝 sudo apt update sudo apt install vino 二&#xff1a;設置 gsettings set org.gnome.Vino require-encryption false # 關閉加密&#xff08;某些 VNC 客戶端不支持加密&#xff09; gsettings set org.gnome.Vino prompt-enabled false # 關閉連接…

人工智能與軟件工程結合的發展趨勢

AI與軟件工程的結合正在深刻改變軟件開發的流程、工具和方法&#xff0c;其發展方向涵蓋了從代碼生成到系統維護的整個生命周期。以下是主要的發展方向和技術趨勢&#xff1a; 1. 軟件架構體系的重構 從“面向過程”到“面向目標”的架構轉型&#xff1a; AI驅動軟件設計以目標…