华为云对象存储(OBS)工具类

目录

    • 一、pom.xml依赖
    • 二、配置文件
    • 三、配置类
    • 四、工具类


一、pom.xml依赖

<dependency><groupId>com.huaweicloudgroupId><artifactId>esdk-obs-java-bundleartifactId><version>3.21.12version>
dependency>

二、配置文件

##华为OBS接入配置
huaweiobs:#OBS服务所在地址endPoint: https://xxx#存储桶名称bucketName: bucket-test#访问的keyak: xxx#访问的秘钥sk: xxx

三、配置类

package com.xxx.config;import com.xxx.util.HuaWeiOBSUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** HuaWeiOBS配置类** @author hcs* @date 2023/6/1 9:41*/
@Configuration
public class HuaWeiOBSConfig {@Value("${huaweiobs.bucketName:bucketNameCfg}")private String bucketName;@Value("${huaweiobs.ak:akCfg}")private String ak;@Value("${huaweiobs.sk:skCfg}")private String sk;@Value("${huaweiobs.endPoint:endPointCfg}")private String endPoint;@Beanpublic HuaWeiOBSUtil huaWeiOBSUtil() {return new HuaWeiOBSUtil(bucketName, ak, sk, endPoint);}
}

四、工具类

package com.xxx.util;import com.obs.services.ObsClient;
import com.obs.services.model.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** 华为云存储(OBS)-工具类** @author hcs* @date 2023/6/20 17:03*/
@Slf4j
public class HuaWeiOBSUtil {/*** 文件外链过期时间,7天*/private static long expire = 7 * 24 * 60 * 60;/*** 文件外链访问端口*/private static String port = ":443";private static String bucketName;private static String ak;private static String sk;private static String endPoint;/*** OBS操作客户端*/private static ObsClient obsClient = null;private static final String SEPARATOR = "/";public HuaWeiOBSUtil(String bucketName, String ak, String sk, String endPoint) {HuaWeiOBSUtil.bucketName = bucketName;HuaWeiOBSUtil.ak = ak;HuaWeiOBSUtil.sk = sk;HuaWeiOBSUtil.endPoint = endPoint;createObsClientInstance();}public static String getBucketName() {return bucketName;}public static String getAk() {return ak;}public static String getSk() {return sk;}public static String getEndPoint() {return endPoint;}/*** 获取OBS操作客户端** @return*/private static void createObsClientInstance() {try {if (obsClient == null) {synchronized (ObsClient.class) {if (obsClient == null) {obsClient = new ObsClient(ak, sk, endPoint);}}}createBucket(bucketName, endPoint);} catch (Exception e) {log.error("连接华为云存储服务器异常:" + e.getMessage(), e);}}/*** 获取上传文件的基础路径** @return url*/public static String getBasisUrl() {//实示例:http协议 + 存储桶名称 + . + endPoint + port + /return getHttpProtocol(endPoint) + "://" + bucketName + "." + endPoint.replace(getHttpProtocol(endPoint) + "://", "") + port + SEPARATOR;}/*** 获取上传文件的基础路径** @param bucketName* @return*/public static String getBasisUrl(String bucketName) {//实示例:http协议 + 存储桶名称 + . + endPoint + port + /return getHttpProtocol(endPoint) + "://" + bucketName + "." + endPoint.replace(getHttpProtocol(endPoint) + "://", "") + port + SEPARATOR;}/*** 获取区域** @param endPoint* @return*/public static String getRegion(String endPoint) {String substring = endPoint.substring(endPoint.indexOf(".") + 1);return substring.substring(0, substring.indexOf("."));}/*** 获取http协议** @param endPoint* @return*/public static String getHttpProtocol(String endPoint) {return endPoint.substring(0, endPoint.indexOf(":"));}/*** 创建存储桶** @param bucketName* @return*/public static void createBucket(String bucketName, String endPoint) {if (!headBucket(bucketName)) {CreateBucketRequest request = new CreateBucketRequest();// 设置存储桶名称request.setBucketName(bucketName);// 设置桶区域位置,从endPoint中截取,如果Location设置的区域与endPoint中的区域不是同一个,则创建会报错request.setLocation(getRegion(endPoint));// 创建桶成功obsClient.createBucket(request);}}/*** 删除存储桶** @param bucketName* @return*/public static HeaderResponse deleteBucket(String bucketName) {return obsClient.deleteBucket(bucketName);}/*** 判断存储桶是否存在** @param bucketName* @return*/public static boolean headBucket(String bucketName) {return obsClient.headBucket(bucketName);}/*** 上传字符** @param bucketName* @param objectName* @param content* @return*/public static PutObjectResult putObjectByStr(String bucketName, String objectName, String content) {if (StringUtils.isBlank(content)) {return null;}//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()));}/*** 上传输入流** @param bucketName* @param objectName* @param inputStream* @return*/public static PutObjectResult putObjectByInput(String bucketName, String objectName, InputStream inputStream) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.putObject(bucketName, objectName, inputStream);}/*** 上传文件输入流** @param bucketName* @param objectName* @param fileInputStream* @return*/public static PutObjectResult putObjectByFileInput(String bucketName, String objectName, FileInputStream fileInputStream) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.putObject(bucketName, objectName, fileInputStream);}/*** 通过MultipartFile,上传文件** @param bucketName* @param objectName* @param media* @return*/public static PutObjectResult putObjectByMultipartFile(String bucketName, String objectName, MultipartFile media) throws IOException {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.putObject(bucketName, objectName, media.getInputStream());}/*** 上传本地文件** @param bucketName* @param objectName* @param file* @return*/public static PutObjectResult putObjectByFile(String bucketName, String objectName, File file) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.putObject(bucketName, objectName, file);}/*** 下载文件到本地** @param bucketName* @param objectName* @param filePath* @return*/public static boolean downloadObject(String bucketName, String objectName, String filePath) throws Exception {if (StringUtils.isBlank(filePath)) {return false;}//重新构建objectNameobjectName = buildObjectName(objectName);filePath = filePath.replace("\\", SEPARATOR);InputStream input = null;FileOutputStream fileOutputStream = null;try {// 获取对象ObsObject obsObject = obsClient.getObject(bucketName, objectName);// 读取对象内容input = obsObject.getObjectContent();if (input == null) {return false;}//获取文件夹路径if (filePath.contains(SEPARATOR)) {String dir = filePath.substring(0, filePath.lastIndexOf(SEPARATOR));File difFile = new File(dir);if (!difFile.exists()) {//创建文件夹boolean mkdirs = difFile.mkdirs();}}File file = new File(filePath);fileOutputStream = new FileOutputStream(file);byte[] b = new byte[1024];int len;while ((len = input.read(b)) != -1) {fileOutputStream.write(b, 0, len);}return true;} finally {if (fileOutputStream != null) {fileOutputStream.close();}if (input != null) {input.close();}}}/*** 获取文件内容** @param bucketName* @param objectName* @return*/public static String getObjectContent(String bucketName, String objectName) throws IOException {//重新构建objectNameobjectName = buildObjectName(objectName);InputStream input = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();try {ObsObject obsObject = obsClient.getObject(bucketName, objectName);// 读取对象内容input = obsObject.getObjectContent();byte[] b = new byte[1024];int len;while ((len = input.read(b)) != -1) {bos.write(b, 0, len);}return new String(bos.toByteArray());} finally {bos.close();if (input != null) {input.close();}}}/*** 获取文件输入流** @param bucketName* @param objectName* @return*/public static InputStream getObject(String bucketName, String objectName) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.getObject(bucketName, objectName).getObjectContent();}/*** 指定数目和前缀列举** @param bucketName* @param prefix* @param maxKeys* @return*/public static List<ObsObject> listObjects(String bucketName, String prefix, Integer maxKeys) {prefix = prefix.startsWith("/") ? prefix.substring(1) : prefix;ListObjectsRequest request = new ListObjectsRequest(bucketName);// 设置列举的对象个数request.setMaxKeys(maxKeys);// 设置列举的对象需要带有指定前缀request.setPrefix(prefix);ObjectListing result = obsClient.listObjects(request);return result.getObjects();}/*** 列举指定前缀的全部对象** @param bucketName* @param prefix* @return*/public static List<ObsObject> listAllObjects(String bucketName, String prefix) {prefix = prefix.startsWith("/") ? prefix.substring(1) : prefix;List<ObsObject> list = new ArrayList<>();ListObjectsRequest request = new ListObjectsRequest(bucketName);// 设置列举的对象个数request.setMaxKeys(1000);// 设置列举的对象需要带有指定前缀request.setPrefix(prefix);ObjectListing result;do {result = obsClient.listObjects(request);request.setMarker(result.getNextMarker());list.addAll(result.getObjects());} while (result.isTruncated());return list;}/*** 删除单个对象** @param bucketName* @param objectName* @return*/public static DeleteObjectResult deleteObject(String bucketName, String objectName) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.deleteObject(bucketName, objectName);}/*** 复制对象** @param sourceBucketName* @param sourceObjectName* @param destBucketName* @param destObjectName* @return*/public static CopyObjectResult copyObject(String sourceBucketName, String sourceObjectName,String destBucketName, String destObjectName) {return obsClient.copyObject(sourceBucketName, sourceObjectName, destBucketName, destObjectName);}/*** 判断对象是否存在** @param bucketName* @param objectName* @return*/public static boolean doesObjectExist(String bucketName, String objectName) {//重新构建objectNameobjectName = buildObjectName(objectName);return obsClient.doesObjectExist(bucketName, objectName);}/*** 获取文件外链** @param bucketName* @param objectName* @param expires    单位:秒(s)* @return*/public static String getSignedUrl(String bucketName, String objectName, Long expires) {//重新构建objectNameobjectName = buildObjectName(objectName);TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expires);request.setBucketName(bucketName);request.setObjectKey(objectName);TemporarySignatureResponse response = obsClient.createTemporarySignature(request);return response.getSignedUrl();}/*** 获取文件外链-url有效时间默认7天** @param bucketName* @param objectName* @return*/public static String getSignedUrl(String bucketName, String objectName) {return getSignedUrl(bucketName, objectName, expire);}/*** 重新构建objectName** @param objectName*/private static String buildObjectName(String objectName) {if (StringUtils.isBlank(objectName)) {return objectName;}//去除开头的/objectName = objectName.startsWith("/") ? objectName.substring(1) : objectName;//去除?后边的参数objectName = objectName.contains("?") ? objectName.substring(0, objectName.indexOf("?")) : objectName;return objectName;}/*** 传入文件访问外链,返回objectName** @param url* @return*/public static String getObjectNameByUrl(String url) {if (StringUtils.isBlank(url)) {return url;}if (url.contains(getBasisUrl())) {// 去除minio基础路径url = url.replace(getBasisUrl(), "");// 去除?后边的参数url = url.contains("?") ? url.substring(0, url.indexOf("?")) : url;}return url;}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部