249 lines
9.0 KiB
Java
249 lines
9.0 KiB
Java
package com.njcn.huawei.obs.util;
|
||
|
||
import com.njcn.huawei.obs.config.HuaweiObsProperties;
|
||
import com.obs.services.ObsClient;
|
||
import com.obs.services.exception.ObsException;
|
||
import com.obs.services.model.*;
|
||
import lombok.RequiredArgsConstructor;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.stereotype.Component;
|
||
import org.springframework.web.multipart.MultipartFile;
|
||
|
||
import java.io.FileInputStream;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.util.HashMap;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
|
||
/**
|
||
* @author hongawen
|
||
* @version 1.0.0
|
||
* @date 2023年03月01日 14:10
|
||
*/
|
||
@Slf4j
|
||
@Component
|
||
@RequiredArgsConstructor
|
||
public class OBSUtil {
|
||
|
||
private final HuaweiObsProperties huaweiObsProperties;
|
||
|
||
|
||
/**
|
||
* 上传注意事项:文件名不能以 / 开头,
|
||
* 比如错误名称:/comtrade/192.168.1.190/xxxx.dat
|
||
* 正确名称为:comtrade/192.168.1.190/xxxx.dat
|
||
* 上述文件名在上传文件到obs桶中时,会自动创建 comtrade、192.168.1.190两个文件夹
|
||
* 不同的业务功能可以通过文件夹去区分,比如稳态、暂态等报表、波形文件等等
|
||
* 前端form文件上传
|
||
*
|
||
* @author hongawen
|
||
* @date 2023/3/1 20:50
|
||
*/
|
||
public String uploadMultipart(MultipartFile uploadFile, String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
String bucketName = huaweiObsProperties.getObs().getBucket();
|
||
// 判断桶是否存在
|
||
judgeBucket(obsClient, bucketName);
|
||
InputStream inputStream = uploadFile.getInputStream();
|
||
long available = inputStream.available();
|
||
PutObjectRequest request = new PutObjectRequest(bucketName, 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上传失败", e);
|
||
} catch (IOException e) {
|
||
log.error("上传失败", e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
|
||
/***
|
||
* 流式文件上传
|
||
* @author hongawen
|
||
* @date 2023/3/2 10:18
|
||
*/
|
||
public String uploadStream(InputStream inputStream, String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
String bucketName = huaweiObsProperties.getObs().getBucket();
|
||
// 判断桶是否存在
|
||
judgeBucket(obsClient, bucketName);
|
||
long available = inputStream.available();
|
||
PutObjectRequest request = new PutObjectRequest(bucketName, 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上传失败", e);
|
||
} catch (IOException e) {
|
||
log.error("上传失败", e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/***
|
||
* 获取文件上传后的url
|
||
* @author hongawen
|
||
* @date 2023/3/2 11:46
|
||
*/
|
||
public String getFileUrl(String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
// URL有效期,3600秒
|
||
Map<String, String> headers = new HashMap<>();
|
||
headers.put("Content-Type", "application/octet-stream");
|
||
TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.PUT, huaweiObsProperties.getObs().getExpire());
|
||
request.setBucketName(huaweiObsProperties.getObs().getBucket());
|
||
request.setObjectKey(fileName);
|
||
request.setHeaders(headers);
|
||
TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
|
||
return response.getSignedUrl();
|
||
} catch (Exception e) {
|
||
log.error("获取上传地址异常:{}", e.getMessage(), e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/***
|
||
* 判断对象是否存在
|
||
* @author hongawen
|
||
* @date 2023/3/2 13:35
|
||
*/
|
||
public boolean judgeObjectExist(String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
return obsClient.doesObjectExist(huaweiObsProperties.getObs().getBucket(), fileName);
|
||
} catch (Exception e) {
|
||
log.error("获取上传地址异常:{}", e.getMessage(), e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
/***
|
||
* 以流的形式下载文件
|
||
* @author hongawen
|
||
* @date 2023/3/1 20:56
|
||
* @return InputStream
|
||
*/
|
||
public InputStream fileDownload(String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
String bucketName = huaweiObsProperties.getObs().getBucket();
|
||
ObsObject obsObject = huaweiObsProperties.getInstance().getObject(bucketName, fileName);
|
||
return obsObject.getObjectContent();
|
||
} catch (ObsException e) {
|
||
log.error("obs文件下载失败", e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/***
|
||
* 删除指定对象
|
||
* @author hongawen
|
||
* @date 2023/3/1 20:36
|
||
*/
|
||
public boolean delete(String fileName) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
// obs删除
|
||
obsClient.deleteObject(huaweiObsProperties.getObs().getBucket(), fileName);
|
||
} catch (ObsException e) {
|
||
log.error("obs删除保存失败", e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/***
|
||
* 批量删除指定对象
|
||
* @author hongawen
|
||
* @date 2023/3/1 20:36
|
||
*/
|
||
public boolean deleteBatch(List<String> fileNames) {
|
||
ObsClient obsClient = null;
|
||
try {
|
||
obsClient = huaweiObsProperties.getInstance();
|
||
DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(huaweiObsProperties.getObs().getBucket());
|
||
// obs批量删除
|
||
fileNames.forEach(deleteObjectsRequest::addKeyAndVersion);
|
||
obsClient.deleteObjects(deleteObjectsRequest);
|
||
} catch (ObsException e) {
|
||
log.error("obs批量删除保存失败", e);
|
||
} finally {
|
||
huaweiObsProperties.destroy(obsClient);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
/***
|
||
* 暂时未知河北现场的桶是否固定,将多个业务文件存在一个桶内也没问题
|
||
* 判断是否存在桶,不存在则创建通
|
||
* @author hongawen
|
||
* @date 2023/3/2 10:08
|
||
*/
|
||
public void judgeBucket(ObsClient obsClient, String bucketName) {
|
||
boolean exists = obsClient.headBucket(bucketName);
|
||
if (!exists) {
|
||
CreateBucketRequest request = new CreateBucketRequest();
|
||
request.setBucketName(bucketName);
|
||
// 设置桶访问权限为公共读,默认是私有读写
|
||
request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
|
||
// 设置桶的存储类型为归档存储
|
||
request.setBucketStorageClass(StorageClassEnum.COLD);
|
||
// 设置桶区域位置(以区域为华北-北京四为例)
|
||
request.setLocation("cn-east-3");
|
||
// 指定创建多AZ桶,如果不设置,默认创建单AZ桶
|
||
request.setAvailableZone(AvailableZoneEnum.MULTI_AZ);
|
||
// 创建桶
|
||
try {
|
||
// 创建桶成功
|
||
ObsBucket bucket = obsClient.createBucket(request);
|
||
log.info(bucket.getRequestId());
|
||
} catch (ObsException e) {
|
||
// 创建桶失败
|
||
log.info("HTTP Code: " + e.getResponseCode());
|
||
log.info("Error Code:" + e.getErrorCode());
|
||
log.info("Error Message: " + e.getErrorMessage());
|
||
log.info("Request ID:" + e.getErrorRequestId());
|
||
log.info("Host ID:" + e.getErrorHostId());
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|