集成框架 -- 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前端上传代码

### INFO-OSS 工具或项目的概述 INFO-OSS 并未在已知的公开资料中被明确提及,因此可能是一个特定领域内的工具或者尚未广泛传播的开源项目。然而,基于类似的对象存储解决方案以及 IT 领域的相关技术栈,可以推测其功能可能类似于 MinIO 提供的对象存储服务[^1]。 如果假设 INFO-OSS 是一种对象存储工具,则它可能会提供以下核心特性: - **高可用性和扩展性**:支持大规模数据存储和分布式部署。 - **兼容 S3 API**:允许与其他云平台无缝集成- **安全性保障**:通过加密机制保护静态和动态数据的安全传输。 以下是关于如何寻找、下载和使用此类工具的一般指导: --- ### 寻找和确认 INFO-OSS 的方法 为了验证是否存在名为 INFO-OSS 的工具或项目,建议采取以下方式获取更多信息: 1. 访问主流代码托管网站(如 GitHub 或 GitLab),搜索关键词 `INFO-OSS`。 2. 查阅官方文档或其他社区资源,例如 优快云 博客中的相关内容。 3. 如果该工具属于企业内部开发的产品,则需联系相关技术支持团队以获得进一步说明。 --- ### 安装与配置指南 (假定为类 MinIO 工具) #### 基于 Docker 的安装流程 对于大多数现代化的对象存储系统而言,Docker 是推荐使用的部署方案之一。下面展示了一个典型的启动命令示例: ```bash docker run -d \ --name info-oss \ -p 9000:9000 \ -e "MINIO_ACCESS_KEY=your-access-key" \ -e "MINIO_SECRET_KEY=your-secret-key" \ -v /mnt/data:/data \ minio/minio server /data ``` > 注解:上述脚本适用于运行标准版 MinIO 实例;实际操作时应替换镜像名称及相关参数来适配目标环境需求。 #### 手动编译构建过程 假如无法利用容器化技术完成初始化工作,则可尝试从源码着手搭建本地测试版本。具体步骤如下所示: 1. 克隆远程仓库地址至当前目录下; ```bash git clone https://github.com/example/info-oss.git cd info-oss/ ``` 2. 安装依赖项并执行构建指令; ```bash make setup && make build ./info-oss serve --config-dir=/path/to/configs ``` 注意:以上仅为示意性质的操作序列,请参照真实手册调整细节部分设置[^2]。 --- ### 可视化管理界面接入提示 某些情况下,除了基础的服务端逻辑外,还附带图形化前端组件便于日常运维活动开展。比如 Portia 就是一款专门针对网页抓取任务设计而成的应用程序框架[^3]。倘若 INFO-OSS 同样具备类似的功能模块,则可通过浏览器访问指定 URL 地址实现交互体验优化目的。 默认监听端口通常设定为 `localhost:<port>` 形式呈现出来,在此之前务必确保防火墙策略不会阻碍外部连接请求进入服务器节点范围之内。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值