news 2026/5/30 17:12:21

前端vue3调取阿里的oss存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端vue3调取阿里的oss存储

1. 整体流程概述

前端使用阿里云OSS上传文件的完整流程如下:

  1. 调用后端接口获取临时密钥
  2. 使用临时密钥初始化OSS客户端
  3. 调用OSS客户端上传文件
  4. 获取上传成功后的文件URL

2. 后端接口调用(获取临时密钥)

2.1 接口信息

  • 接口地址 : /pc/file/sts
  • 请求方式 :GET
  • 返回格式 :JSON

2.2 返回参数说明

{"code":200,// 状态码,0或200表示成功"msg":"操作成功","data":{"accessKeyId":"STS.NZQpZ...",// 临时AccessKeyId"accessKeySecret":"LJ8Z8...",// 临时AccessKeySecret"securityToken":"CAIS+...",// 临时安全令牌"endpoint":"oss-cn-hangzhou.aliyuncs.com",// OSS地域节点"bucketName":"rh-app-private",// OSS存储空间名称"bucketDomain":"https://rh-app-private.oss-cn-hangzhou.aliyuncs.com"// OSS存储空间域名}}

2.3 前端调用代码

importapifrom'@/utils/api'exportconstgetSTSToken=async()=>{try{constresponse=awaitapi.get('/pc/file/sts')if(response.code===200){returnresponse.data}else{thrownewError('获取STS密钥失败: '+(response.msg||'未知错误'))}}catch(error){console.error('获取STS密钥失败:',error)throwerror}}

3. OSS客户端初始化

3.1 安装阿里云OSS SDK

npm install ali-oss

3.2 初始化OSS客户端

importOSSfrom'ali-oss'import{getSTSToken}from'./sts'letclient=nullexportconstinitOSSClient=async()=>{try{consttoken=awaitgetSTSToken()// 解析region:从endpoint中提取region部分letregion=token.endpointif(token.endpoint&&token.endpoint.includes('.')){constparts=token.endpoint.split('.')if(parts.length>=3&&parts[0].startsWith('oss-')){region=parts[0]}else{region=parts[0]console.warn('非标准OSS endpoint格式:',region)}}// 存储bucketDomain以便上传时使用window.ossBucketDomain=token.bucketDomain// 创建OSS客户端实例client=newOSS({region:region,// 区域endpoint:token.endpoint,// 地域节点accessKeyId:token.accessKeyId,// 临时AccessKeyIdaccessKeySecret:token.accessKeySecret,// 临时AccessKeySecretstsToken:token.securityToken,// 临时安全令牌bucket:token.bucketName,// 存储空间名称// 配置自动刷新临时密钥refreshSTSToken:async()=>{constnewToken=awaitgetSTSToken()return{accessKeyId:newToken.accessKeyId,accessKeySecret:newToken.accessKeySecret,stsToken:newToken.securityToken}},// 刷新间隔:5分钟refreshSTSTokenInterval:300000})console.log('OSS客户端初始化成功')returnclient}catch(error){console.error('OSS客户端初始化失败:',error)throwerror}}

4. 文件上传实现

4.1 文件上传函数

exportconstuploadFileToOSS=async(file,type,phone,name)=>{try{// 确保OSS客户端已初始化if(!client){awaitinitOSSClient()}// 获取文件后缀constfileExt=file.name.substring(file.name.lastIndexOf('.'))consttimestamp=Date.now()// 根据文件类型生成不同的路径和文件名letfilePathif(type==='front'||type==='back'){// 身份证照片 - /Doctor_ID/手机号_医生姓名_时间戳.图片后缀constfolder='/Doctor_ID/'filePath=`${folder}${phone}_${name}_${timestamp}${fileExt}`}elseif(type==='medicalFront'||type==='medicalBack'){// 医师执业资格证照片 - /Doctor_PPC/手机号_医生姓名_时间戳.图片后缀constfolder='/Doctor_PPC/'filePath=`${folder}${phone}_${name}_${timestamp}${fileExt}`}else{// 其他类型文件filePath=`${type}-${timestamp}-${Math.random().toString(36).substring(2,10)}${fileExt}`}// 上传文件constresult=awaitclient.put(filePath,file)// 返回文件URL - 优先使用bucketDomain构建URLletfileUrl=result.urlif(window.ossBucketDomain&&filePath){// 移除filePath开头可能的斜杠constcleanFilePath=filePath.startsWith('/')?filePath.substring(1):filePath fileUrl=`${window.ossBucketDomain}/${cleanFilePath}`}returnfileUrl}catch(error){console.error('OSS上传失败:',error)thrownewError('文件上传失败')}}

4.2 调用上传函数

// 在Vue组件中调用consthandleFileChange=async(event,type)=>{constfile=event.target.files[0]if(!file)returntry{// 显示上传中提示showToast({message:'上传中...',duration:0})// 上传到OSS,传递必要参数constimageUrl=awaituploadFileToOSS(file,type,form.phone,form.name)// 存储图片URLif(type==='front'){form.frontIdCard=imageUrl}elseif(type==='back'){form.backIdCard=imageUrl}elseif(type==='medicalFront'){form.medicalFront=imageUrl}elseif(type==='medicalBack'){form.medicalBack=imageUrl}showToast('图片上传成功')}catch(error){console.error('图片上传失败:',error)showToast('图片上传失败,请稍后重试')// 清空文件输入event.target.value=''}}

5. 文件命名规范

5.1 身份证照片

  • 路径格式 : /Doctor_ID/手机号_医生姓名_时间戳.图片后缀
  • 示例 : /Doctor_ID/13800138000_张三_1734478800000.jpg

5.2 医师执业资格证照片

  • 路径格式 : /Doctor_PPC/手机号_医生姓名_时间戳.图片后缀
  • 示例 : /Doctor_PPC/13800138000_张三_1734478800000.jpg

6. 错误处理

6.1 接口调用错误

try{constresponse=awaitapi.get('/pc/file/sts')// 处理响应}catch(error){console.error('获取STS密钥失败:',error)showToast('OSS初始化失败,图片上传功能可能不可用')}

6.2 文件上传错误

try{constresult=awaitclient.put(filePath,file)// 处理上传结果}catch(error){console.error('OSS上传失败:',error)showToast('文件上传失败,请稍后重试')}

7. 关键代码示例

7.1 完整的OSS工具类(src/utils/oss.js)

importOSSfrom'ali-oss'importapifrom'@/utils/api'// 全局OSS客户端实例letclient=null// 获取STS临时密钥exportconstgetSTSToken=async()=>{try{constresponse=awaitapi.get('/pc/file/sts')if(response.code===0||response.code===200){returnresponse.data}else{thrownewError('获取STS密钥失败: '+(response.msg||'未知错误'))}}catch(error){console.error('获取STS密钥失败:',error)throwerror}}// 初始化OSS客户端exportconstinitOSSClient=async()=>{try{consttoken=awaitgetSTSToken()// 解析regionletregion=token.endpointif(token.endpoint&&token.endpoint.includes('.')){constparts=token.endpoint.split('.')if(parts.length>=3&&parts[0].startsWith('oss-')){region=parts[0]}else{region=parts[0]console.warn('非标准OSS endpoint格式:',region)}}// 存储bucketDomainwindow.ossBucketDomain=token.bucketDomain// 创建OSS客户端实例client=newOSS({region:region,endpoint:token.endpoint,accessKeyId:token.accessKeyId,accessKeySecret:token.accessKeySecret,stsToken:token.securityToken,bucket:token.bucketName,refreshSTSToken:async()=>{constnewToken=awaitgetSTSToken()return{accessKeyId:newToken.accessKeyId,accessKeySecret:newToken.accessKeySecret,stsToken:newToken.securityToken}},refreshSTSTokenInterval:300000})returnclient}catch(error){console.error('OSS客户端初始化失败:',error)throwerror}}// 上传文件到OSSexportconstuploadFileToOSS=async(file,type,phone,name)=>{try{if(!client){awaitinitOSSClient()}constfileExt=file.name.substring(file.name.lastIndexOf('.'))consttimestamp=Date.now()letfilePathif(type==='front'||type==='back'){constfolder='/Doctor_ID/'filePath=`${folder}${phone}_${name}_${timestamp}${fileExt}`}elseif(type==='medicalFront'||type==='medicalBack'){constfolder='/Doctor_PPC/'filePath=`${folder}${phone}_${name}_${timestamp}${fileExt}`}else{filePath=`${type}-${timestamp}-${Math.random().toString(36).substring(2,10)}${fileExt}`}constresult=awaitclient.put(filePath,file)letfileUrl=result.urlif(window.ossBucketDomain&&filePath){constcleanFilePath=filePath.startsWith('/')?filePath.substring(1):filePath fileUrl=`${window.ossBucketDomain}/${cleanFilePath}`}returnfileUrl}catch(error){console.error('OSS上传失败:',error)thrownewError('文件上传失败')}}

8. 注意事项

  1. 临时密钥有效期 :临时密钥通常有一定的有效期(默认1小时),代码中配置了自动刷新机制
  2. 文件大小限制 :建议在前端添加文件大小限制(如10MB),避免上传过大文件
  3. 错误处理 :完善的错误处理可以提高用户体验
  4. CORS配置 :确保OSS存储空间已正确配置CORS规则,允许前端域名访问
  5. 网络稳定性 :考虑添加重试机制,提高弱网络环境下的上传成功率
    通过以上流程,前端可以安全、高效地将文件上传到阿里云OSS,并获取可用的文件URL用于后续业务处理。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 1:16:21

MCP续证冲刺阶段,如何用3步完成考试预约并确保一次通过?

第一章:MCP续证考试预约概述 Microsoft Certified Professional(MCP)认证持有者在证书即将到期前,可通过参加续证考试来维持认证的有效性。续证考试不仅评估技术人员对最新技术栈的掌握程度,也确保其技能与当前企业IT环…

作者头像 李华
网站建设 2026/5/29 2:44:13

【MCP SC-400安全加固必备】:7个专业级漏洞修复步骤全公开

第一章:MCP SC-400安全漏洞修复概述MCP SC-400 是微软认证保护(Microsoft Certified Protection)系统中的关键安全控制协议之一,用于保障云环境中敏感数据的完整性与访问控制。近期发现该协议在身份验证流程中存在权限提升漏洞&am…

作者头像 李华
网站建设 2026/5/30 9:21:10

量子 Agent 多语言 API 适配从入门到精通(9大常见陷阱与规避方法)

第一章:量子 Agent 多语言 API 适配概述在构建跨语言、跨平台的量子计算应用时,量子 Agent 作为核心调度与通信组件,需支持多种编程语言通过统一接口访问底层量子资源。多语言 API 适配的目标是屏蔽底层实现差异,提供一致的调用语…

作者头像 李华
网站建设 2026/5/27 23:49:01

NFC硬件标签开发应用 包含微信小程序唤醒

最近我们硬件设备需要增加类似支付宝的碰一碰功能 ,相对扫码 碰一碰感觉更快捷。 随意,查阅资料 实践下,记录下 网上标签很多种,微信支持其中一个种可以唤醒拉起小程序的(这里安卓是可以直接跳小程序,ios由于微信只给出提示消息标签,再由标签跳转) NTAG213/215/216 类…

作者头像 李华
网站建设 2026/5/27 23:48:46

9、Linux文本查看全攻略

Linux文本查看全攻略 1. 文本查看基础 在Linux系统中,处理文本是一项常见且重要的任务。文本文件有多种格式,如英文文本、C语言代码、保存的电子邮件或HTML文件等。如果不确定文件内容是否为文本,可以使用 file 命令来判断。 1.1 分页查看文本 less 是一个常用的分页…

作者头像 李华
网站建设 2026/5/29 1:14:35

为什么你的Agent总是滞后?工业场景下实时响应失败的7个真相

第一章:工业控制 Agent 实时响应的核心挑战在工业自动化系统中,控制 Agent 承担着数据采集、逻辑决策与设备调度的关键职责。其实时响应能力直接影响生产效率与系统安全性。面对高频率的传感器输入、复杂的控制逻辑以及严格的执行时序,Agent …

作者头像 李华