# oss 对象存储基本使用

进入到阿里云的官网网站:https://www.aliyun.com/

鼠标停留到 产品 处 ,再停留到 存储 处,点击对象存储

image-20240603191801376

此时就会跳转到开通的页面,点击开通

image-20240603191828849

点击 立即开通

image-20240603191845955

开通成功后点击 管理控制台 进入控制台页面

image-20240603192101534

进入如下页面说明开通成功

image-20240603192326080

首先要使用我们需要先了解一些专业术语

image-20240603192909428

下面创建一个 bucket,其中选择低频访问,因为只是测试项目,选择公共读因为私有的我们每次上传都需要携带账号和密码。最后点击 完成创建

image-20240603194233168

创建完成后我们点击进入这个 bucket 进行上传文件,点击扫描文件选择好要上传的文件后点击上传文件

image-20240603194704666

# java 使用 oss 如下:

# 导入依赖:

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

# 文件上传

引用上传文件的代码案例:

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint 以华东 1(杭州)为例,其它 Region 请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写 Bucket 名称,例如 examplebucket。
        String bucketName = "examplebucket";
        // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如 exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        // 填写本地文件的完整路径,例如 D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
        String filePath= "D:\\localpath\\examplefile.txt";
        // 创建 OSSClient 实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        try {
            // 创建 PutObjectRequest 对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
            // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);
            
            // 上传文件。
            PutObjectResult result = ossClient.putObject(putObjectRequest);           
        } 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());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

首先我们需要知道自己的 endpoint,在对象存储页面的访问端口中可以看到

image-20240603200950331

将如下代码修改:

// Endpoint 以华东 1(杭州)为例,其它 Region 请按实际情况填写。
String endpoint = "oss-cn-beijing.aliyuncs.com";

下面我们需要去查看自己的 AccessKey 的 Id 和 secret

如果我们直接将 Id 和 secret 配置到代码中会很危险,所以阿里云建议我们在操作对象存储的时候专门对它有一个子账户,我们填写这个子账户的账号密码。子账户我们需要进行开通。如下是开通步骤:

image-20240603201331475

点击 使用子用户的 AccessKey,第一次可能需要开通 RAM 直接开通就行了

image-20240603201407769

点击创建用户

image-20240603201543903

我们没目前只需要在代码里面进行使用我们只需要勾选上 OpenAPI 调用访问即可,点击确定并接受验证码进行确定

image-20240603201710606

子用户创建完成后就可以进行复制 AccessKey Id 和 AccessKey Secret 了

image-20240603201850240

我们在使用之前需要先对该子用户添加权限

image-20240603214801883

新版本我们需要将 AccessKeyID 和 Secret 配置到环境变量中

# 配置 AccessKeyID 和 Secret 到环境中

image-20240603225024245

如果配置了还是报错:

com.aliyun.oss.common.auth.InvalidCredentialsException: Access key id should not be null or empty.

# 解决方式:

  1. 查看 idea 中使用的 jdk 与环境变量的 jdk 是否一致,不一致修改 jdk 环境变量一致然后重启电脑
  2. 重启电脑

# 测试 AccessKeyID 和 Secret 的配置情况:

@Test
public void testC() throws com.aliyuncs.exceptions.ClientException
{
   EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
   Credentials credentials = credentialsProvider.getCredentials();
   System.out.println("AccessKeyID: " + credentials.getAccessKeyId());
   System.out.println("AccessKeySecret: " + credentials.getSecretAccessKey());
}

打印结果:

AccessKeyID: LTAI5tGzZmmC8jxxxxDbEMD
AccessKeySecret: 7jF2aIfwORf1xxxxxqxx47j5sVb

测试成功,接下来测试上传文件的代码:

@Test
public void testUpload() throws com.aliyuncs.exceptions.ClientException
{
   // Endpoint 以华东 1(杭州)为例,其它 Region 请按实际情况填写。
   String endpoint = "oss-cn-beijing.aliyuncs.com";
   // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET。
   EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
   // 填写 Bucket 名称,例如 examplebucket。
   String bucketName = "gulimall-dkx";
   // 填写 Object 完整路径,完整路径中不能包含 Bucket 名称,例如 exampledir/exampleobject.txt。
   String objectName = "gulimall-dkx/test.jpg";
   // 填写本地文件的完整路径,例如 D:\\localpath\\examplefile.txt。
   // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
   String filePath = "C:\\Users\\Administrator\\Pictures\\Camera Roll\\乡村之夜 房子 田野和稻田 黄昏 乡村小路 河流 风景 4k壁纸_彼岸图网.jpg";
   // 创建 OSSClient 实例。
   OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
   try
   {
      // 创建 PutObjectRequest 对象。
      PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
      // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。
      // ObjectMetadata metadata = new ObjectMetadata();
      // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
      // metadata.setObjectAcl(CannedAccessControlList.Private);
      // putObjectRequest.setMetadata(metadata);
      // 上传文件。
      PutObjectResult result = ossClient.putObject(putObjectRequest);
      System.out.println("result RequestId: " + result.getRequestId());
      System.out.println("result ETag: " + result.getETag());
      System.out.println("result VersionId: " + result.getVersionId());
      System.out.println("result Response: " + result.getResponse());
      System.out.println("result ClientCRC: " + result.getClientCRC());
      System.out.println("result ServerCRC: " + result.getServerCRC());
   } 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());
   } catch (ClientException ce)
   {
      System.out.println("Caught an ClientException, which means the client encountered "
                         + "a serious internal problem while trying to communicate with OSS, "
                         + "such as not being able to access the network.");
      System.out.println("Error Message:" + ce.getMessage());
   } finally
   {
      if (ossClient != null)
      {
         ossClient.shutdown();
      }
   }
}

运行结果:

result RequestId: 665DD89377F3A93337E3FA45
result ETag: 508EA42B110937E48E9A6856948422E4
result VersionId: null
result Response: null
result ClientCRC: 6237137517066352504
result ServerCRC: 6237137517066352504

查看 oss 的存储内容

image-20240603225234399

上传成功

image-20240603225255837

# 更简单的方式 SpringCloudAlibaba

# SpringCloudAlibaba 简介

SpringCloudAlibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必须组件,方便开发者通过 SpringCloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 SpringCloudAlibaba,您只需要添加一些注解和少量配置,就可以将 SpringCloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

https://github.com/alibaba/spring-cloud-alibaba