云存储解决方案-阿里云OSS
1. 阿里云OSS简介
阿里云对象存储服务(Object Storage Service,简称OSS)为您提供基于网络的数据存取服务。使用OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种非结构化数据文件。
阿里云OSS将数据文件以对象(object)的形式上传到存储空间(bucket)中。
您可以进行以下操作:
- 创建一个或者多个存储空间,向每个存储空间中添加一个或多个文件。
- 通过获取已上传文件的地址进行文件的分享和下载。
- 通过修改存储空间或文件的属性或元信息来设置相应的访问权限。
- 在阿里云管理控制台执行基本和高级OSS任务。
- 使用阿里云开发工具包或直接在应用程序中进行RESTful API调用执行基本和高级OSS任务
2. OSS开通
(1)打开https://www.aliyun.com/ ,申请阿里云账号并完成实名认证。
(3)开通OSS
登录阿里云官网。 点击右上角的控制台。
将鼠标移至产品,找到并单击对象存储OSS,打开OSS产品详情页面。在OSS产品详情页中的单击立即开通。
开通服务后,在OSS产品详情页面单击管理控制台直接进入OSS管理控制台界面。您也可以单击位于官网首页右上方菜单栏的控制台,进入阿里云管理控制台首页,然后单击左侧的对象存储OSS菜单进入OSS管理控制台界面。
(4)创建存储空间
新建Bucket,命名为 hmleadnews(按照自己的需求来非必须) ,读写权限为 公共读
3. OSS快速入门
(1)创建测试工程,引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
实现步骤:
1). 定义OSS相关配置
在sky-server模块
application-dev.yml
sky:
alioss:
endpoint: oss-cn-hangzhou.aliyuncs.com
access-key-id: LTAI5tAZ4Q2k71pXiPZiRfpx
access-key-secret: RzEAj9b53PfBx2VVzHIWE9YWBJtnhU
bucket-name: sky-itcast998
注:alioss:获取流程如下
注:
1.进去之后会显示access-key-id和 access-key-secret(建议截图保存下来)
2.endpoint:你选择杭州就是oss-cn-hangzhou.aliyuncs.com
你选择北京就是oss-cn-beijing.aliyuncs.com,可以理解吧
3.bucket-name就是创建的名字(直接点击一下就可以复制啦)
application.yml
spring:
profiles:
active: dev #设置环境
sky:
alioss:
endpoint: ${sky.alioss.endpoint}
access-key-id: ${sky.alioss.access-key-id}
access-key-secret: ${sky.alioss.access-key-secret}
bucket-name: ${sky.alioss.bucket-name}
2). 读取OSS配置
在sky-common模块中,已定义
/**
* 阿里云配置实体类
*/
@Component
/*请注意,为了使用@ConfigurationProperties注解,你需要在Spring Boot应用程序中启用配置绑定功能。
你可以通过在主应用程序类上添加@EnableConfigurationProperties注解来实现。*/
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {
private String endpoint; //表示OSS服务的访问域名。
private String accessKeyId; //表示访问OSS服务所需的Access Key ID。
private String accessKeySecret; //表示访问OSS服务所需的Access Key Secret。
private String bucketName; //表示要操作的存储桶名称。
}
3). 生成OSS工具类对象
在sky-server模块
/**
* 配置类,用于创建AliOssUtil对象
*/
@Configuration
@Slf4j
public class OssConfiguration {
/*在这个配置类中,定义了一个名为aliOssUtil的@Bean方法,用于创建一个AliOssUtil对象。*/
@Bean
/*@ConditionalOnMissingBean注解表示当不存在名为aliOssUtil的bean时,才会创建该bean。
这意味着如果已经有其他地方定义了名为aliOssUtil的bean,那么这个方法将不会执行。*/
@ConditionalOnMissingBean
/*在方法体中,通过依赖注入的方式获取AliOssProperties对象,并使用它的属性值来创建AliOssUtil对象。*/
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
其中,AliOssUtil.java已在sky-common模块中定义
/**
* AliOssUtil类是一个包含文件上传功能的工具类。
*/
@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
/**
* 文件上传
*
* @param bytes
* @param objectName
* @return
*/
public String upload(byte[] bytes, String objectName) {
// 创建OSSClient实例。
/*在upload方法中,首先创建了一个OSSClient实例,用于与OSS服务进行交互。*/
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObject请求。
/*然后,通过调用ossClient.putObject方法将文件上传到指定的存储桶中。*/
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
/*在上传过程中,通过捕获OSSException和ClientException来处理可能出现的异常情况,并输出相应的错误信息。*/
} 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 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();
}
}
//文件访问路径规则 https://BucketName.Endpoint/ObjectName
/*最后,构建文件的访问路径,并使用日志记录上传文件的路径。*/
StringBuilder stringBuilder = new StringBuilder("https://");
stringBuilder
.append(bucketName)
.append(".")
.append(endpoint)
.append("/")
.append(objectName);
log.info("文件上传到:{}", stringBuilder.toString());
return stringBuilder.toString();
}
}
4). 定义文件上传接口
在sky-server模块中定义接口
/**
* 通用接口
*/
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
/*CommonController是一个使用AliOssUtil进行文件上传的控制器类。*/
public class CommonController {
@Autowired
private AliOssUtil aliOssUtil;
/**
* 文件上传
*
* @param file
* @return
*/
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file) {
log.info("文件上传:{}", file);
try {
//原始文件名
/*首先通过file.getOriginalFilename()获取原始文件名*/
String originalFilename = file.getOriginalFilename();
//截取原始文件名的后缀 dfdfdf.png
/*然后通过originalFilename.lastIndexOf(".")获取文件名的后缀。*/
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
//构造新文件名称
/*使用UUID.randomUUID().toString()生成一个随机的文件名,并将后缀拼接在文件名后面,构造出新的文件名。*/
String objectName = UUID.randomUUID().toString() + extension;
//文件的请求路径
/*然后,调用aliOssUtil.upload方法将文件上传到OSS,并获取文件的请求路径。*/
String filePath = aliOssUtil.upload(file.getBytes(), objectName);
/*最后,返回一个Result对象,其中包含上传文件的请求路径。*/
return Result.success(filePath);
} catch (IOException e) {
log.error("文件上传失败:{}", e);
}
return Result.error(MessageConstant.UPLOAD_FAILED);
}
}