阿里云OSS对象云储存入门操作

发布于:2025-06-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

阿里云OSS服务

1.创建OSS数据桶

首先在阿里云对象存储服务OSS中创建好对应的数据桶,我的是gezishan-bucket1

在这里插入图片描述

2.创建AccessKey

认识AccessKey?

访问密钥AccessKey(简称AK)是阿里云提供给用户的永久访问凭据,由AccessKey ID和AccessKey Secret组成的一组密钥对

  • AccessKey ID:用于标识用户。
  • AccessKey Secret:是一个用于验证您拥有该AccessKey ID的密码。

AccessKey ID和AccessKey Secret根据算法由访问控制(RAM)生成,阿里云对AccessKey ID和AccessKey Secret的存储及传输均进行加密。

AccessKey不用于控制台登录,而是用于通过开发工具(API、CLI、SDK、Terraform等)访问阿里云时,发起的请求会携带AccessKey ID和AccessKey Secret加密请求内容生成的签名,进行身份验证及请求合法性校验。

AccessKey最佳实践

  • 强烈建议不要给阿里云账号(主账号)创建AccessKey。

    阿里云账号(主账号)默认拥有当前账号下所有云资源的Administrator权限,且无法修改。阿里云账号(主账号)的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您不要给阿里云账号(主账号)创建AccessKey,建议您创建专用于API访问的RAM用户并创建对应的AccessKey,完成最小化授权后,通过编程的方式访问阿里云资源。

  • 减少创建永久AccessKey,优先采用STS Token临时凭证方案,降低凭证泄露的风险。

  • 妥善保管AccessKey ID和AccessKey Secret,不要将AccessKey信息随意分享给其他人,或记录在公开的文档中。

  • 避免在代码中写入明文AccessKey信息。

  • AccessKey不再使用时及时禁用。

  • 定期轮转AccessKey,一个RAM用户启用一把AccessKey后另一把仅用于轮转。

  • 为RAM用户仅授予必要的最小权限。

操作步骤

  1. 登录RAM控制台
  2. 在左侧导航栏,选择****身份管理** > *用户***。
  3. 用户页面,单击目标RAM用户名称。
  4. 认证管理页签下的AccessKey区域,单击创建AccessKey

在这里插入图片描述

授权访问

创建AccessKey相当于创建了一个子用户,要想能访问指定的数据桶,还要为指定的子用户授权,

后续每次上传文件都要携带AccessKeyId进行鉴权,若该AccessKeyId没有访问权限项目将报错。

在这里插入图片描述

选择授权的子用户

在这里插入图片描述

3.项目中使用OSS云服务

这是阿里云官网提供的demo

import java.io.*;
import java.util.Random;

import com.aliyun.oss.*;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;

public class OssJavaSdkQuickStart {
    /** 生成一个唯一的 Bucket 名称 */
    public static String generateUniqueBucketName(String prefix) {
        // 获取当前时间戳
        String timestamp = String.valueOf(System.currentTimeMillis());
        // 生成一个 0 到 9999 之间的随机数
        Random random = new Random();
        int randomNum = random.nextInt(10000); // 生成一个 0 到 9999 之间的随机数
        // 连接以形成一个唯一的 Bucket 名称
        return prefix + "-" + timestamp + "-" + randomNum;
    }

    public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {
        // Endpoint以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        String bucketName = generateUniqueBucketName("demo");
        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
        // 关于OSS支持的Region与Endpoint的对应关系,请参见https://www.alibabacloud.com/help/zh/oss/user-guide/regions-and-endpoints。
        String region = "cn-hangzhou";

        // 从环境变量中获取访问凭证。运行本代码示例之前,请先配置环境变量
        EnvironmentVariableCredentialsProvider credentialsProvider =
                CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // 创建OSSClient实例。
        // 当OSSClient实例不再使用时,调用shutdown方法以释放资源。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // 显式声明使用 V4 签名算法
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .region(region)
                .build();
        try {
            // 1. 创建存储空间(Bucket)
            ossClient.createBucket(bucketName);
            System.out.println("1. Bucket " + bucketName + " 创建成功。");
            // 2. 上传文件
            String objectName = "exampledir/exampleobject.txt";
            String content = "Hello OSS";
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));
            System.out.println("2. 文件 " + objectName + " 上传成功。");
            // 3. 下载文件
            OSSObject ossObject = ossClient.getObject(bucketName, objectName);
            InputStream contentStream = ossObject.getObjectContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(contentStream));
            String line;
            System.out.println("3. 下载的文件内容:");
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            contentStream.close();
            // 4. 列出文件
            System.out.println("4. 列出 Bucket 中的文件:");
            ObjectListing objectListing = ossClient.listObjects(bucketName);
            for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                System.out.println(" - " + objectSummary.getKey() + " (大小 = " + objectSummary.getSize() + ")");
            }
            // 5. 删除文件
            ossClient.deleteObject(bucketName, objectName);
            System.out.println("5. 文件 " + objectName + " 删除成功。");
            // 6. 删除存储空间(Bucket)
            ossClient.deleteBucket(bucketName);
            System.out.println("6. Bucket " + bucketName + " 删除成功。");
        } 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 | IOException 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();
            }
        }
    }
}

预配置

引入依赖

然后再项目的pom.xml中导入依赖:

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

配置项

在实际开发中通常将一些配置信息在application.yml中配置。

需要配置关键的4个要素,分别是endpoint(服务器域名),bucketName(数据桶名),accessKeyId(连接秘钥),accessKeySecret(秘钥密码)

aliyun:
  oss:
    endpoint: xxxxxxx
    bucketName: xxxxxxxxxxxxxx
    accessKeyId: xxxxxxxxxxxxxx
    accessKeySecret: xxxxxxxxxxxxxxxxxxxxxxx

入门API

连接OSS对象

OSS ossclick = new OSClientBuilder().build(String endpoint,String accessKeyId,String accessKeySecret);
//上面三个参数均为String类型,含义见上

文件上传方法

OSS.putObject(String bucketName,String fileName,InputStream inputStream);
/*
bucketName 数据桶名
fileName 上传后的文件名
inputStream 待上传文件输入流
*/

关闭连接

OSS.shutdown()

工具类

@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOssUtil {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    public String upload(MultipartFile file) throws IOException {
        //获取上传文件的输入流
        InputStream inputStream = file.getInputStream();

        //设置文件名,避免覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到oss
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);  //文件上传方法

        //获取文件访问地址
        String url = "https://" + bucketName + "." + endpoint + "/" + fileName;

        //关闭ossClient
        ossClient.shutdown();
        return url;
    }
}

service层调用

@Service
public class OSSFileServiceImpl extends ServiceImpl<MyFileMapper, MyFile> implements FileUploadService {

    @Resource
    private AliyunOssUtil aliyunOssUtil;

    @Override
    public Result saveFile(MultipartFile file) {
        try{
            String url = aliyunOssUtil.upload(file);
            return Result.success(url);
        }catch (Exception e){
            e.printStackTrace();
            return Result.error("文件上传失败,请联系管理员"+e.getMessage());
        }
    }
}