package org.springblade.core.oss; import com.obs.services.ObsClient; import com.obs.services.model.ObjectMetadata; import com.obs.services.model.PutObjectResult; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.springblade.core.oss.model.BladeFile; import org.springblade.core.oss.model.OssFile; import org.springblade.core.oss.props.OssProperties; import org.springblade.core.oss.rule.OssRule; import org.springblade.core.tool.utils.StringPool; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.util.List; /** * @author Tonny */ @AllArgsConstructor public class HuaweiObsTemplate implements OssTemplate { private final ObsClient obsClient; private final OssProperties ossProperties; private final OssRule ossRule; @Override public void makeBucket(String bucketName) { if (!bucketExists(bucketName)) { obsClient.createBucket(getBucketName(bucketName)); } } @Override public void removeBucket(String bucketName) { obsClient.deleteBucket(getBucketName(bucketName)); } @Override public boolean bucketExists(String bucketName) { return obsClient.headBucket(getBucketName(bucketName)); } @Override public void copyFile(String bucketName, String fileName, String destBucketName) { obsClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), fileName); } @Override public void copyFile(String bucketName, String fileName, String destBucketName, String destFileName) { obsClient.copyObject(getBucketName(bucketName), fileName, getBucketName(destBucketName), destFileName); } @Override public OssFile statFile(String fileName) { return statFile(ossProperties.getBucketName(), fileName); } @Override public OssFile statFile(String bucketName, String fileName) { ObjectMetadata stat = obsClient.getObjectMetadata(getBucketName(bucketName), fileName); OssFile ossFile = new OssFile(); ossFile.setName(fileName); ossFile.setLink(fileLink(ossFile.getName())); ossFile.setHash(stat.getContentMd5()); ossFile.setLength(stat.getContentLength()); ossFile.setPutTime(stat.getLastModified()); ossFile.setContentType(stat.getContentType()); return ossFile; } @Override public String filePath(String fileName) { return getOssHost(getBucketName()).concat(StringPool.SLASH).concat(fileName); } @Override public String filePath(String bucketName, String fileName) { return getOssHost(getBucketName(bucketName)).concat(StringPool.SLASH).concat(fileName); } @Override public String fileLink(String fileName) { return getOssHost().concat(StringPool.SLASH).concat(fileName); } @Override public String fileLink(String bucketName, String fileName) { return getOssHost(getBucketName(bucketName)).concat(StringPool.SLASH).concat(fileName); } @Override public BladeFile putFile(MultipartFile file) { return putFile(ossProperties.getBucketName(), file.getOriginalFilename(), file); } @Override public BladeFile putFile(String fileName, MultipartFile file) { return putFile(ossProperties.getBucketName(), fileName, file); } @Override @SneakyThrows public BladeFile putFile(String bucketName, String fileName, MultipartFile file) { return putFile(bucketName, fileName, file.getInputStream()); } @Override public BladeFile putFile(String fileName, InputStream stream) { return putFile(ossProperties.getBucketName(), fileName, stream); } @Override public BladeFile putFile(String bucketName, String fileName, InputStream stream) { return put(bucketName, stream, fileName, false); } @Override public void removeFile(String fileName) { obsClient.deleteObject(getBucketName(), fileName); } @Override public void removeFile(String bucketName, String fileName) { obsClient.deleteObject(getBucketName(bucketName), fileName); } @Override public void removeFiles(List fileNames) { fileNames.forEach(this::removeFile); } @Override public void removeFiles(String bucketName, List fileNames) { fileNames.forEach(fileName -> removeFile(getBucketName(bucketName), fileName)); } /** * 上传文件流 * * @param bucketName * @param stream * @param key * @param cover * @return */ @SneakyThrows public BladeFile put(String bucketName, InputStream stream, String key, boolean cover) { makeBucket(bucketName); String originalName = key; key = getFileName(key); // 覆盖上传 if (cover) { obsClient.putObject(getBucketName(bucketName), key, stream); } else { PutObjectResult response = obsClient.putObject(getBucketName(bucketName), key, stream); int retry = 0; int retryCount = 5; while (StringUtils.isEmpty(response.getEtag()) && retry < retryCount) { response = obsClient.putObject(getBucketName(bucketName), key, stream); retry++; } } BladeFile file = new BladeFile(); file.setOriginalName(originalName); file.setName(key); file.setLink(fileLink(bucketName, key)); return file; } /** * 根据规则生成文件名称规则 * * @param originalFilename 原始文件名 * @return string */ private String getFileName(String originalFilename) { return ossRule.fileName(originalFilename); } /** * 根据规则生成存储桶名称规则 单租户 * * @return String */ private String getBucketName() { return getBucketName(ossProperties.getBucketName()); } /** * 根据规则生成存储桶名称规则 多租户 * * @param bucketName 存储桶名称 * @return String */ private String getBucketName(String bucketName) { return ossRule.bucketName(bucketName); } /** * 获取域名 * * @param bucketName 存储桶名称 * @return String */ public String getOssHost(String bucketName) { String prefix = ossProperties.getEndpoint().contains("https://") ? "https://" : "http://"; return prefix + getBucketName(bucketName) + StringPool.DOT + ossProperties.getEndpoint().replaceFirst(prefix, StringPool.EMPTY); } /** * 获取域名 * * @return String */ public String getOssHost() { return getOssHost(ossProperties.getBucketName()); } }