|
|
|
@ -0,0 +1,113 @@
|
|
|
|
|
package com.sky.utils;
|
|
|
|
|
|
|
|
|
|
import com.aliyun.oss.ClientException;
|
|
|
|
|
import com.aliyun.oss.OSS;
|
|
|
|
|
import com.aliyun.oss.OSSClientBuilder;
|
|
|
|
|
import com.aliyun.oss.OSSException;
|
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
import lombok.Data;
|
|
|
|
|
import lombok.NoArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* AliOssUtil类是一个工具类,主要用于与阿里云对象存储服务(OSS)进行交互,实现文件上传的功能。
|
|
|
|
|
* 它利用了阿里云OSS的Java SDK,方便在Spring Boot项目中将本地文件以字节数组的形式上传到指定的OSS存储桶中,并返回文件在OSS上的访问路径。
|
|
|
|
|
*/
|
|
|
|
|
@Data
|
|
|
|
|
// 使用Lombok的@Data注解,会自动为类中的私有成员变量生成对应的Getter、Setter方法,以及toString、equals和hashCode等方法,简化代码编写。
|
|
|
|
|
@Slf4j
|
|
|
|
|
// 使用Lombok的@Slf4j注解,会在类中自动生成一个名为log的Slf4j日志记录器,方便在代码中记录相关的操作信息、异常等情况,便于调试和监控。
|
|
|
|
|
@Component
|
|
|
|
|
// 使用@Component注解将该类标记为Spring框架中的一个组件,这样Spring容器能够自动扫描并管理它,使得该类可以在项目的其他地方通过依赖注入等方式被使用。
|
|
|
|
|
@AllArgsConstructor
|
|
|
|
|
// 使用Lombok的@AllArgsConstructor注解,会自动生成一个包含所有成员变量的构造函数,方便在创建类实例时进行参数注入等操作。
|
|
|
|
|
@NoArgsConstructor
|
|
|
|
|
// 使用Lombok的@NoArgsConstructor注解,会自动生成一个无参构造函数,满足某些场景下需要默认构造函数的需求,例如在一些框架进行对象实例化时可能会调用无参构造函数。
|
|
|
|
|
public class AliOssUtil {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 阿里云OSS服务的访问端点(Endpoint)。
|
|
|
|
|
* 它指定了与阿里云OSS进行通信的网络地址,不同的地域对应的Endpoint是不同的,通过配置该属性可以准确连接到对应的OSS服务区域。
|
|
|
|
|
* 例如:"oss-cn-hangzhou.aliyuncs.com"表示阿里云杭州地域的OSS端点,该属性的值通常会从项目的配置文件(如application.properties或application.yml)中获取并注入到这个变量中。
|
|
|
|
|
*/
|
|
|
|
|
private String endpoint;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 阿里云OSS服务的访问密钥ID(Access Key ID)。
|
|
|
|
|
* 它是用于身份验证的重要凭据之一,与Access Key Secret一起,用于确认调用OSS服务的合法性,相当于用户在阿里云OSS服务中的账号标识,只有拥有正确的Access Key ID和Access Key Secret才能进行相应的操作,如上传、下载文件等。
|
|
|
|
|
* 同样,该值也是从项目的配置文件中安全地获取并注入到此变量中的。
|
|
|
|
|
*/
|
|
|
|
|
private String accessKeyId;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 阿里云OSS服务的访问密钥(Access Key Secret)。
|
|
|
|
|
* 与Access Key ID配合使用,用于对请求进行签名验证,确保请求的安全性和合法性,是访问OSS服务的重要安全凭证,需要妥善保管,防止泄露。
|
|
|
|
|
* 其值通过配置文件注入到该变量中。
|
|
|
|
|
*/
|
|
|
|
|
private String accessKeySecret;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 阿里云OSS存储桶(Bucket)的名称。
|
|
|
|
|
* 存储桶是OSS中用于存储对象(如文件等)的容器,类似于文件系统中的文件夹概念,但功能更强大,所有上传到OSS的文件都要存放在某个特定的存储桶中,通过指定该名称,就能确定文件上传的目标存储位置。
|
|
|
|
|
* 其名称由用户在阿里云控制台创建存储桶时定义,并且在项目配置中指定,以便在代码中使用。
|
|
|
|
|
*/
|
|
|
|
|
private String bucketName;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 文件上传方法,用于将给定的字节数组形式的文件内容上传到阿里云OSS指定的存储桶中,并返回文件在OSS上的访问路径。
|
|
|
|
|
*
|
|
|
|
|
* @param bytes 文件字节码,即代表要上传文件的内容以字节数组的形式传入,例如可以通过读取本地文件并转换为字节数组后传递进来,以便将该文件上传到OSS中。
|
|
|
|
|
* @param objectName 文件名字,它是文件在OSS存储桶中的对象名称,也就是文件在OSS中的唯一标识,类似于文件在本地文件系统中的文件名,需要注意命名的唯一性和合法性,遵循OSS的命名规范。
|
|
|
|
|
* @return 返回文件上传路径,即文件上传成功后在阿里云OSS上可通过网络访问的完整URL地址,格式通常为"https://BucketName.Endpoint/ObjectName",方便后续在项目中使用该路径进行文件的访问、展示等操作。
|
|
|
|
|
*/
|
|
|
|
|
public String upload(byte[] bytes, String objectName) {
|
|
|
|
|
|
|
|
|
|
// 创建OSSClient实例。
|
|
|
|
|
// 通过OSSClientBuilder构建器,使用传入的endpoint、accessKeyId和accessKeySecret来创建一个与阿里云OSS服务进行交互的客户端实例,
|
|
|
|
|
// 该客户端实例将用于后续的文件上传等操作,它封装了与OSS服务通信的底层细节,提供了一系列方便的方法来操作OSS资源。
|
|
|
|
|
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
|
|
|
|
try {
|
|
|
|
|
// 创建PutObject请求。
|
|
|
|
|
// 使用ossClient的putObject方法创建一个文件上传请求,将指定的字节数组内容(通过ByteArrayInputStream包装后)上传到指定的bucketName存储桶中,以objectName作为对象名称。
|
|
|
|
|
// 这个操作实际上就是向OSS服务发送请求,将本地的文件数据传输到云端存储桶里,如果上传过程中出现OSS相关的异常情况,会被相应的异常处理机制捕获。
|
|
|
|
|
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
|
|
|
|
|
} catch (OSSException oe) {
|
|
|
|
|
// 捕获OSSException异常,该异常表示请求已经发送到OSS服务端,但由于某些原因(如权限问题、资源不存在等)被服务端拒绝,并返回了错误响应信息。
|
|
|
|
|
// 下面的代码主要是将OSS服务端返回的详细错误信息打印出来,方便开发人员定位问题,例如错误消息、错误代码、请求ID以及主机ID等信息都有助于排查问题所在。
|
|
|
|
|
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) {
|
|
|
|
|
// 捕获ClientException异常,该异常表示客户端在尝试与OSS服务进行通信时遇到了严重的内部问题,比如无法访问网络等情况,
|
|
|
|
|
// 通常是客户端自身环境或者配置方面的问题导致无法正常连接到OSS服务,这里同样打印出错误消息,以便分析是哪里出现了通信故障。
|
|
|
|
|
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实例,释放相关的资源,避免资源泄露,保证程序的稳定性和性能。
|
|
|
|
|
ossClient.shutdown();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 文件访问路径规则 https://BucketName.Endpoint/ObjectName
|
|
|
|
|
StringBuilder stringBuilder = new StringBuilder("https://");
|
|
|
|
|
stringBuilder
|
|
|
|
|
.append(bucketName)
|
|
|
|
|
.append(".")
|
|
|
|
|
.append(endpoint)
|
|
|
|
|
.append("/")
|
|
|
|
|
.append(objectName);
|
|
|
|
|
|
|
|
|
|
log.info("文件上传到:{}", stringBuilder);
|
|
|
|
|
|
|
|
|
|
return stringBuilder.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|