首页技术栈归档照片墙音乐日记随想收藏夹友链留言关于

阿里云 OSS 对象存储

写作时间:2026-07-07

云对象oss存储简介

阿里云对象存储服务(Object Storage Service 简称OSS) 是阿里云提供的海量 安全 低成本 高可靠的云存储服务。

阿里云OSS云存储简介

什么是阿里云oss云存储 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。其数据设计持久性不低于 99.9999999999%(12 个 9),服务设计可用性(或业务连续性)不低于 99.995%。

可以使用阿里云提供的 API、SDK 接口或者 OSS 迁移工具轻松地将海量数据移入或移出阿里云 OSS。数据存储到阿里云 OSS 以后,可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)和归档存储(Archive)作为不经常访问数据的存储方式。

OSS 具有与平台无关的 RESTful API 接口,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

OSS与自建存储对比的优势

应用场景

图片和音视频等应用的海量存储

网页或者移动应用的静态和动态资源分离

云端数据处理

计量计费

阿里云对象存储 OSS 服务费用的各项组成部分及计费方式分为按量计费和包年包月两种。

按量付费:按实际使用量*单价的方式计费,每小时统计前一小时的实际用量并从账户余额中扣除实际消费金额。例如当前时间是 9:30,结算的是 8:00-9:00 产生的费用 。 包年包月:预先购买指定资源包,之后使用资源时,扣除相应的额度。一般情况下,包年包月比按量付费更加优惠。资源包目前仅提供标准(LRS)存储包、低频(LRS)存储包、归档(LRS)存储包、标准ZRS)存储包、低频(ZRS)存储包、下行流量包、 回源流量包、传输加速包,可购买地域请参见购买对象存储 OSS 资源包。

OSS云存储基本概念

存储空间(Bucket)

存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。

同一个存储空间的内部是扁平的,没有文件系统目录的概念,所有的对象都直接隶属于其对应的存储空间。

每个用户可以拥有多个存储空间。

存储空间的名称在 OSS 范围内必须是全局唯一的,一旦创建之后无法修改名称。

存储空间内部的对象数目没有限制。

存储空间的命名规范如下:

  • 只能包括小写字母、数字和短横线(-)。
  • 必须以小写字母或者数字开头和结尾。
  • 长度必须在 3–63 字节之间。

Region(地域)

Region 表示 OSS 的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的 Region 访问速度更快。

Region 是在创建 Bucket 的时候指定的,一旦指定之后就不允许更改。该 Bucket 下所有的 Object 都存储在对应的数据中心,目前不支持 Object 级别的 Region 设置。

Endpoint(访问域名)

Endpoint 表示 OSS 对外服务的访问域名。OSS 以 HTTP RESTful API 的形式对外提供服务,当访问不同的 Region 的时候,需要不同的域名。通过内网和外网访问同一个 Region 所需要的 Endpoint 也是不同的。例如杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 osscn-hangzhou-internal.aliyuncs.com。 AccessKey(访问密钥)

AccessKey(简称 AK)指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。OSS 通过使用 AccessKeyId 和 AccessKeySecret 对称加密的方法来验证某个请求的发送者身份。AccessKeyId 用于标识用户;

AccessKeySecret 是用户用于加密签名字符串和 OSS 用来验证签名字符串的密钥,必须保密。对于 OSS 来说,AccessKey 的来源有:

云对象存储接入准备

选择对象存储OSS,进行一个开通即可,一般是一个项目创建一个存贮空间

创建OSS存贮

文件管理,上传文件

上传文件

上传成功

设置跨域请求

创建跨域请求

使用JAVA代码实现OSS存贮

帮助文档:https://help.aliyun.com/document_detail/32007.html

导入依赖,注:JDK9 maven依赖不一样

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

上传文件有好多种方式,这里选择文件流上传,如果想使用其他方式可以参考帮助文档

测试类

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        // oss-cn-shenzhen.aliyuncs.com 可以在OSS控制台概览查看自己的 外网访问 域名
        String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,也就是存贮空间的名称
        String bucketName = "yuanceshiyuan";
        // 上传的文件名称,自定义
        String objectName = "5.jpg";
        // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
        String filePath= "D:\\__MACOSX\\高清大图\\5.jpg";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            InputStream inputStream = new FileInputStream(filePath);
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, inputStream);
        } catch (OSSException oe) {
           throw new Exception("OSS文件上传异常"+oe);
        } catch (ClientException ce) {
           throw new Exception("Client文件上传异常"+ce);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}     

可以使用封装好的OSS对象存储

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

导入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>

在 application.properties 中配置 accessKeyId、secretAccessKey 和 region

// application.properties
alibaba.cloud.access-key=your-ak   #对应accessId
alibaba.cloud.secret-key=your-sk    #对应accessKey
alibaba.cloud.oss.endpoint=***    #对应endpoint上传地址
alibaba.cloud.oss.bucket=yuanceshiyuan  #贮空间的名称

或者yaml配置

alibaba:
  cloud:
    access-key: access-key
    secret-key: secret-key
    oss:
      endpoint: oss-cn-shenzhen.aliyuncs.com
      bucket: yuanceshiyuan

OssController

@RestController
public class OssController {

    @Autowired
    private OSS ossClient;

    @Value("alibaba.cloud.oss.endpoint")
    private String endpoint;

    @Value("alibaba.cloud.oss.bucket")
    private String bucket;//贮空间的名称

    @Value("alibaba.cloud.access-key")
    private  String accessId;
    /**
     * 文件上传
     * @return
     */
    @RequestMapping("/oss/policy")
    public Map<String,String> policy(){
        String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
        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);
            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));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return respMap;
    }
}

vue+pringBoot实现OSS存贮

后台

FileController

package com.alyunoss.controller;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

@RestController
public class FileController {
    @CrossOrigin
    @RequestMapping("/oss/policy")
    public Map<String,String> policy(){
     // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessId = "yourAccessKeyId";
        String accessKey = "yourAccessKeySecret";
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "oss-cn-shenzhen.aliyuncs.com";
        // 填写Bucket名称,也就是存贮空间的名称
        String bucket = "yuanceshiyuan";
        // 填写Host地址,格式为https://bucketname.endpoint。
        String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
        // 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。
        String dir = "cecshi/";//设置上传的文件夹
        OSSClient client = new OSSClient(endpoint, accessId, accessKey);
        try {
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
            String postPolicy = client.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = client.calculatePostSignature(postPolicy);
            Map<String, String> 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));
             return respMap;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
       return null;
    }
}

或者application.yaml

alibaba:
  cloud:
    access-key: LTAI5tPCwcCkjfUFiDp4gTWa
    secret-key: XMqT1Ttx8fEItKuvoTfOFQD2oeV2sT
    oss:
      endpoint: oss-cn-shenzhen.aliyuncs.com
      bucket: yuanceshiyuan

@RestController
public class OssController {


    @Value("alibaba.cloud.oss.endpoint")
    private String endpoint;

    @Value("alibaba.cloud.oss.bucket")
    private String bucket;//贮空间的名称

    @Value("alibaba.cloud.access-key")
    private  String accessId;

    @Value("alibaba.cloud.secret-key")
    public String accessKeySecret;
    /**
     * 文件上传
     * @return
     */
    @RequestMapping("/oss/policy")
    public Map<String,String> policy(){
        String host = "https://"+bucket+"."+endpoint; //host格式为bucket+endpoint
        String format=new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format+"/";//设置上传的文件夹
        Map<String, String> respMap=null;
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKeySecret);
        try {
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            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));
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return respMap;
    }
}

ossUpload.vue

<template>
    <div style="width: 400px;margin: 0 auto">
      <el-upload
        class="upload-demo"
        :action="ObjData.host"
        :data="ObjData"
        :before-upload="beforeUpload"
        :file-list="fileList"
        list-type="picture">
        <el-button size="small" type="primary">点击上传</el-button>
        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
      </el-upload>
    </div>
</template>
<script>
    export default {
        name: "ossUpload.vue",
      data() {
        return {
           //fileList是默认图片展示,可以不用管
          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:'',
            key:'',
            host:'',
            dir:'',
          }
        };
      },
      methods: {
        beforeUpload(file){
             //在上传前进行调用
             return new Promise((resolve, reject) => {
               this.$axios.get("http://localhost:8080/oss/policy").then((rsp)=>{
                  this.ObjData.OSSAccessKeyId=rsp.data.accessid;
                  this.ObjData.policy=rsp.data.policy;
                  this.ObjData.Signature=rsp.data.signature;
                  this.ObjData.host=rsp.data.host; //传的OSS服务器地址
                  this.ObjData.key=rsp.data.dir+"${filename}";//获取文件名称
                 resolve(true);//继续上传
               }).catch(function (error) {
                      console.log(error)
                 reject(false)//停止上传
               })
             })
        }
      }
    }
</script>

<style scoped>

</style>
avatar

yuanyourdomain

写代码,做研究,记录生活。

RECOMMENDED

MyBatis 动态 SQL

2026-07-08

Nginx 基础入门

2026-07-08

Maven 多模块与私服

2026-07-08