news 2026/4/22 14:33:48

前端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/4/9 5:12:18

7、Linux 文件管理与查找全攻略

Linux 文件管理与查找全攻略 在 Linux 系统中,文件的共享、所有权设置、权限控制以及文件查找是非常重要的操作。下面将详细介绍这些方面的相关知识和操作方法。 1. 文件共享与权限管理 1.1 分组操作 分组概念 :分组是一组用户的集合,用于共享文件和促进协作。每个组都…

作者头像 李华
网站建设 2026/4/21 13:15:36

图Agent性能优化全攻略,基于MCP DP-420文档的10项最佳实践

第一章:图Agent性能优化概述在分布式系统与微服务架构日益复杂的背景下,图Agent作为数据采集、状态监控和行为分析的核心组件,其性能直接影响系统的可观测性与响应能力。随着节点数量增长和交互频率提升,图Agent面临高负载、低延迟…

作者头像 李华
网站建设 2026/4/23 1:30:37

易语言网络编程基础:构建网络版应用

易语言网络编程基础:构建网络版应用 💻 1.9.1 学习目标 🎯 作为本地应用到网络应用的关键升级章节,本节将解决前序系统“仅能本地使用、无法远程协作”的痛点,你将达成以下目标: 用**「快递收发系统」生活化…

作者头像 李华
网站建设 2026/4/20 23:40:50

云安全Agent配置难题,90%考生忽略的3个高危漏洞及修复方案

第一章:云安全Agent配置难题概述在现代云计算环境中,安全Agent作为主机层面威胁检测与响应的核心组件,广泛部署于虚拟机、容器及无服务器实例中。然而,随着架构复杂度上升和异构环境增多,Agent的初始配置与持续管理面临…

作者头像 李华
网站建设 2026/4/18 23:23:00

SVNAdmin2系统实战:5个关键场景下的企业级SVN管理解决方案

SVNAdmin2系统实战:5个关键场景下的企业级SVN管理解决方案 【免费下载链接】SvnAdminV2.0 基于web的SVN管理系统,支持HTTP协议、SVN协议、支持LDAP认证、Docker部署 项目地址: https://gitcode.com/gh_mirrors/sv/SvnAdminV2.0 SVNAdmin2是基于we…

作者头像 李华