实现阿里云oos云存储,简单几步

一、前言

虽然平常学习用的不多,但是用的时候再去找官方文档,也很繁琐,不如直接整理以下,方便粘贴复制,本文介绍两种图片上传方式①普通上传②服务端签名直传

1.普通上传

加载maven依赖 

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

 如果使用的是Java 9及以上的版本,则需要添加JAXB相关依赖

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

 需要先从阿里云获取相关accessKeyId和accessKeySecret,并创建bucket,找到创建好的就可以找到相关访问路径和endpoint 

 

附上传代码 

 @Test
    public void testFindPath() throws FileNotFoundException {
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        // 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
        String accessKeyId = "你的accessKeyId ";
        String accessKeySecret = "你的accessKeySecret ";
        String bucketName = "你的bucketName ";

        // 创建OSSClient实例。
        /*OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);*/

        InputStream inputStream = new FileInputStream("C:\\Users\\c2405\\Desktop\\R-C.jpg");
        ossClient.putObject(bucketName, "java.png", inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();

        System.out.println("上传成功");

    }

2.服务端签名直传

      服务端签名直传是指在服务端生成签名,将签名返回给客户端,然后客户端使用签名上传文件到OSS。由于服务端签名直传无需将访问密钥暴露在前端页面,相比客户端签名直传具有更高的安全性。本文介绍如何进行服务端签名直传。 

 

如果使用微服务可以直接加载一个maven依赖 ,这样我们可以直接在当前类中注入OSS 对象使用

<!-- aliyun:对象存储oss -->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-alicloud-oss</artifactId>
		</dependency>
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.lei.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author: 青山猿
 * @date: Created in 2023/12/26 0:20
 * @description:
 */
@RestController
public class OssController {

    @Autowired
    OSS ossClient;

    @Value("${spring.cloud.alicloud.access-key}")
    private String accessId;
    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endpoint;
    @Value("${spring.cloud.alicloud.oss.bucket}")
    private String bucket;


    @RequestMapping("/oss/policy")
    public R policy(){

        // 填写Host名称,格式为https://bucketname.endpoint。
        //例如: https://guli-mall-admin.oss-cn-beijing.aliyuncs.com/123.jpg
        String host = "https://"+bucket+"."+endpoint;
        // 设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。
        //String callbackUrl = "https://192.168.0.0:8888";
        // 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format+"/";

        Map<String, String> respMap = null;
        try {
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);

            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = ossClient.calculatePostSignature(postPolicy);

            respMap = new LinkedHashMap<String, String>();
            respMap.put("accessid", accessId);
            respMap.put("policy", encodedPolicy);
            respMap.put("signature", postSignature);
            respMap.put("dir", dir);
            respMap.put("host", host);
            respMap.put("expire", String.valueOf(expireEndTime / 1000));
            // respMap.put("expire", formatISO8601Date(expiration));


        } catch (Exception e) {
            // Assert.fail(e.getMessage());
            System.out.println(e.getMessage());
        }
        return R.ok().put("data",respMap);
    }
}

 最后可以搭配element-ui上传组件使用

 

<el-upload
  class="upload-demo"
  action="objData.host"
  :before-upload="ossPolicy"
  :file-list="fileList"
  :data='objData'
  list-type="picture">
  <el-button size="small" type="primary">点击上传</el-button>
  <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
<script>
  export default {
    data() {
      return {
        fileList: [{name: 'food.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}, {name: 'food2.jpeg', url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}],
        objData:{
            OSSAccessKeyId:'',
            policy:'',
            Signature:'',
            dir:'',
            host:'',
            key:''
        }
      };
    },
    methods: {
      ossPolicy(file){
            //在上传前,先进行服务器签名
            return new Promise((resolve,reject)=>{
                    this.axios.get('http://loclhost:8080/oss/policy').then(res=>{
                        //根据后台响应结果对objData赋值
                        this.objData.OSSAccessKeyId=res.data.accsessid;
                        this.objData.policy=res.data.policy;
                        this.objData.Signature=res.data.signature;
                        this.objData.dir=res.data.dir;
                        this.objData.host=res.data.host;
                        this.objData.key=res.data.dir+"${filename}";
                        resolve(true); //继续上传
                    }).catch(error=> {
                        console.log(error);
                           reject(false);  //停止上传
                    })
                })
      }
    }
  }
</script>

注意: 图片上传完要将路径保存在数据库中然后查询赋值给fileList这个数组,刷新页面就不会消失了(要注意fileList格式

最后不要忘了在给自己的 accessKeyId添加相应权限,然后在阿里云上配置oos跨域,想要图片避免覆盖可以加入UUID等唯一标识

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

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

相关文章

【PHP】发送HTTP请求时参数快速组装

1.POST、GET参数组装 利用compact、http_build_query函数 // post的数组体$a 1;$b 2;$c $a $b;$array compact(a,b,c); // 组合请求参数print_r($array);// get的url组装$paramsStr http_build_query($array);print_r($paramsStr); 打印结果 2.一个请求示例 使用guzzle …

设计模式-依赖注入模式

设计模式专栏 模式介绍模式特点应用场景依赖注入和控制反转的区别代码示例Java实现依赖注入模式Python实现依赖注入模式 依赖注入模式在spring中的应用 模式介绍 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种面向对象编程中的设计模式&…

【宇宙猜想】AR文创入驻今日美术馆、北京天文馆等众多展馆,在AR互动中感受科技魅力!

近日&#xff0c;由「宇宙猜想」推出的AR系列文创产品先后入驻今日美术馆、北京天文馆、国家自然博物馆、上海天文馆、国家海洋馆、中华手工展馆等各大馆场并与其展开相关合作。 「宇宙猜想」致力于创造虚拟空间价值&#xff0c;用AR技术与文创产品碰撞出新的火花&#xff0c;为…

【星海随笔】网络运维

[rootlocalhost ~]# source admin-openrcRabbitMQ 工作机理 1.客户端连接到消息队列服务器&#xff0c;打开一个channel。 2.客户端声明一个exchange&#xff0c;并设置相关属性。 3.客户端声明一个queue&#xff0c;并设置相关属性。 4.客户端使用routing key&#xff0c;在ex…

初识k8s

k8s: kubernetes:八个字母省略&#xff0c;就是k8s 自动部署&#xff0c;自动扩展和管理容器化部署的应用程序的一个开源系统 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大得容器编排工具 分布式和集群化的方式进行容器管理 市面上常用的版本&…

HTTP小记2

目录 HTTP/1.1优化 QUIC协议 路由器 RTT&#xff08;Round-Trip Time&#xff09; 计算机网络体系结构 体系结构各层在整个过程中的作用 HTTP/1.1优化 1.通过缓存技术来避免/减少发送HTTP请求 2.减少HTTP请求的次数 将原本由客户端处理的重定向请求&#xff0c;交给代理…

alertmanage调用企业微信告警(k8s内部署)

一、前言 alertmanage调用企业微信应用告警会比直接使用钉钉告警更麻烦一点&#xff0c;调用企业微信应用告警需要在应用内配置企业可信ip&#xff0c;不然调用企业微信接口就会报错&#xff0c;提示ip地址有风险 二、部署 先自行创建企业微信&#xff0c;再使用管理后台创建应…

机器视觉实战应用:手势、人脸、动作以及手势鼠标构建(一)

CV实战应用手势、人脸、动作以及手势鼠标构建&#xff08;一&#xff09;总起 核心思想 手势识别是一种常见的计算机视觉应用&#xff0c;它可以通过摄像头或者预先录制的视频图像来追踪和识别人类手势。手势识别的应用非常广泛&#xff0c;例如在游戏、虚拟现实、人机交互等…

RuoYi-Cloud集成DataRoom大屏设计器

基于RuoYi-Cloud 3.6.3 版本集成 先贴一下开源地址: https://gitee.com/wxjstudy/jove-fast DataRoom开源地址: https://gitee.com/gcpaas/DataRoom 后端 新建modules 启动类 增加注解扫描,以及配置分页插件 import com.baomidou.mybatisplus.extension.plugins.MybatisPlu…

Leetcode—54.螺旋矩阵【中等】

2023每日刷题&#xff08;七十&#xff09; Leetcode—54.螺旋矩阵 实现代码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int m matrix.size();int n matrix[0].size();int row 0, col…

虚拟环境和Pycharm中均有transforms仍报ModuleNotFoundError:No module named ‘transformers‘

问题&#xff1a;运行新模型&#xff0c;配置了新环境&#xff0c;下载了包后&#xff0c;仍然报ModuleNotFoundError&#xff1a;No module named transformers 错误。 查看Pycharm解释器&#xff1a; 没问题&#xff01;&#xff01;&#xff01;&#xff1f; 命令行查看虚…

阿赵UE学习笔记——5、创建关卡元素

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了从空白模板创建关卡&#xff0c;接下来尝试着在这个空白的世界里面&#xff0c;创建一些内容。 一、创建地面 1、创建面片作为地面 创建——形状——平面&#xff0c;可以创建一个面片 在细节面板设置合适的…

【广州华锐互动】VR科技科普展厅平台:快速、便捷地创建出属于自己的虚拟展馆

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经在许多领域取得了显著的成果。尤其是在展馆设计领域&#xff0c;VR科技科普展厅平台已经实现了许多令人瞩目的新突破。 VR科技科普展厅平台是广州华锐互动专门为企业和机构提供虚拟展馆设计和制作的在线平台。通过这个平台&…

【微服务核心】Spring Boot

Spring Boot 文章目录 Spring Boot1. 简介2. 开发步骤3. 配置文件4. 整合 Spring MVC 功能5. 整合 Druid 和 Mybatis6. 使用声明式事务7. AOP整合配置8. SpringBoot项目打包和运行 1. 简介 SpringBoot&#xff0c;开箱即用&#xff0c;设置合理的默认值&#xff0c;同时也可以…

设计模式-单例模式(结合JVM基础知识)

1.定义介绍 所谓单例模式&#xff0c;是指在程序运行时&#xff0c;整个JVM中只有一个该类的实例对象 2. 单例模式的优点 复用性高&#xff0c;节省内存资源。类的加载、连接、初始化、使用都要占用虚拟机内存空间&#xff0c;因此&#xff0c;频繁创建对象会造成资源浪费&a…

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…

IDEA使用之打包Jar,指定main方法

前言 在某些场景&#xff0c;可能会遇到将非Spring项目打包的情况&#xff0c;我们不需要Tomcat服务器部署&#xff0c;只需要执行指定的main方法即可&#xff0c;这种情况打包成jar就比较方便了。 操作步骤 打包结果默认在项目的out目录下 使用 java -jar xxx.jar

企业微信自建应用获取用户信息

一.前言 开发企业微信自建应用的时候难免会有获取企微个人信息的业务需求,这篇博客将详细说明企微自建应用获取userId的具体流程. 二.基本概念介绍 2.1 corpid 每个企业都拥有唯一的corpid&#xff0c;获取此信息可在管理后台“我的企业”&#xff0d;“企业信息”下查看“企业…

(1)llvm学习词法分析器

首先是Token取值 下面两个值记录当前识别出来的token单元的字面量 首先是空字符&#xff0c;然后如果是空字符&#xff0c;就读下一个字符&#xff0c;知道这个字符不是空为止&#xff0c;也就是LastChar出循环的时候是下一个不为空的字符,下面两个值是记录实际值用于后续处理 …

VR渲染器怎么用之自适应图像采样器,可解决渲染黑图问题

大家好&#xff0c;相信刚接触到vr渲染器时&#xff0c;会vr的图像采样器感到迷茫&#xff0c;如何使用图像采样器&#xff1f;图像采样器有何用呢&#xff1f; 今天便为大家讲解vr中的自适应DMC图像采样器的运用。 说明&#xff1a;高版本渲染器中的渲染块整合了原有的“固定…