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 multiFileUpload(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 streamUpload(FileInputStream 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 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 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()); } } } }