package com.dobbinsoft.fw.support.storage; import com.dobbinsoft.fw.support.properties.FwObjectStorageProperties; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.*; import com.qcloud.cos.region.Region; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import java.util.Date; /** * ClassName: QCloudStorageClient * Description: 腾讯云对象存储客户端 * * @author: e-weichaozheng * @date: 2021-03-17 */ public class QCloudStorageClient implements StorageClient, InitializingBean { @Autowired private FwObjectStorageProperties properties; private COSClient cosClient; @Override public void afterPropertiesSet() throws Exception { COSCredentials cred = new BasicCOSCredentials(properties.getQcloudSecretId(), properties.getQcloudSecretKey()); // 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224 // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。 Region region = new Region(properties.getQcloudRegion()); ClientConfig clientConfig = new ClientConfig(region); this.cosClient = new COSClient(cred, clientConfig); } @Override public StorageResult save(StorageRequest request) { ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(request.getSize()); objectMetadata.setContentType(request.getContentType()); PutObjectRequest putObjectRequest = new PutObjectRequest( properties.getQcloudBucket(), request.getPath() + "/" + request.getFilename(), request.getIs(), objectMetadata); cosClient.putObject(putObjectRequest); StorageResult result = new StorageResult(); result.setSuc(true); result.setUrl(properties.getQcloudBaseUrl() + "/" + request.getPath() + "/" + request.getFilename()); return result; } @Override public StoragePrivateResult savePrivate(StorageRequest request) { ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(request.getSize()); objectMetadata.setContentType(request.getContentType()); PutObjectRequest putObjectRequest = new PutObjectRequest( properties.getQcloudBucket(), request.getPath() + "/" + request.getFilename(), request.getIs(), objectMetadata); cosClient.putObject(putObjectRequest); String key = request.getPath() + "/" + request.getFilename(); cosClient.setObjectAcl(this.properties.getQcloudBucket(), key, CannedAccessControlList.Private); StoragePrivateResult result = new StoragePrivateResult(); result.setSuc(true); result.setKey(key); result.setUrl(this.getPrivateUrl(key, 120)); return result; } @Override public boolean delete(String url) { int index = url.indexOf("/", 5); String key = url.substring(index); cosClient.deleteObject(properties.getQcloudBucket(), key); return true; } @Override public boolean deletePrivate(String key) { cosClient.deleteObject(properties.getQcloudBucket(), key); return true; } @Override public String getPrivateUrl(String key, Integer expireSec) { return cosClient.generatePresignedUrl(properties.getQcloudBucket(), key, new Date(System.currentTimeMillis() + (1000L * expireSec))).toString(); } @Override public String getKeyFormUrl(String url) { if (url.startsWith("http")) { url = url.replace("http://", "").replace("https://", ""); int index = url.indexOf("/"); String substring = url.substring(index + 1); int endIndex = substring.indexOf("?"); if (endIndex > 0) { return substring.substring(0, endIndex); } else { return substring; } } else { return url; } } }