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 最终结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是一种流行的JavaScript框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得开发者可以更高效地构建交互式的Web应用程序。 要在Vue3中实现上传图片阿里云OSS,你可以按照以下步骤进行操作: 1. 安装依赖:首先,你需要安装阿里云OSS的JavaScript SDK。可以使用npm或yarn命令来安装,例如: ``` npm install ali-oss ``` 2. 配置OSS客户端:在Vue3的代码中,你需要创建一个OSS客户端实例,并配置相关参数,如AccessKeyId、AccessKeySecret、Endpoint等。这些参数可以在阿里云OSS控制台中获取。 3. 创建上传组件:在Vue3中,你可以创建一个上传组件,用于选择图片文件并触发上传操作。可以使用`<input type="file">`元素来实现文件选择功能,并监听其`change`事件。 4. 上传图片:在上传组件中,你可以编写上传图片的逻辑。当用户选择了图片文件后,你可以通过OSS客户端调用`put`方法来上传图片文件到阿里云OSS。 下面是一个简单的示例代码,演示了如何在Vue3中上传图片阿里云OSS: ```javascript <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> import OSS from 'ali-oss'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const client = new OSS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret', bucket: 'your-bucket-name', region: 'your-oss-region', // 其他配置参数... }); // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 调用OSS客户端的put方法上传文件 client.put(fileName, file).then(response => { console.log('上传成功', response); // 在这里可以处理上传成功后的逻辑 }).catch(error => { console.error('上传失败', error); // 在这里可以处理上传失败后的逻辑 }); } } } </script> ``` 请注意,上述代码中的`your-access-key-id`、`your-access-key-secret`、`your-bucket-name`和`your-oss-region`需要替换为你自己的阿里云OSS相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值