阿里云对象存储OSS竟如此简单

本文详细介绍了阿里云的对象存储服务OSS,包括其功能、定价、开通步骤以及如何创建和删除存储空间Bucket。还展示了如何设置公共读权限、创建RAM账号、授权,并提供了Java SDK的使用示例,包括配置类、工具类的创建以及YML文件配置。此外,还包含了上传、下载和删除文件的测试代码。
摘要由CSDN通过智能技术生成

1.1:什么是阿里云的OSS

阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。您可以通过本文档提供的简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。


1.2:OSS定价

不到五块钱半年,适合于学习使用,ps: 我不亏呜呜...

1.3:官方参考文档

官方参考文档https://help.aliyun.com/product/31815.html


1.4:开通对象存储OSS服务

在这里插入图片描述
如上图所示,该页面为登录成功页面,如果没有使用过则可以进行注册或支付宝扫码登陆哦。

  • 3:登录成功之后,选择控制台

  • 4: 进入控制台点击产品与服务,选择搜索对象存储OSS在这里插入图片描述

  • 如果你没有开通请选择开通

  • 勾选点击立即开通
    在这里插入图片描述

  • 购买oss对象包,点击购买资源包
    在这里插入图片描述

  • 点击购买资源包后如下界面
    在这里插入图片描述

  • 点击立即购买
    在这里插入图片描述

  • 支付成功,回到管理控制台,查看得到购买记录

在这里插入图片描述

1.5:创建与删除空间Bucket

注意:Bucket 创建成功后,您所选择的 存储类型、区域 不支持变更。

在这里插入图片描述

  • 创建成功如下
    在这里插入图片描述

  • 查看 Bucket 相关信息。Endpoint:上传文件时使用Bucket域名:查看文件时使用>

  • 直接预览,上传文件点击即可
    在这里插入图片描述

  • 上传文件点击即可
    在这里插入图片描述

1.6:设置 Bucket 公共读权限

  • 点击图片文件名 Logo.png ,打开的右侧有个 URL,URL带上签名参数可以浏览器直接访问,会自动下载。但是如果不带签名无法访问,提示如下没有权限:

    在这里插入图片描述
  • 无法访问是因为默认文件都是私有的,没有公共读权限。而我们可以将当前 Bucket 设置为公共读权限,这样就可以不带签名就可以访问。
    在这里插入图片描述

1.7: 创建 RAM 账号-AccessKey

阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,
请登录 https://ram.console.aliyun.com 创建RAM账号。

* 1.8:创建用户

  • 访问 https://ram.console.aliyun.com/users/new ,输入登录名称、显示名称,勾选 编程访问 ,点击 确定
    在这里插入图片描述
  • 创建成功后,将查看到的 AccessKeyID 、AccessKeySecret 复制保存下来,在Java代码中要使用它操作OSS,不然页面关闭后将无法再次获取到此信息。如果没有记录下来,参见下一节 创建新的AccessKey
    在这里插入图片描述
    在此处创建Accesskey,然后保存起来,届时Java中会用到。

1.9:用户授权

对指定用户添加管理对象存储服务(OSS)服务。

2.0: java依赖

添加 OSS SDK 依赖

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



2.1:创建配置类

package com.qycq.common.pojo;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * As we all know, where there is Wolong,there must be phoenix!
 *
 * @author 七月初七
 * @version 1.0
 * @date 2021/11/15 1:13
 */
@Data
@Component
@ConfigurationProperties(prefix = "seven.oss")
public class OssProperties {
    /**
     * 阿里云配置类
     */
    private AliyunProperties aliyun;
}

2.2:创建阿里云配置类

package com.qycq.common.pojo;

import lombok.Data;

/**
 * As we all know, where there is Wolong,there must be phoenix!
 *
 * @author 七月初七
 * @version 1.0
 * @date 2021/11/15 1:13
 */
@Data
public class AliyunProperties {

    /**
     * 阿里云端点配置
     */
    private String endpoint;

    /**
     * 用户accessId
     */
    private String accessKeyId;

    /**
     * 用户密码加密
     */
    private String accessKeySecret;

    /**
     * 存储空间名称
     */
    private String bucketName;

    /**
     * Bucket域名,访问文件时作为url前缀
     */
    private String bucketDomain;
}

2.3:配置yml文件


# oss配置
seven:
  oss:
    aliyun:
      endpoint: http://oss-cn-guangzhou.aliyuncs.com  # oss端点
      accessKeyId: LTAI5tGGCf6NncxdXCf1ubq7
      accessKeySecret: SDofwzVRVFgIczWEH23ZW1BnJxP3Ib
      bucketName: dubboseven  # 存储空间名称
      # Bucket域名 访问文件时作为URL前缀,注意前面加上 https 和结尾加上 /
      bucketDomain: https://dubboseven.oss-cn-guangzhou.aliyuncs.com/

这个是我的,大家可以换成自己的

  • 创建枚举类
    文件可能会有头像和其他,所以需要分开存储
package com.qycq.common.enums;

/**
 * As we all know, where there is Wolong,there must be phoenix!
 *<p>
 *     阿里云存储枚举类
 *</p>
 * @author 七月初七
 * @version 1.0
 * @date 2021/11/15 1:19
 */
public enum AliyunEnum {
    //此处例如文章和头像
    ARTICLE, USER;
}

2.4: 工具类

package com.qycq.common.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.comm.ResponseMessage;
import com.aliyun.oss.model.PutObjectResult;
import com.qycq.common.enums.OssEnum;
import com.qycq.common.utils.CommonResult;
import com.qycq.common.pojo.AliyunProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.Objects;
import java.util.UUID;

/**
 * @Author: 七月初七
 * @Date: 2021-10-09-16:47
 * @Description: 阿里云文件上传下载工具类
 */
@Slf4j
public class AliyunOssUtil {

    /**
     * 文件上传: 上传成功后返回文件路径,例如
     * https://dubboseven.oss-cn-guangzhou.aliyuncs.com/user/2021-10-09 17:30:49/317b685c1cbd42c39b6ecae22962fe13.xlsx
     *
     * @param ossEnum          文件类型
     * @param file             文件上传
     * @param aliyunProperties 配置类
     * @return
     */
    public static CommonResult<?> uploadFileToOss(OssEnum ossEnum, MultipartFile file, AliyunProperties aliyunProperties) {
        /**
         * 获取文件夹名称,上传文件所在目录名,当天上传的文件放到当天日期的目录下
         */
        String folderName = ossEnum.name().toLowerCase() + "/" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
        log.info("该图片的文件夹名称为:{}", folderName);

        /**
         * 通过uuid生产随机名称,将其与文件名进行拼接保持唯一。
         */
        String fileName = UUID.randomUUID().toString().replace("-", "");

        /**
         * 获取原始文件名,然后从.处开始截取只要文件名称,不要文件后缀例如.jpg,.jpeg...
         */
        String fileExtensionName = Objects.requireNonNull(file.getOriginalFilename())
                .substring(file.getOriginalFilename().indexOf("."));
        log.info("截取的原始文件后缀名称为:{}", fileExtensionName);


        /**
         * 文件在oos中存储的完整路径名称
         */
        String filePath = folderName + "/" + fileName + fileExtensionName;
        log.info("当前文件完整路径名称:{}", filePath);

        OSS ossClient = null;

        try {
            /**
             * 根据阿里云的端点,用户key,密码生成OSS对象
             */
            ossClient = new OSSClientBuilder()
                    .build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());

            /**
             *  上传文件到OSS,并相应结果
             */
            PutObjectResult putObject = ossClient.putObject(aliyunProperties.getBucketName(),
                    filePath, file.getInputStream());

            ResponseMessage response = putObject.getResponse();
            if (response == null) {
                log.info("getBucketDomain:{}", aliyunProperties.getBucketDomain());
                return CommonResult.success("上传成功!", aliyunProperties.getBucketDomain() + filePath);
            } else {
                /**
                 * 上传失败,相应错误码和错误信息
                 */
                String errorMsg = "响应的错误码是:[" + response.getStatusCode() + "]错误信息是:[" + response.getErrorResponseAsString() + "]";
                return CommonResult.fail(errorMsg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return CommonResult.fail("文件操作失败!");
    }

    /**
     * 文件删除
     *
     * @param fileUrl
     * @param aliyunProperties
     * @return
     */
    public static CommonResult<?> deleteFileName(String fileUrl, AliyunProperties aliyunProperties) {
        if (StringUtils.isEmpty(fileUrl)) {
            return CommonResult.fail("文件路径不能为空!");
        }
        /**
         * 去除文件url中的Bucket域名,获取原始文件名称
         */
        String filePath = fileUrl.replace(aliyunProperties.getBucketDomain(), "");
        log.info("去除文件中的Bucket域名后为:{}", filePath);
        OSS ossClient = null;

        try {
            ossClient = new OSSClientBuilder()
                    .build(aliyunProperties.getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());

            log.info("aliyunProperties.getBucketName():{}", aliyunProperties.getBucketName());

            ossClient.deleteObject(aliyunProperties.getBucketName(), filePath);
            return CommonResult.success("删除文件成功!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return CommonResult.fail("删除文件失败!");
    }

}

2.5:定义注解导入配置


package com.qycq.api.annotations;

import com.qycq.common.pojo.OssProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import java.lang.annotation.*;

/**
 * As we all know, where there is Wolong,there must be phoenix!
 *<p>
 *     开启oss文件服务
 *</p>
 * @author 七月初七
 * @version 1.0
 * @date 2021/11/15 1:24
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Configuration
@Import(OssProperties.class)
public @interface EnableOssProperties {
    boolean flag() default true;
}

测试代码:

package com.qycq.article.controller;

import com.qycq.common.enums.OssEnum;
import com.qycq.common.pojo.OssProperties;
import com.qycq.common.utils.AliyunOssUtil;
import com.qycq.common.utils.CommonResult;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * As we all know, where there is Wolong,there must be phoenix!
 *
 * @author 七月初七
 * @version 1.0
 * @date 2021/11/15 1:28
 */
@RestController
@ApiModel(value = "测试OSS")
@Slf4j
@RequestMapping("/test")
public class TestController {

    @Autowired
    private OssProperties ossProperties;


    @PostMapping("/upload")
    @ApiOperation(value = "文件上传")
    public CommonResult<?> upload(@RequestParam("file") MultipartFile file) {
        return AliyunOssUtil.uploadFileToOss(OssEnum.USER, file, ossProperties.getAliyun());
    }


    @DeleteMapping("/delete")
    @ApiOperation(value = "删除文件")
    public CommonResult<?> delete(@RequestParam("fileUrl") String fileUrl) {
        return AliyunOssUtil.deleteFileName(fileUrl, ossProperties.getAliyun());
    }
}

2.6:具体测试

在这里插入图片描述

  • 上传成功
    在这里插入图片描述
  • 我们拿到这个url去访问远程服务器
    在这里插入图片描述
  • 我们去查看阿里oss服务器
    在这里插入图片描述
    删除的话就是将这窜url传递进去,这里就不再演示啦!!!,感谢大家观看嘤嘤嘤~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值