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.com
  accessKeyId: ram sk id
  accessKeySecret: ram sk s
  bucket: bucket名
  ram: ram
  oss-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] // 文件上传名称定义为当前时间戳

//请求接口得到token
  let res = await getCOSSecretKey( {
    "emial":"xxx"
  });
  if(!res.data) return console.error('credentials invalid')
  //启动OSS客户端
  let stsConfig = res.data
  const 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.mfbz.cn/a/126821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络溯源-PSEXEC-简单

题干&#xff1a; 我们的入侵检测系统&#xff08;IDS&#xff09;已发出警报&#xff0c;指示涉及使用PsExec的可疑横向移动活动。为了有效响应此事件&#xff0c;您作为 SOC 分析师的角色是分析存储在 PCAP 文件中的捕获网络流量。 攻击者首次攻击成功的计算机源网络IP地址…

23款奔驰GLC260L升级香氛负离子 感受清香四溢

香氛负离子系统是由香氛系统和负离子发生器组成的一套配置&#xff0c;也可以单独加装香氛系统或者是负离子发生器&#xff0c;香氛的主要作用就是通过香氛外壳吸收原厂的香水再通过空调管输送到内饰中&#xff0c;而负离子的作用就是安装在空气管中通过释放电离子来打击空气中…

记录一次数据库内存占满

一&#xff0c;背景及表现 用户普遍反馈业务功能&#xff0c;无法加载出数据&#xff0c;服务挂了 二&#xff0c;数据库指标 三&#xff0c;排查方反馈 排查方反馈&#xff1a;查全量数据导致的&#xff0c;就是没查出来但是一直在查 四&#xff0c;分析 1.应用服务器问题…

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

硬件&#xff1a;ZYNQ7100 软件&#xff1a;Vivado 2017.4、Xilinx SDK 2017.4   ZYNQ PL 和 PS 的通信方式有 AXI GPIO、BRAM、DDR等。对于数据量较少、地址不连续、长度规则的情况&#xff0c;BROM 比较适用。而对于传输速度要求高、数据量大、地址连续的情况&#xff0c;比…

facebook分享-错误记录

无法拉起分享 "code":30000,"msg":"fail:API_ERROR: API_ERROR" 1.确认facebook的app_id是否一致 2.确认是否在app_id应用的白名单里&#xff0c;注册meta开发者&#xff0c;然后把主页的user_id给管理员加 A ContentProvider for this app was…

dapp技术开发

随着区块链技术的普及和应用&#xff0c;DApp&#xff08;去中心化应用&#xff09;逐渐成为了区块链领域中备受关注的核心部分。DApp是一种运行在去中心化网络上的应用程序&#xff0c;其开发、部署和运行都不依赖于任何中心化的实体或中介机构。这种应用程序的兴起和发展&…

详解机器学习最优化算法

前言 对于几乎所有机器学习算法&#xff0c;无论是有监督学习、无监督学习&#xff0c;还是强化学习&#xff0c;最后一般都归结为求解最优化问题。因此&#xff0c;最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中&#xff0c;小编将对机器学习中所使用的…

赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单

近日&#xff0c;由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办的“2023工业信息安全大会”在北京成功举行。 会上&#xff0c;国家工业信息安全发展研究中心对为国家工业信息安全漏洞库&#xff08;CICSVD&#xff09;提供技术支持的单位授牌表彰。北京赛宁…

Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件 效果 使用示例 // 点按connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);// 长按开始connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);//…

通配符匹配

题目链接 通配符匹配 题目描述 注意点 s 仅由小写英文字母组成p 仅由小写英文字母、‘?’ 或 ‘*’ 组成‘?’ 可以匹配任何单个字符‘*’ 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09; 解答思路 最初想到的是dfs 剪枝&#xff0c;但是用例超时了参照题…

React的refs和表单组件总结

React的refs和表单组件 react中refs的使用字符串形式的ref react核心就在于虚拟DOM&#xff0c;也就是React中不总是直接操页面的真实DOM元素&#xff0c;并且结合Diffing算法&#xff0c;可以做到最小化页面重绘&#xff0c;但有些时候不可避免我们需要一种方法可以操作我们定…

禅道项目信息通知到钉钉群配置步骤

禅道是我们常用的项目进度管理工具&#xff0c;禅道集成了webhook功能&#xff0c;可以通过发送 JSON 格式的数据到第三方hook地址&#xff0c;进行消息集成&#xff0c;包括钉钉、企业微信以及飞书。可以考虑将禅道和钉钉两者可以结合起来&#xff0c;将项目信息发送到钉钉群&…

SAP 10策略测试及简介

从今天开始将把PP模块中常用的一些策略进行一个测试,编写成系统的文档,有点策略经常不用自己都忘了一些策略的特性。所以还是有必须形成文档的形式记录下来 1、首先准备好物料 成品物料为AB0,在MRP3视图中维护对应的策略组的10 同时选择消耗模式为2.消耗期间都是999 2、其他…

软件安全测试怎么做?如何确保软件授权安全

在数字化不断演进的今天&#xff0c;软件安全测试变得至关重要。它验证了软件是否容易受到网络攻击&#xff0c;并检验恶意或意外输入对操作的影响。安全测试的目标是保障系统和信息的安全性和可靠性&#xff0c;确保它们不接受未授权的输入。 一、安全测试准备 开发者必须认识…

长安链可验证数据库,保证数据完整性的可信存证方案

近日&#xff0c;长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证&#xff0c;显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景&#xff0c;被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

【Cheat Engine7.5】基础教程第三关(步骤4)

文章目录 一、简介二、操作步骤2.1、加载进程2.2、查找健康数据2.2.1、首次扫描(单浮点数100)2.2.2、点击打我&#xff0c;再次扫描数值97.112.2.3、修改数据值为50002.2.4、测试正常 2.3、查找弹药数据2.3.1、双浮点数1002.3.2、点击开火2.3.3、修改数据2.3.4、测试 2.4、通关…

福布斯:Salesforce和ZohoCRM,哪个更适合你?

上周&#xff0c;福布斯发布了《CRM软件指南》&#xff0c;从企业的实际需求出发&#xff0c;通过性价比、功能、可用性、第三方集成、分析工具等多个维度进行比较&#xff0c;最终推选出7家代表厂商。本周&#xff0c;福布斯就其中呼声较高的两家企业Salesforce、Zoho CRM做进…

Java 设计模式——享元模式

目录 1.概述2.结构3.实现3.1.抽象享元3.2.具体享元3.3.享元工厂3.4.测试 4.优缺点5.使用场景6.JDK 源码解析——Integer 类 1.概述 &#xff08;1&#xff09;享元模式 (Flyweight Pattern) 是一种结构型设计模式&#xff0c;主要通过共享对象来减少系统中的对象数量&#xff…

振南技术干货集:C语言的一些“骚操作”及其深层理解(3)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 &#xff08;如何将 35 转为对应的十六进制字符串”0X23”&#xff1f;&#xff09; 二 、转义符\ &#xff08;打入字符串内部的“奸细”。&#xff09; 三、字符串常量的连接 &#xff…