前置条件
- 获取ak sk
登录华为云-》统一身份认证服务-》用户-》安全设置-》新增访问密钥 - 获取endPoint
访问:developer.huaweicloud.com/endpoint?OB… 查找自己obs服务对应区域的终端节点 - 创建桶
华为云控制台搜索“对象存储服务”-》桶列表-》创建桶
集成代码
- pom.xml
<dependency>
<groupId>com.huaweicloud</groupId>
<artifactId>esdk-obs-java</artifactId>
<version>3.21.8</version>
</dependency>
<!--
必须制定okhttp3的最新版本号,
否则会出现java.lang.NoSuchMethodError: okhttp3.RequestBody.create
-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
<!--
必须指定与okhttp相匹配的okio的版本,否则会出现okio和okhttp的包冲突问题
java.lang.NoSuchMethodError: kotlin
-->
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>2.8.0</version>
</dependency>
- config配置类
package com.dz.dao.config;
import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @ClassName ObsConfig
* @Description: obs配置类
* @Author: wu
* @CreateDate: 2024/1/10 14:08
*/
@Data
@Configuration
@Slf4j
public class HweiOBSConfig {
/**
* 访问密钥AK
*/
@Value("${hwyun.obs.accessKey}")
private String accessKey;
/**
* 访问密钥SK
*/
@Value("${hwyun.obs.securityKey}")
private String securityKey;
/**
* 终端节点
*/
@Value("${hwyun.obs.endPoint}")
private String endPoint;
/**
* 桶
*/
@Value("${hwyun.obs.bucketName}")
private String bucketName;
/**
* @Description 获取OBS客户端实例
* @return: com.obs.services.ObsClient
*/
public ObsClient getInstance() {
return new ObsClient(accessKey, securityKey, endPoint);
}
/**
* @Description 销毁OBS客户端实例
* @param: obsClient
*/
public void destroy(ObsClient obsClient) {
try {
obsClient.close();
} catch (ObsException e) {
log.error("obs执行失败", e);
} catch (Exception e) {
log.error("执行失败", e);
}
}
/**
* @Description 微服务文件存放路径
* @return: java.lang.String
*/
public static String getObjectKey() {
// 项目或者服务名称 + 日期存储方式
return "files" + "/" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "/";
}
}
- service实现类
public String fileUpload(MultipartFile uploadFile, String fileName) {
ObsClient obsClient = null;
try {
String bucketName = hweiOBSConfig.getBucketName();
obsClient = hweiOBSConfig.getInstance();
InputStream inputStream = uploadFile.getInputStream();
long available = inputStream.available();
PutObjectRequest request = new PutObjectRequest(bucketName, createUUidName(fileName), inputStream);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(available);
request.setMetadata(objectMetadata);
// 设置对象访问权限为公共读
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
PutObjectResult result = obsClient.putObject(request);
// 读取该已上传对象的URL
log.info("已上传对象的URL" + result.getObjectUrl());
return result.getObjectUrl();
} catch (ObsException e) {
log.error("obs[fileUpload]上传失败", e);
} catch (IOException e) {
log.error("[fileUpload]上传失败", e);
} finally {
hweiOBSConfig.destroy(obsClient);
}
return null;
}
/**
* 创建随机的名
* @param fileName
* @return
*/
private static String createUUidName(String fileName){
//后缀
String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
String uuid = UUID.randomUUID().toString().replace("-", "");
//文件全路径
return HweiOBSConfig.getObjectKey()+uuid+System.currentTimeMillis() + "." + prefix;
}
- controller调用
@Autowired
HwObsService hwObsService;
@ApiOperation("文件上传")
@PostMapping("upload")
public R localUpload(MultipartFile file, HttpServletRequest request) throws IOException {
String fileName = file.getOriginalFilename();
return R.ok(hwObsService.fileUpload(file,fileName));
8.application.yml
hwyun:
obs:
#访问密钥AK
accessKey: 通过华为云获取
#访问密钥SK
securityKey: 通过华为云获取
#终端节点
endPoint: 通过华为云获取
#桶名
bucketName: 通过华为云获取