集成框架 -- OSS

SpringBoot整合OSS存储 OSS存储与COS存储对比,springboot整合OSS存储笔记 阅读详情

前言

接入oss必须有这两个文档基础

使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心
前端上传跨域


正文

sts前后端通用,开通图示

在这里插入图片描述
AliyunSTSAssumeRoleAccess
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

后端实现代码


    public static void main(String[] args) {
  
        String regionId = "cn-hangzhou";
        String endpoint = "sts.cn-hangzhou.aliyuncs.com";

        String accessKeyId = "accessKeyId"; //用户提供
        String accessKeySecret = "accessKeySecret";//用户提供

        String roleArn = "acs:ram::roleArn:role/ramoss";//角色提供
        String roleSessionName = "roleSessionName";// 自定义
        String bucket =  "bucket"; // 对应创建buket 前端上传记得开跨域

        String policy = "{\n" +
                "    \"Version\": \"1\", \n" +
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Action\": [\n" +
                "                \"oss:PutObject\"\n" +
                "            ], \n" +
                "            \"Resource\": [\n" +
                "                \"acs:oss:*:*:sc-sale-servcie/test/*\" \n" +
                "            ], \n" +
                "            \"Effect\": \"Allow\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";


        Long durationSeconds = 3600L;
        try {
            DefaultProfile.addEndpoint("", regionId, "Sts", endpoint);
            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            // 构造client。
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();

            request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            //request.setPolicy(policy);
            request.setDurationSeconds(durationSeconds);

			// 如果前端上传这个给前端 把跨域打开
            final AssumeRoleResponse response = client.getAcsResponse(request);
            System.out.println("Expiration: " + response.getCredentials().getExpiration());
            System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
            System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
            System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
            System.out.println("RequestId: " + response.getRequestId());


            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build("https://oss-cn-hangzhou.aliyuncs.com", response.getCredentials().getAccessKeyId(), response.getCredentials().getAccessKeySecret(), response.getCredentials().getSecurityToken());
            PutObjectRequest putObjectRequest = new PutObjectRequest("reformer", "1/reformer.sql", new File("/Users/xushouchun/IdeaProjects/REformer-boot/fromer-start/src/main/resources/database/reformer.sql"));


            try {
                // 上传文件。
                PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
                System.out.println("putObjectResult = " + JSON.toJSONString(putObjectResult));

                // copy
                CopyObjectRequest copyObjectRequest = new CopyObjectRequest(bucket, "1/reformer.sql", bucket, "1/sql.reformer");
                ossClient.copyObject(copyObjectRequest);

                // 生成下载URL
                Date expirationDate = new Date(new Date().getTime() + durationSeconds); // URL 的有效期
                GeneratePresignedUrlRequest requests = new GeneratePresignedUrlRequest(bucket, "1/reformer.sql");
                requests.setExpiration(expirationDate);
                ossClient.generatePresignedUrl(requests);


            } catch (OSSException oe) {
                System.out.println("Caught an OSSException, which means your request made it to OSS, "
                        + "but was rejected with an error response for some reason.");
                System.out.println("Error Message:" + oe.getErrorMessage());
                System.out.println("Error Code:" + oe.getErrorCode());
                System.out.println("Request ID:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }

        } catch (ClientException e) {
            System.out.println("Failed:");
            System.out.println("Error code: " + e.getErrCode());
            System.out.println("Error message: " + e.getErrMsg());
            System.out.println("RequestId: " + e.getRequestId());
        }

    }

工具


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.ResponseHeaderOverrides;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author :
 * Author: 徐寿春
 * Date:    2024/4/28 15:04
 * <p>
 * 名称
 */
@Component
@Slf4j
public class OSSUtils {
    @Value("${oss.accessKey}")
    String accessKey;

    @Value("${oss.secretKey}")
    String secretKey;

    @Value("${oss.sts_endpoint}")
    String stsEndPoint;

    @Value("${oss.endpoint}")
    String endpoint;

    @Value("${oss.arn}")
    String arn;

    @Value("${oss.bucket}")
    String bucket;

    @Value("${oss.roleSessionName}")
    String roleSessionName;
    //一天
    static Long durationSeconds = (long) 24 * 60 * 60  * 1000;


    public AssumeRoleResponse buildAliyunSTSCredentials() throws ClientException {
        // STS
        DefaultProfile.addEndpoint(stsEndPoint, "cn-hangzhou", "Sts", "sts.cn-hangzhou.aliyuncs.com");
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKey, secretKey);
        DefaultAcsClient client = new DefaultAcsClient(profile);

        final AssumeRoleRequest request = new AssumeRoleRequest();
        request.setMethod(MethodType.POST);
        request.setProtocol(ProtocolType.HTTPS);

        // sts 时间
        request.setDurationSeconds(durationSeconds);
        request.setRoleArn(arn);  // 要扮演的角色ID
        request.setRoleSessionName(roleSessionName);

        // 生成临时授权凭证
        return client.getAcsResponse(request);
    }


    public List<String> listOss(String directory) {
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucket).withPrefix(directory).withMaxKeys(1000);
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);

        return objectListing.getObjectSummaries().stream().map(OSSObjectSummary::getKey).filter(key -> !key.equals(directory + File.separator)).collect(Collectors.toList());


    }

    /**
     * oss文件拷贝
     *
     * @param sourceObjectName      "your/source/object/name";
     * @param destinationObjectName "your/destination/object/name";
     */
    public void ossCopyObject(String sourceObjectName, String destinationObjectName) {
        log.info("ossCope, {} ->  {}", sourceObjectName, destinationObjectName);
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
        try {
            ossClient.copyObject(bucket, sourceObjectName, bucket, destinationObjectName);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
    }


    /**
     * oss文件上传
     *
     * @param path  "your/source/object/name";
     * @param input "io";
     */
    public void ossPutObject(String path, InputStream input) {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
        try {
            ossClient.putObject(bucket, path, input);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
    }


    /**
     * 生成一个下载URL
     *
     * @param objectName "your/destination/object/name";
     * @return
     */
    public URL generatePresignedUrl(String objectName) {
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, secretKey);
        Date expirationDate = new Date(new Date().getTime() + durationSeconds); // URL 的有效期
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, objectName);
        //设置响应头强制下载
        ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides();
        responseHeaders.setContentDisposition("attachment;");
        request.setResponseHeaders(responseHeaders);
        request.setExpiration(expirationDate);
        URL url = ossClient.generatePresignedUrl(request);
        ossClient.shutdown();
        // 生成URL
        return url;
    }

}

总结

后端代码已经提供,前端就比较简单了,拿到钥匙直接upload就可以了。 一般脚手架都有,凭借url即可
前端文档: sts前端上传代码

若依框架RuoYi-Vue集成OSS后,列表图片不显示?手把手教你排查和修复这个坑 本文详细解析了若依框架RuoYi-Vue集成OSS后列表图片不显示的问题,提供了从现象定位到前后端协同修复的完整解决方案。重点分析了图片回显机制,指导如何将OSS对象ID转换为可访问URL,并给出数据库调整、组件改造等具体实施步骤,帮助开发者彻底解决这一常见问题。 阅读详情

相关推荐

SpringBoot 集成阿里云OSS文件存储服务

在分布式系统中,云计算是构建大型应用的基石之一。云文件存储(Cloud Object Storage Service,OSS)是一个基于对象存储、面向文件存储的海量、安全、低成本、高可靠、弹性扩展的网络存储服务。它具备安全、高可用、低成本、全覆盖多地部署等特点。随着云计算技术的迅速普及,越来越多的人开始关注并使用云文件存储服务。Spring Boot 是目前最流行的 Java 框架之一,它提供了简单易用、支持自动配置的特性,可以轻松实现微服务架构中的各种功能。

AI天才研究院 2456

一、认识OSS

音频之OSS框架

future_sky_word的博客 1568

若依框架集成阿里云OSS

由于之前的图片访问是本地的路径和服务,需要向后端发起请求才能获取图片,现在我们使用了 OSS,图片可以直接通过互联网访问,无需再次访问后端服务,所以需要修改前端的图片访问逻辑。基于以上原因,企业中很多的文件都会存储到 OSS 中,OSS 可以解决以上所有的问题,并且成本也不高,下面我们就把阿里的 OSS 集成到若依项目中。在导入依赖操作时,不要着急依赖刷新,由于 OSS 模块并没有创建,肯定会报错!在 zzyl-common 模块中导入依赖。在 zzyl-admin 模块中导入依赖。

大一点的小孩 1915

阿里云oss(更新)

【代码】阿里云oss储存。

weixin_62108279的博客 926

STM32CubeMX定时器进阶玩法:用编码器模式实现电机转速测量(附避坑清单)

本文详细介绍了如何使用STM32CubeMX配置定时器的编码器模式实现电机转速测量,包括硬件连接、CubeMX配置关键步骤、转速计算算法及常见问题解决方案。特别针对工业控制和机器人开发中的高精度需求,提供了实用的避坑清单和优化技巧,帮助开发者高效完成项目。

joy55的博客 203

微信好友恢复全攻略(2025年3月更新)

适用于仅被拉黑场景(成功率100%)针对7天内误删场景(成功率78%)

2301_77933942的博客 1万+

JAVA集成阿里云OSS对象存储

JAVA集成阿里云OSS对象存储

qq_38254635的博客 2634

【论文笔记】Reaching agreement in the presence of faults (EIG)

1 问题定义 2 交互一致性 3 单点故障 m=1 n=4 4 多点故障(n&amp;gt;=3m+1) 计算过程 m=2 n=7 5 n&amp;lt;3m+1不能达成协定 6 带认证的算法 7 总结 这篇论文在1980年发表,是1982年著名的拜占庭将军问题论文的前身。作者Leslie Lamport是2013图灵奖得主,两篇论文引用次数分别为5000+和2000+。该论文提出的算法现在被...

zjwreal 2991

阿里云STS临时令牌操作OSS云存储(java)

使用STS临时访问凭证访问OSS https://help.aliyun.com/document_detail/100624.html?spm=a2c4g.11186623.2.19.515649e8zOIom1#concept-xzh-nzk-2gb 一、引入依赖 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>al

一起coding,一起嗨。 6025

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

使用SSE流式输出(Javaweb前后端实战)

SSE(Server-Sent Events)是一种在Web应用中实现单向实时通信的技术。通过SSE,服务器可以主动向客户端发送更新,而无需客户端不断发起请求。这对于需要实时更新的应用场景(如聊天应用、实时数据监控等)非常有用。(服务端单向传输客户端,长连接)

记得开心一点嘛的博客 1万+

若依框架集成阿里云OSS实现文件上传优化

将阿里云OSS集成到若依框架中的方案,以解决传统服务器本地存储的硬件要求高、管理难度大、性能瓶颈和单点故障等问题。通过创建OSS文件存储服务类(OSSAliyunFileStorageService)封装上传和删除操作,并配置OSS客户端自动初始化(OssAliyunAutoConfig),实现高效、稳定的文件存储管理。该方法可提升文件访问性能,降低维护成本,同时适用于MinIO等其他对象存储服务。

weixin_74224250的博客 887

综述性论文别再堆砌文献!用GPT-5.1 Thinking轻松攻克四大关键难点,真正实现高效高质撰写(附AI提示词)

逻辑构建上以往都是先梳理一篇文献的领域研究脉络,明确其发展阶段、核心议题等,再搭建初步的大纲,借助思维导图或者别的方式将筛选后的文献观点按主题归类到对应章节,理清楚每个章节间的递进或并列关系,最后再逐个章节进行补充过渡表述,那么做的目的其实就是摆脱文献堆砌问题。人工做法往往是对比不同文献的研究方法、数据来源与核心结论,再清晰标注每类成果的优缺点,找到文献中存在的争议焦点,找到之后再梳理争议产生的核心原因,最后在基于现有研究,推出还未被探索的研究方向,从而提炼出创新切入点。2)文献之间的相同点与不同点;

智能AI让学术科研更容易 173

若依框架篇-若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)、EasyExcel 框架(实现 Excel 数据批量导入功能)

阿里云对象存储 OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。使用了阿里云 OSS 对象存储服务之后,我们的项目当中如果涉及到文件上传这样的业务,在前端进行文件上传并请求到服务端时,在服务器本地磁盘当中就不需要再来存储文件了。我们直接将接收到的文件上传到 oss,由 oss 帮我们存储和管理,同时阿里云的 oss 存储服务还保障了我们所存储内容的安全可靠。

小扳手 1万+

YOLOv5改进策略|实战应用案例|YOLOv5苹果成熟度检测 ,准确率提升4.6%

苹果作为世界四⼤⽔果之⼀,富含多种维⽣素和矿物质,⼀直深受世界各地消费者的喜爱。据联 合国粮⻝及农业组织统计,全球⽔果产量中,苹果位列第⼆位,仅次于葡萄(贾等⼈,2020 )。然⽽,⼤多数苹果果实都是⼿⼯采摘的,这样的⽣产⽅法效率很低。此外,随着⼈⼝⽼龄化 和农村劳动⼒⼤量涌⼊城市,⽔果种植⾏业的劳动⼒成本也相应上升。所有这些因素都显着影响 着⽔果产品的市场竞争⼒。因此,实时⾼效采收苹果等⽔果,降低采收成本势在必⾏。基于机器 视觉的⽔果采摘机器⼈可以利⽤其信息感知来识别和采摘⽔果。

斌擎科技 2204

嵌入式Modbus协议面试题及参考答案

Modbus 协议采用主从模式进行通信,这种模式定义明确,便于在工业环境中实现设备之间的有序数据交互。在主从模式中,存在一个主站(Master)和多个从站(Slave)。主站通常是工业控制系统中的上位机,如 PLC、工控机等,它负责发起通信请求,控制整个通信过程。从站则是各种现场设备,如传感器、执行器等,它们接收主站的请求,并根据请求进行相应的操作,然后将结果返回给主站。主站的主要功能包括:发起数据读取或写入请求、控制通信的时序和流程、处理从站返回的数据。

大模型大数据攻城狮的专栏 2038

phalapi框架集成阿里云oss云存储

1:下载Ucloud文件,存放在框架的Library目录下,地址: https://pan.baidu.com/s/1brddTXt        密码:b4xx 2:框架的public下的 init.php文件添加以下代码   /* 本地/云 上传 */  DI()->ucloud = new UCloud_Lite(); 3:框架的config文件夹下的app.php文件修改以下

salestina的博客 822

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ThinkPHP框架集成Ueditor编辑器,并将图片上传到阿里云OSS

网上有很多界面美观整洁的编辑器插件,但是相比较功能而言,还是百度的ueditor更为丰富,所以我选择了在项目中使用这款编辑器,下面介绍操作步骤,代码不多,自己动手,丰衣足食。 一、在项目中集成Ueditor插件: 首先,去官网下载对应版本的压缩包,因为用的是thinkPHP框架,所以这里选择了1.4.3.3 PHP 版本,UTF-8编码下载; 接着,解压下载的文件夹,将utf8-php文件夹...

DaveLeeCN的博客 3697

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Gin集成GoFly开发系统框架聚合本地存储、腾讯云cos、阿里云oss、七牛云等多种文件存储使用说明

GoFly框架实现了多存储方式集成,支持本地、腾讯云COS、阿里云OSS、七牛云等多种存储方案的灵活切换和统一管理。开发者可通过简单配置选择存储方式,上传文件时直接调用UploadFile方法即可获取访问URL。框架提供后端方法(GetFullUrl等)处理文件路径补全,前端也可通过工具函数GetFullPath动态拼接完整访问地址。从v3.0.1版本开始需注意部分插件的路径兼容性问题,开发者可参考现有代码扩展自定义云存储(如华为云)。该设计实现了存储方案的无缝切换,确保历史文件正常访问。

GoFly开发者的博客 753

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

GPT-OSS-20B支持哪些框架?PyTorch/TensorRT集成指南

本文详解开源大模型GPT-OSS-20B对PyTorch和TensorRT框架的支持,涵盖模型加载、性能优化及生产部署全流程。通过量化、层融合与动态批处理技术,可在16GB显存设备高效运行,适合本地化AI服务构建。

weixin_29903713的博客 1018

Gin框架集成阿里云OSS的三种实战方案

对象存储(OSS)作为云原生时代的核心存储服务,通过分布式架构实现高可靠、无限扩展的文件存储能力。其技术原理是将文件拆分为多个数据块分散存储,配合智能调度算法实现高速访问。在Web开发领域,OSS能显著降低存储运维成本,尤其适合电商图片、用户上传内容等场景。本文以Gin框架与阿里云OSS的深度集成为例,详解服务端代理上传、前端直传签名模式、批量迁移等三种工程实践方案,并分享性能优化与安全防护的一线经验。通过实际案例数据表明,合理使用OSS可使文件访问速度提升3倍,存储成本降低60%。

weixin_29597551的博客 294

RuoYi框架上传图片或文件到阿里云OSS详细教程

为了提供一个更加详细的教程,我们将深入探讨每个步骤,并添加一些额外的细节和最佳实践建议。以下是关于如何在Ruoyi框架中集成阿里云OSS实现文件上传功能的详尽指南。

LiuYuHao_的博客 2205

若依框架—基于AmazonS3实现OSS对象存储服务

若依框架—基于AmazonS3实现OSS对象存储,其他也适用

omnipotent_wang的博客 1632

OSS-Fuzz项目Python语言集成指南

OSS-Fuzz项目Python语言集成指南 【免费下载链接】oss-fuzz OSS-Fuzz - continuous fuzzing for open source software. 项目地址: https://gitco...

gitblog_00207的博客 344

21、阿里云oss

oss入口:控制台 -> 对象存储 ossapi文档:右下角 -> 常用入口 -> API 文档 -> 文档中心打开。

qq23001186的博客 3087
上一篇: chroot -- 限制其他用户liunx空间且监控生成子账户输出命令日志
下一篇: mysql: docker 异常 - mbind: Operation not permitted
徐寿春
博客等级 码龄8年 469粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值