一、java调用OSS

1. 参考官方文档

https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.5e9a58d5ZnuSyZ

2. 官网介绍

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海 量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任 何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管 理。OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。按 实际容量付费真正使您专注于核心业务。

3. 使用

1) 创建AccessKey 【访问钥匙】

java程序使用AccessKey 表明自己的身份【相当于密码】

2) 使用子账户的access key【创建完成 看右下角】

AccessKeyId: LTAI4G5av4KDzSwr2Uv2dzEH
AccessKeySecret: RGgyxGBXKpKG43qjQShIRIG0DQIGhK

3) 导入OSS依赖

  1. <!-- OSS 客户端 SDK -->
  2. <dependency>
  3. <groupId>com.aliyun.oss</groupId>
  4. <artifactId>aliyun-sdk-oss</artifactId>
  5. <version>3.5.0</version>
  6. </dependency>

未命名图片.png

4. 代码

1)在project-consumer工程添加依赖

project-consumer工程也要做web的事,所以auth-consumer 有什么依赖他都要有
<!--__________________________________________________-->
<!--aliyun OSS sdk-->
<!--如果使用的是java 9 以上的话  需要添加jaxb依赖-->
<dependency>
  <groupId>com.aliyun.oss</groupId>
  <artifactId>aliyun-sdk-oss</artifactId>
  <version>3.5.0</version>
</dependency>
<!--如果使用的是java 9 以上的话  需要添加jaxb依赖-->
<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.1</version>
</dependency>
<dependency>
  <groupId>javax.activation</groupId>
  <artifactId>activation</artifactId>
  <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
  <groupId>org.glassfish.jaxb</groupId>
  <artifactId>jaxb-runtime</artifactId>
  <version>2.3.3</version>
</dependency>
<!--__________________________________________________-->

2) 配置属性类

未命名图片.png

@NoArgsConstructor
@AllArgsConstructor
@Data
@Component
@ConfigurationProperties("aliyun.oss")
public class OSSProperties {
    private String endPoint;
    private String bucketName;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketDomain;
}

3) application配置文件 [project-consumer工程的]

spring:
  application:
    name: yixuexi-crowd-project
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    cache: false

  redis:
    host: 192.168.10.11
  session:
    store-type: redis
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1000/eureka/
server:
  port: 5000

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000

aliyun:
  oss:
    endPoint: http://oss-cn-zhangjiakou.aliyuncs.com
    bucketName: yixuexi20210317
    accessKeyId: LTAI4G5av4KDzSwr2Uv2dzEH
    accessKeySecret: RGgyxGBXKpKG43qjQShIRIG0DQIGhK
    bucketDomain: http://yixuexi20210317.oss-cn-zhangjiakou.aliyuncs.com

4) util 工程的工具类

/**
 * @date: 2021/3/17   21:49
 * @author: 易学习
 */
public class OSS {
    /**
     * 专门负责上传文件到 OSS 服务器的工具方法
     *
     * @param endpoint        OSS 参数
     * @param accessKeyId     OSS 参数
     * @param accessKeySecret OSS 参数
     * @param inputStream     要上传的文件的输入流
     * @param bucketName      OSS 参数
     * @param bucketDomain    OSS 参数
     * @param originalName    要上传的文件的原始文件名
     * @return 包含上传结果以及上传的文件在 OSS 上的访问路径
     */
    public static ResultEntity<String> uploadFileToOss(
            String endpoint, String accessKeyId, String accessKeySecret,
            InputStream inputStream, String bucketName, String bucketDomain, String originalName) {
        // 创建 OSSClient 实例。
        com.aliyun.oss.OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 生成上传文件的目录
        String folderName = new SimpleDateFormat("yyyyMMdd").format(new Date());
        // 生成上传文件在 OSS 服务器上保存时的文件名
        // 原始文件名:beautfulgirl.jpg
        // 生成文件名:wer234234efwer235346457dfswet346235.jpg
        // 使用 UUID 生成文件主体名称
        String fileMainName = UUID.randomUUID().toString().replace("-", "");
        // 从原始文件名中获取文件扩展名
        String extensionName = originalName.substring(originalName.lastIndexOf("."));
        // 使用目录、文件主体名称、文件扩展名称拼接得到对象名称
        String objectName = folderName + "/" + fileMainName + extensionName;
        try {
            // 调用 OSS 客户端对象的方法上传文件并获取响应结果数据
            PutObjectResult putObjectResult = ossClient.putObject(bucketName, objectName,
                    inputStream);
            // 从响应结果中获取具体响应消息
            ResponseMessage responseMessage = putObjectResult.getResponse();
            // 根据响应状态码判断请求是否成功
            if (responseMessage == null) {
                // 拼接访问刚刚上传的文件的路径
                String ossFileAccessPath = bucketDomain + "/" + objectName;
                // 当前方法返回成功
                return ResultEntity.successWithData(ossFileAccessPath);
            } else {
                // 获取响应状态码
                int statusCode = responseMessage.getStatusCode();
                // 如果请求没有成功,获取错误消息
                String errorMessage = responseMessage.getErrorResponseAsString();
                // 当前方法返回失败
                return ResultEntity.failed(" 当 前 响 应 状 态 码 =" + statusCode + " 错 误 消 息 " + errorMessage);
            }
        } catch (
                Exception e) {
            e.printStackTrace();
            // 当前方法返回失败
            return ResultEntity.failed(e.getMessage());
        } finally {
            if (ossClient != null) {
                // 关闭 OSSClient。
                ossClient.shutdown();
            }
        }
    }

     // 测试一下 是否能发送到OSS中
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("E:\\test.png");

        uploadFileToOss("http://oss-cn-zhangjiakou.aliyuncs.com",
                "LTAI4G5av4KDzSwr2Uv2dzEH",
                "RGgyxGBXKpKG43qjQShIRIG0DQIGhK",
                fileInputStream,
                "yixuexi20210317",
                "http://yixuexi20210317.oss-cn-zhangjiakou.aliyuncs.com",
                "test.png"
        );

    }
}