阿里云Oss
阿里云Oss文件上传在SpringBoot项目中的使用
1.阿里云oss基本介绍
阿里云对象存储服务(Object Storage Service,简称 OSS)是阿里云提供的海量、安全、低成本、高可靠的云端存储服务。它非常适合用来存储和管理大量的非结构化数据,如图片、视频、日志文件、备份数据等。
ps:简单来说就是把本地的资源(图片,视频,备份数据等)上传到阿里云Oss中进行保存/托管,在SpringBoot项目中把Oss作为文件的保存端,在项目使用到文件的时候可以更加快速的与后端建立联系。
2.阿里云oss开通
2.1.创建bucket
确保创建的Bucket的访问权限是 公共读
2.2.设置访问权限为公共读
2.3测试创建的Bucket是否可用
2.4.生成/获取密钥(AccessKey)
2.5.删除Bucket
3.阿里云Oss在SpringBoot项目中的应用
ps:在阿里云Oss中提供了其在Java后端使用方法的参考文档,如下:
后续是我根据参考文档整理的用法
3.1.添加Maven依赖项
meaven的作用:
作用:引入阿里云 OSS 的 SDK,这是与 OSS 进行交互的基础库。
其他依赖项(如 jaxb-api
等): 这些依赖是为了解决某些版本的 Java 中缺少 JAXB API 的问题,确保项目可以在没有内置 JAXB 支持的环境中正常运行。
个人见解:Meaven提供了阿里云Oss与后端进行交互的基础库(建立了连接)
java 8版本
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
java 9及以上版本------则需要添加以下JAXB相关依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<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>
3.2.配置 配置文件application.yml
配置文件的作用:
- 作用:提供了应用程序所需的 OSS 配置项。
application.yml
中设置了占位符,而具体的值则放在了application-dev.yml
中,这允许根据不同的环境(例如开发、测试、生产)有不同的配置。确保应用程序能够正确地访问 OSS,同时支持多环境部署。
个人见解:提供了访问阿里云Oss的配置项(提供了与阿里云建立连接的钥匙)
只有application.yml文件
sky:
alioss:
# 配置阿里云oss实际的操作连接数据
endpoint: oss-cn-beijing.aliyuncs.com
access-key-id: ***************
access-key-secret: *****************
bucket-name: sky-take-out-0307
endpoint:域名----创建Bucket时选择的域名
access-key-id: AccessKey ID
access-key-secret: AccessKey Sectect
bucket-name: Bucket名称
有application-dev.yml和application.yml文件
application.yml:
sky:
alioss:
# 设置阿里云oss文件上传配置,实际配置书写在dev.yml中
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}
application-dev.yml:
sky:
alioss:
# 配置阿里云oss实际的操作连接数据
endpoint: oss-cn-beijing.aliyuncs.com
access-key-id: LTAI5tGnD3VkvEmVU99NSyHR
access-key-secret: PfUknY0YQggCOfjj0rwB2rVy3mCnVi
bucket-name: sky-take-out-0307
3.3.配置属性类
配置属性类的作用:
- 作用:这个类用于从
application.yml
或其他配置文件中读取与 OSS 相关的配置信息,并将其绑定到 Java 对象上。它是连接应用程序和配置文件的桥梁,使得可以在运行时动态获取或更新 OSS 的配置信息。
配置属性类的位置:一般配置属性类会有专门的包来存放即 properties 包
/*
* 读取OSS配置----配置属性类
* */
@Component
@ConfigurationProperties(prefix = "sky.alioss")
//将配置文件声明成类文件,@ConfigurationProperties(prefix = "sky.alioss")表明了是配置问件下的具体的那个配置,也就是说注解@ConfigurationProperties(prefix = "sky.alioss")可以把配置文件中的值对应到这个类中的属性上
@Data
public class AliOssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
3.4.书写工具类utils
工具类的作用:
- 作用:提供了一系列方法来操作 OSS,如上传文件等。通过构造函数注入了必要的配置参数。这是实际执行文件上传的核心逻辑所在,所有的文件上传请求都会调用这个类的方法。
工具类的位置:存放在工具类包下 即utils包
/**
* 阿里云文件上传工具类
*/
@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实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
} 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();
}
}
3.5.编写配置类
配置类作用:
- 作用:负责创建并注册
AliOssUtil
Bean 到 Spring 容器中,以便在整个应用中使用。确保每次需要使用AliOssUtil
时都能获得一个已经初始化好的实例,而不需要手动实例化。
位置:存放在config包下
/**
* 配置类,用于创建AliOssUtil对象
*/
@Configuration
@Slf4j
public class OssConfiguration {
@Bean
@ConditionalOnMissingBean
//@ConditionalOnMissingBean注解的意思:当没有这个对象的时候再去创建。注意要return的是这个新创建的对象,不然后面自动注入会失败,这里的主要目的就是创建Bean对象。
public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);
return new AliOssUtil(aliOssProperties.getEndpoint(),
aliOssProperties.getAccessKeyId(),
aliOssProperties.getAccessKeySecret(),
aliOssProperties.getBucketName());
}
}
3.6.编写通用上传接口commonController
/**
* 通用接口
*/
@RestController
@RequestMapping("/admin/common")
@Api(tags = "通用接口")
@Slf4j
public class CommonController {
@Autowired//在配置类中已经把工具类封装成了对象(Bean),所以这里可以直接使用依赖注入
private AliOssUtil aliOssUtil;
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
@ApiOperation("文件上传")
public Result<String> upload(MultipartFile file){
log.info("文件上传:{}",file);
try {
//原始文件名
String originalFilename = file.getOriginalFilename();
//截取原始文件名的后缀 dfdfdf.png
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
//构造新文件名称
String objectName = UUID.randomUUID().toString() + extension;
//文件的请求路径
String filePath = aliOssUtil.upload(file.getBytes(), objectName);
return Result.success(filePath);
} catch (IOException e) {
log.error("文件上传失败:{}", e);
}
return Result.error(MessageConstant.UPLOAD_FAILED);
}
}
更多推荐
所有评论(0)