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; 边缘检测是图像处…