vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证,前端通过凭证直传图片等文件到OSS中

一 OSS配置

增加用户和角色,创建OSS bucket

1.1 添加用户

登录阿里云管理控制台,右侧头像,进入访问控制

点击左侧导航栏的身份管理的用户,点击添加用户

输入名称,点击open api调用访问,确定

点击刚创建的用户,点击权限管理,点击新增授权

搜索sts,添加

在认证管理中

创建一个accesskey,并记录保存,后续需要使用

1.2 添加角色

在左侧导航栏中身份管理点击角色,创建角色

选择阿里云账号

填入有意义的名称,选择当前云账号信任

点击新创建的角色,添加授权,搜索oss,将两个权限都添加

同时,在角色信息中,将arn记录保存,后续需要使用

1.3 bucket创建

在对象存储中,创建bucket

如果需要公共读,则勾选公共读,如果仅自己读写,则选择私有,这里我选择了公共读,地域我选择了深圳,根据服务器部署位置来选

创建完成后,进入bucket,在数据安全,选择跨域设置,点击创建规则

来源为请求服务器地址,这里演示我填*

点击概览,根据自己的选择,记下访问的endpoint,这里为选择了外网访问的endpoint

二 后端配置

springboot作为后端服务

2.1 添加maven依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>

2.2 配置访问密钥

在yaml配置文件中添加

oss:endpoint: sts.cn-shenzhen.aliyuncs.comaccessKeyId: ram sk idaccessKeySecret: ram sk sbucket: bucket名ram: ramoss-endpoint: oss-xxx

其中

  • endpoint添加sts的endpoint,如果添加oss的endpoint会报错
  • accessKeyId 和 secret 是创建用户的accessKeyId和secret
  • ram为 创建的角色的arn
  • bucket是oss里的桶名称
  • oss-endpoint是oss的bucket的endpoint

2.3 添加控制器接受请求创建sts token

package com.fooleryang.remark.controller;/*** title:OssController* description: TODO* date: 2023/11/9* author: fooleryang* version: 1.0*/
@RestController
@RequestMapping("/api/oss")
@Slf4j
public class OssController {@Value("${oss.accessKeyId}")private String secretId;@Value("${oss.accessKeySecret}")private String secretKey;@Value("${oss.bucket}")private String bucketName;@Value("${oss.endpoint}")private String endpoint;@Value("${oss.ram}")private String  ram;@Value("${oss.ossendpoint}")private String  ossEndpoint;@GetMapping("/aly")public Map<String,String > getsts(String userEmail){try {// 添加endpoint。适用于Java SDK 3.12.0及以上版本。DefaultProfile.addEndpoint("", "Sts", endpoint);// 构造default profile。IClientProfile profile = DefaultProfile.getProfile("", secretId, secretKey);// 构造client。DefaultAcsClient client = new DefaultAcsClient(profile);final AssumeRoleRequest request = new AssumeRoleRequest();// 适用于Java SDK 3.12.0及以上版本。request.setSysMethod(MethodType.POST);request.setRoleArn(ram);//角色会话名称request.setRoleSessionName(userEmail);  //这里我通过前端传参获取,到时候可以查看文件是谁传的
//           if(!aliOss.getPolicy().isEmpty()) request.setPolicy(aliOss.getPolicy());request.setDurationSeconds(3600L);final AssumeRoleResponse response = client.getAcsResponse(request);AssumeRoleResponse.Credentials credentials = response.getCredentials();Map<String, String> result = new HashMap<String, String>();result.put("accessKeyId",credentials.getAccessKeyId());result.put("accessKeySecret",credentials.getAccessKeySecret());result.put("expiration",credentials.getExpiration());result.put("securityToken",credentials.getSecurityToken());result.put("region","oss-cn-shenzhen");result.put("bucket",bucketName);result.put("oss-endpoint",ossEndpoint);return result;}catch (Exception e) {log.error("error:"+e.getMessage());throw new RuntimeException(e);}}}

三 vue前端

先请求后端得到token,在直传到oss

3.1 导入依赖

 pnpm install ali-oss

3.2 上传功能

新建一个ts文件,用于请求后端接口得到token

这里我对axios进行了封装,请求按自己封装或者直接用axios都可

//获取临时凭证
export const getCOSSecretKey = (params) => {return http.get(`/oss/aly`,params)
}

再建一个ts文件,用于上传文件到oss

import OSS from 'ali-oss'
export const  uploadObject  = async (file, callback)  => {let fileName = file.name || ""const origin_file_name = fileName.split(".").slice(0, fileName.split(".").length - 1).join('.') // 获取文件名称// 获取当前时间戳const upload_file_name = new Date().getTime() + '.' + fileName.split(".")[fileName.split(".").length - 1] // 文件上传名称定义为当前时间戳//请求接口得到tokenlet res = await getCOSSecretKey( {"emial":"xxx"});if(!res.data) return console.error('credentials invalid')//启动OSS客户端let stsConfig = res.dataconst client = new OSS({region: stsConfig.region,// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。accessKeyId: stsConfig.accessKeyId,accessKeySecret: stsConfig.accessKeySecret,// 从STS服务获取的安全令牌(SecurityToken)。stsToken: stsConfig.securityToken,// 填写Bucket名称,例如examplebucket。bucket: stsConfig.bucket,});if(file.size>= 10 * 1024 * 1024){ //分片上传result = await client.multipartUpload(upload_file_name, file, {// 获取分片上传进度、断点和返回值。progress: (p, cpt, res) => {// onUploadProgress&&onUploadProgress(p)},// 设置并发上传的分片数量。parallel: 4,// 设置分片大小。默认值为1 MB,最小值为100 KB。partSize: 1024 * 1024,// headers,// 自定义元数据,通过HeadObject接口可以获取Object的元数据。mime: "text/plain",timeout: 120000  // 设置超时时间});callback(result.url)}else{ result = await client.put(upload_file_name, file)callback(result.url)}
}

四 vditor 图片上传调用

在使用vditor时,可以将图片上传到oss然后将返回的url插入到vditor中

具体过程如下:

4.1 vditor配置

创建vditor对象时加入upload配置
callback会将返回的url进行插入到内容中
vditor.value = new Vditor('vditor',{upload: {accept: "image/*",multiple: false,filename(name) {return name.replace(/[^(a-zA-Z0-9\u4e00-\u9fa5\.)]/g, "").replace(/[\?\\/:|<>\*\[\]\(\)\$%\{\}@~]/g, "").replace("/\\s/g", "");},handler(files) {function callback(path) {let name = files[0] && files[0].name;let succFileText = "";// if (vditor && vditor.value.currentMode === "wysiwyg") {succFileText += `\n <img alt=${name} src="${path}">`;// } else {// succFileText += `  \n![${name}](${path})`;// }document.execCommand("insertHTML", false, succFileText);}handleImageUpload(files, callback);},url(files, callback) {handleImageUpload(files, callback);}}}
)

4.2 自定义图片上传

这里就调用了步骤三中的上传功能,上传到OSS中

const handleImageUpload = async (file,callback) => {let res = await uploadObject(file,(url)=>{callback(url)})
}

4.3 最终结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/188244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引&#xff08;自行建立的index&#xff09;里&#xff0c;所以当select的是主键或二级索引就会很快&#xff0c;select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整&#xff0c;那我这个索引只起了前一半作用。 所以用复合索引&am…

探索微信小程序框架的精华——高质量的优秀选择

目录 引言&#xff1a; 1. 框架性能 2. 开发者工具支持 3. 文档和社区支持 4. 扩展能力 5. 使用率和稳定性 结语&#xff1a; 引言&#xff1a; 微信小程序作为一种轻量级、高效便捷的应用形式&#xff0c;已经在移动应用领域占据了重要地位。而其中&#xff0c;选择一个…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09; 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09;将于2024年2月23-25日在中国▪长沙…

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息&#xff0c;同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…

xcode SDK does not contain ‘libarclite‘

SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum deployment target解决方法 iOS13以上

macOS Sonoma 14.2beta2(23C5041e)发布(附黑白苹果镜像地址)

系统介绍 黑果魏叔11 月 10 日消息&#xff0c;今日向 Mac 电脑用户推送了 macOS 14.2 开发者预览版 Beta 2 更新&#xff08;内部版本号&#xff1a;23C5041e&#xff09;&#xff0c;本次更新距离上次发布隔了 14 天。 macOS Sonoma 14.2 添加了 Music 收藏夹播放列表&…

“Git实践指南:深入探索开发测试上线、分支管理与标签“

文章目录 引言一、Git的分支的使用1.分支2.标签3.分支与标签的关系4. 分支在实际中的作用5. 四个环境以及各自的功能特点6. 分支策略分支应用场景 二、Git的标签3.1 标签的基本使用3.3 标签的共享与推送 总结 引言 在现代软件开发中&#xff0c;版本控制是一个关键的环节&…

11 抽象向量空间

抽象向量空间 向量是什么函数什么是线性推论向量空间 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 可以是一个箭头&#xff0c;可以是一组实数&#xff0c;即一个坐标对。 箭头在高维&#xff08;4维&#xff0c;甚至更高&#xff09;空间&…

云效流水线docker部署 :node.js镜像部署VUE项目

文章目录 引言I 流水线配置1.1 项目dockerfile1.2 Node.js 镜像构建1.3 docker 部署引言 云效流水线配置实现docker 部署微服务项目:https://blog.csdn.net/z929118967/article/details/133687120?spm=1001.2014.3001.5501 配置dockerfile-> 镜像构建->docker部署。 …

电脑怎么录制视频,录制的视频怎么剪辑?

在现今数字化的时代&#xff0c;视频成为了人们日常生活中不可或缺的一部分。因此&#xff0c;对于一些需要制作视频教程、录制游戏或者是进行视频演示的人来说&#xff0c;电脑录屏已经成为了一个必不可少的工具。那么&#xff0c;对于这些人来说&#xff0c;如何选择一个好用…

C语言 每日一题 PTA 11.7 day13

1.求e的近似值 自然常数 e 可以用级数 1 1 / 1! 1 / 2! ⋯ 1 / n! ⋯ 来近似计算。 本题要求对给定的非负整数 n&#xff0c;求该级数的前 n 1 项和。 代码实现 #include<stdio.h> void main() {int a, i, j; double b 1; double c 1;printf("请输入一个数\n…

计算机网络第4章-通用转发和SDN

引子&#xff1a; 在前面&#xff0c;我们将基于目的地转发的特征总结为两个步骤&#xff1a; 查找目的IP地址&#xff08;匹配&#xff09;&#xff0c;然后将分组发送到有特定输出端口的交换结构&#xff08;“动作”&#xff09;。 但是这种转发特征会带来许多问题&#…

Redis的内存淘汰策略分析

概念 LRU 是按访问时间排序&#xff0c;发生淘汰的时候&#xff0c;把访问时间最久的淘汰掉。LFU 是按频次排序&#xff0c;一个数据被访问过&#xff0c;把它的频次 1&#xff0c;发生淘汰的时候&#xff0c;把频次低的淘汰掉。 几种LRU策略 以下集中LRU测率网上有很多&am…

使用电脑时提示msvcp140.dll丢失的5个解决方法

“计算机中msvcp140.dll丢失的5个解决方法”。在我们日常使用电脑的过程中&#xff0c;有时会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。那么&#xff0c;什么是msvcp140.dll呢&#xff1f;它的作用是什么&#xff1f;丢失它会对电脑产生什么影响呢&…

【uniapp】签名组件,兼容vue2vue3

网上找了个源码改吧改吧&#xff0c;清除了没用的功能和兼容性&#xff0c;基于uniapp开发的 样子 vue2 使用方法&#xff0c;具体的可以根据业务自行修改 <signature ref"signature" width"100%" height"410rpx"></signature>confi…

【数据结构】C语言实现单链表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个单链表: 该单链表使用动态内存分配空间,可以用来存储任意数量的同类型数据. 单链表结点(Node)需要包含两个要素:数据域data…

Leetcode2834. 找出美丽数组的最小和

Every day a Leetcode 题目来源&#xff1a;2834. 找出美丽数组的最小和 解法1&#xff1a;贪心 从最小正整数 1 开始枚举&#xff0c;设当前数为 num&#xff0c;如果 nums 里没有 target - num&#xff0c;就说明可以添加 num&#xff0c;依次填满直到有 n 个数即可。 用…

【云栖2023】张治国:MaxCompute架构升级及开放性解读

简介&#xff1a; 本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下 演讲人&#xff1a;张治国|阿里云智能计算平台研究员、阿里云MaxCompute负责人 演讲主题&#xff1a;MaxCompute架构升级及开放性解读 活动&#xff1a;2023云栖大会 MaxCompute发展经历了…

“目标值排列匹配“和“背包组合问题“的区别和leetcode例题详解

1 目标值排列匹配 1.1 从目标字符串的角度来看&#xff0c;LC139是一个排列问题&#xff0c;因为最终目标子串的各个字符的顺序是固定的&#xff1f; 当我们从目标字符串 s 的角度来看 LC139 “单词拆分” 问题&#xff0c;确实可以认为它涉及到排列的概念&#xff0c;但这种…

凯美瑞 vs 太空船:Web3 游戏生长的两条路径

撰文&#xff1a;Teng Yan&#xff08;0xPrismatic&#xff09;&#xff0c;Delphi Digital 研究员 编译&#xff1a;TinTinLand 来源&#xff1a;https://0xprismatic.substack.com/p/my-short-web3-gaming-thesis 经常有人问我关于 Web3 游戏的看法&#xff0c;所以我想以这…