vue3+antd實現華為云OBS文件拖拽上傳詳解

1、文件上傳核心流程

  1. 選擇文件??:用戶通過拖拽或點擊選擇文件
  2. 手動觸發上傳??:點擊"確定"按鈕后開始上傳(阻止自動上傳)
  3. ??獲取上傳憑證??:從后端獲取華為云OBS的上傳配置
  4. 構建表單數據??:按照華為云要求組織表單數據
  5. 執行上傳??:發送POST請求到華為云OBS
  6. 返回結果??:處理上傳結果并返回文件信息

2、關鍵參數說明

參數說明來源
file要上傳的文件對象用戶選擇
businessName業務分類名稱組件props傳入
privateMode是否私有模式默認為true
sourceType數據源類型('ka'/'oin')組件props傳入
bucketOBS桶名稱后端接口返回
endpointOBS服務端點后端接口返回
policy上傳策略后端接口返回
signature簽名后端接口返回
accessId訪問密鑰ID后端接口返回

3、部分字段解釋

1、業務名稱 (businessName)??

??作用??:

  • ??文件分類存儲??:用于在華為云OBS中創建業務專屬目錄,實現文件按業務線分類存儲
  • ??權限隔離??:不同業務文件可以設置不同的訪問權限
  • 檢索過濾??:便于后續按業務維度查詢和管理文件
// 上傳到路徑:kafile/訂單業務/2023/08/30/時間戳.jpg
pathParts = ['kafile', '訂單業務', '2023/08/30', '1693388800000.jpg']// 如果沒有業務名稱則上傳到:kafile/2023/08/30/時間戳.jpg
pathParts = ['kafile', '2023/08/30', '1693388800000.jpg']

??2、數據源類型 (sourceType)??

??作用??:

  • 多賬戶切換??:對接不同華為云賬號或服務端點
  • 差異化處理??:不同來源的文件可能需要不同的上傳策略
  • 擴展性??:預留的枚舉字段方便后續接入新存儲系統

3、為什么需要這些參數???

1.主要用來區分調不同服務的接口來獲取華為云OBS的上傳憑證???

  • 同一系統可能服務多個業務線(如大客戶、oin等)
  • 不同業務對文件存儲的要求不同(如訂單需要長期保存,臨時文件只需保留7天)

2.為什么需要調用后端接口獲取華為云OBS的上傳憑證?

華為云OBS的直傳需要以下安全憑證:(接口返回)

{bucket: "your-bucket-name",       // 存儲桶名稱endpoint: "obs.cn-south-1.myhuaweicloud.com", // 區域端點policy: "eyJleHBpcmF0aW9uIjo...", // 經過Base64編碼的上傳策略signature: "Dq1YpZxlQODhQwM...",   // 對policy的簽名accessId: "AKIDEXAMPLE"           // 臨時訪問密鑰ID
}

安全原因??:直接在前端存儲華為云AK/SK是極度危險的,必須通過后端中轉。

3.為什么還需要拼接上傳url?

在華為云OBS(對象存儲服務)中,拼接上傳URL (https://${bucket}.${endpoint}) 是??華為云OBS API的強制要求??,這種設計涉及到底層的訪問機制和安全策略。

華為云OBS的訪問URL遵循特定格式:

https://[bucket名稱].[區域端點]

4.為什么需要獲取當前日期格式的目錄?

getCurrentDateDir()?是一個用于 ??按日期自動生成文件存儲目錄?? 的工具函數。

自動組織文件存儲結構??

將文件按日期分目錄存儲,最終路徑如:
kafile/業務名/2023/8/30/文件名.ext

4、代碼實現

<template><a-upload-dragger:max-count="maxCount"//最大上傳文件數:before-upload="beforeUpload"//上傳前的處理函數v-model:fileList="fileList"//雙向綁定文件列表數據 ><p>點擊或拖拽文件上傳</p></a-upload-dragger><a-button type="link" @click="handleOk">確定</a-button>
</template><script setup>
import { ref } from 'vue';
import { message } from 'ant-design-vue';
import dayjs from 'dayjs';const props = defineProps({maxCount: Number,// 最大上傳文件數量businessName: String,// 業務名稱sourceType: { type: String, default: 'ka' }// 數據源類型,默認'ka'
});const emits = defineEmits(['handleUpload']);const fileList = ref([]);// 阻止自動上傳的函數,返回false表示阻止默認上傳行為
const beforeUpload = () => false;// 處理確定按鈕點擊
const handleOk = async () => {if (!fileList.value.length) {// 檢查是否有文件被選中message.warning('請先選擇文件');return;}try {// 獲取第一個文件的原始文件對象const file = fileList.value[0].originFileObj;// 調用上傳函數并等待結果const result = await uploadToHuaweiOBS({file,// 文件對象businessName: props.businessName,// 業務名稱sourceType: props.sourceType// 數據源類型});emits('handleUpload', {bucketName: result.bucketName,// 存儲桶名稱oriFileName: result.originalName,// 原始文件名fileName: result.fileNameWithoutDir,// 不含目錄的文件名file,// 文件對象dir: 'kafile'// 存儲目錄});message.success('文件上傳成功');} catch (error) {message.error(`上傳失敗: ${error.message}`);}
};// 華為云OBS上傳函數
const uploadToHuaweiOBS = async ({ file, businessName = '', sourceType = 'ka' }) => {// 1. 調用后端接口獲取華為云OBS的上傳憑證const authData = await getUploadAuth(sourceType);// 2. 準備上傳參數const { bucket, endpoint, policy, signature, accessId } = authData;// 構建上傳URLconst url = `https://${bucket}.${endpoint}`;// 3. 構建文件路徑const fileDir = getCurrentDateDir(); // 獲取當前日期格式的目錄const fileName = generateFileName(file.name); // 生成新文件名const folder = 'kafile'; // 設置存儲目錄// 構建完整路徑數組const pathParts = [folder, fileDir, fileName];// 如果有業務名稱,插入到路徑中if (businessName) pathParts.splice(1, 0, businessName);// 拼接完整文件路徑const fileKey = pathParts.join('/');// 4. 構建表單數據用來做文件上傳const formData = new FormData();// 按照華為云要求的順序添加字段formData.append('key', fileKey);// 文件路徑formData.append('policy', policy);// 上傳策略formData.append('AccessKeyId', accessId);// 訪問密鑰IDformData.append('signature', signature);// 簽名formData.append('file', file);// 文件本身// 5. 執行上傳(這里是直傳華為云OBS,注意不是后端接口)await axios.post(url, formData);// 6. 返回結果(這里是華為云OBS返回的參數)return {fileUrl: `${url}/${fileKey}`,// 完整文件URLfileName,// 生成的文件名bucketName: bucket,// 存儲桶名稱originalName: file.name,// 原始文件名fileNameWithoutDir: pathParts.slice(1).join('/'),// 不含根目錄的路徑relativePath: fileKey,// 相對路徑businessName// 業務名稱};
};// 輔助函數
// 如需補零格式(推薦):使用 'YYYY/MM/DD'
const getCurrentDateDir= () => {return dayjs().format('YYYY/MM/DD'); // 輸出示例: "2023/08/30"
};// 生成帶時間戳的新文件名
const generateFileName = (originalName) => {const ext = originalName.split('.').pop();// 獲取文件擴展名return `${Date.now()}.${ext}`;// 時間戳+擴展名
};
</script>

5、組件使用

<template><HuaweiUpload:max-count="3"business-name="customer-service"source-type="oin"@handle-upload="handleUpload"/>
</template><script setup>
import { ref } from 'vue';
import { message } from 'ant-design-vue';const uploading = ref(false);const handleUpload = async (fileInfo) => {uploading.value = true;const formData = new FormData()//創建表單數據對象for (const key in data) {//遍歷數據對象并添加到表單formData.append(key, data[key])}try {//調用自己的業務邏輯const { data } = await weeklyImport(formData)if (data.importStatus === '1') {useMessage().success('導入成功')} else if (data.importStatus === '2') {useMessage().error('導入失敗,請查看歷史記錄')}} catch (error) {useMessage().warning('導入失敗,請查看歷史記錄')} finally {//隱藏加載狀態uploading.value = false}
};
</script>

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

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

相關文章

Mac 開發環境與配置操作速查表

Mac 開發環境與配置操作速查表 安裝和配置 nvm / Node 安裝 Homebrew Homebrew 安裝參考文章 如果沒有VPN&#xff0c;不要使用此命令安裝&#xff01; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew --v…

【論文簡讀】MuGS

今天讀一篇ICCV 2025的文章&#xff0c;關注的是Generalizable Gaussian Splatting&#xff0c;作者來自華中科技大學。 文章鏈接&#xff1a;arxiv 代碼倉庫&#xff1a;https://github.com/EuclidLou/MuGS&#xff08;摘要中的鏈接&#xff0c;但暫時404&#xff09; 文章目…

基于SpringBoot和百度人臉識別API開發的保安門禁系統

角色&#xff1a; 管理員、保安 技術&#xff1a; Spring Boot, MyBatis, MySQL, PageHelper, Bootstrap, jQuery, JavaScript, CSS3, HTML5, JSP, 百度人臉識別API 核心功能&#xff1a; 小區保安門禁系統是一個基于Spring Boot技術棧開發的綜合性平臺&#xff0c;旨在實現小區…

抖音電商首創最嚴珠寶玉石質檢體系,推動行業規范與消費擴容

8月27日&#xff0c;“抖音電商開放日質檢專場”活動在廣州華林國際舉行。活動上&#xff0c;抖音電商首次對外介紹了質檢倉配一體化中心&#xff08;QIC&#xff09;的運作流程&#xff0c;并發布了服務升級計劃。這一行業首創的“先鑒定后發貨”模式&#xff0c;被認為推動了…

SpringBoot整合Spring WebFlux棄用自帶的logback,使用log4j2,并啟動異步日志處理

第一步&#xff1a;修改pom文件<!-- Spring Boot Starter WebFlux (排除默認日志) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>${spring-boot.vers…

理解虛擬 DOM:前端開發中的高效渲染利器

在前端開發中&#xff0c;我們經常聽到 虛擬 DOM&#xff08;Virtual DOM&#xff09; 這個概念。它是 React、Vue 等框架的核心機制之一&#xff0c;用來提升性能和簡化開發。那么&#xff0c;虛擬 DOM 到底是什么&#xff1f;為什么要用它&#xff1f;又是如何工作的呢&#…

GraphRAG數據可視化

GraphRAG數據可視化

vue/react項目如何跳轉到一個已經寫好的html頁面

如果是一個你copy的別人的網站&#xff0c;某些頁面是已經可以直接使用的&#xff0c;但是有些頁面需要在vue/react項目中重新二次調整加工&#xff0c;這個時候&#xff0c;就需要將html文件和vue/react項目結合&#xff0c;當某些頁面可以直接使用&#xff0c;就直接跳轉到這…

MYSQL-表的約束(下)

目錄 自增長 唯一鍵 外鍵 自增長 MySQL自增長&#xff08;Auto-Increment&#xff09; 是一種字段屬性&#xff0c;用于為表中的記錄自動生成唯一的連續整數&#xff0c;常作為主鍵或唯一標識字段使用&#xff0c;避免手動輸入重復值。 核心特性 1. 自動賦值&#xff1a…

《UE5_C++多人TPS完整教程》學習筆記44 ——《P45 傾斜與側向移動(Leaning And Strafing)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P45 傾斜與側向移動&#xff08;Leaning And Strafing&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

使用docker搭建嵌入式Linux開發環境

文章目錄1、前言2、安裝docker3、編寫容器管理腳本4、創建容器1、前言 在日常開發全志、rk等不同平臺時&#xff0c;大多數時候只有一個編譯主機&#xff0c;但不同sdk所需要的編譯環境可能不同。所以本文將記錄使用docker為每個平臺創建獨立的開發環境。 2、安裝docker # 1…

【開題答辯全過程】以基于Android的校園跳蚤市場交易系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【學習筆記】GB 42250-2022標準解析

隨著數字化轉型的加速推進和網絡安全威脅的日益復雜化&#xff0c;網絡安全專用產品作為保護關鍵信息基礎設施的第一道防線&#xff0c;其安全性和可靠性受到國家的高度重視。GB 42250-2022《信息安全技術 網絡安全專用產品安全技術要求》作為一項強制性國家標準&#xff0c;于…

QML開發踩坑記:從MVVM到QWidget的掙扎

如題&#xff1a;最近這一周在開發的時候被qml不友好的前端框架打敗了。首先&#xff0c;我沒深入&#xff08;系統的&#xff09;學習過前端的內容&#xff0c;就是在學習Qt的時候了解到了qwidget&#xff0c;后來發現美化不太足的樣子&#xff0c;外加AI十分推崇基于QML的MVV…

[Mysql數據庫] 知識點總結5

1. 什么是“最少權限原則”&#xff1f;答&#xff1a;應用最少權限原則就是僅為用戶授予高效地完成任務所需的權限&#xff0c;除此之外的任何權限均不能授 予&#xff0c;這可以降低用戶修改或查看&#xff08;無意或惡意&#xff09;他們無權修改或查看的數據的機率&#xf…

儲能變流器學習之MPPT

MPPT最大功率點追蹤技術詳解 引言 在可再生能源系統中&#xff0c;最大化能量捕獲效率是核心目標。無論是光伏發電系統還是儲能變流器&#xff08;PCS&#xff09;&#xff0c;最大功率點追蹤&#xff08;MPPT&#xff09; 技術都是實現這一目標的關鍵。本文將深入探討MPPT技術…

qData 數據中臺完整功能介紹 —— 商業版與開源版功能對比

一、qData 數據中臺概覽 在數字化轉型的大背景下&#xff0c;數據已經成為企業最核心、最具價值的資產。qData 數據中臺&#xff0c;作為企業數據治理與應用的關鍵平臺&#xff0c;憑借高性能與創新理念脫穎而出。它秉持 “高效、安全、靈活、開放” 的設計原則&#xff0c;致力…

Xshell 自動化腳本大賽技術文章大綱

一、引言1.1 大賽背景與意義介紹 Xshell 在運維、開發等領域的廣泛應用&#xff0c;強調自動化腳本對于提升效率、減少錯誤的重要性。闡述大賽旨在激發用戶創新&#xff0c;挖掘 Xshell 自動化腳本更多潛力&#xff0c;促進技術交流與共享。1.2 目標受眾明確文章面向熟悉基本 L…

Python 數據分析學習筆記:Pandas 邏輯運算

&#x1f539; DA9&#xff1a;2020年畢業且使用Java的用戶&#x1f4cc; 題目描述篩選出 2020年畢業 且 常用語言為 Java 的用戶&#xff0c;輸出他們的全部信息&#xff0c;并設置顯示選項以完整顯示數據。? 正確代碼import pandas as pd# 讀取數據 Nowcoder pd.read_csv(N…

圖像邊緣檢測

目錄 一.圖像邊緣檢測 1.圖像邊緣檢測概述 2.Sobel算子原理與實現 3.Scharr算子 4.Laplacian算子 5.Canny邊緣檢測&#xff08;重點&#xff09; 6.效果對比 一.圖像邊緣檢測 1.圖像邊緣檢測概述 2.Sobel算子原理與實現 代碼是實現步驟&#xff1a; 邊緣檢測是圖像處…