package cn.lili.modules.file.plugin.impl; import cn.lili.common.enums.ResultCode; import cn.lili.common.exception.ServiceException; import cn.lili.modules.file.entity.enums.OssEnum; import cn.lili.modules.file.plugin.FilePlugin; import cn.lili.modules.system.entity.dto.OssSetting; 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.exception.CosClientException; import com.qcloud.cos.exception.CosServiceException; import com.qcloud.cos.http.HttpProtocol; import com.qcloud.cos.model.DeleteObjectsRequest; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.region.Region; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * 腾讯cos 文件操作 * * @author Bulbasaur */ @Slf4j public class TencentFilePlugin implements FilePlugin { private OssSetting ossSetting; public TencentFilePlugin(OssSetting ossSetting) { this.ossSetting = ossSetting; } @Override public OssEnum pluginName() { return OssEnum.TENCENT_COS; } /** * 获取oss client * * @return */ private COSClient getCOSClient() { // 1 初始化用户身份信息(secretId, secretKey)。 COSCredentials cred = new BasicCOSCredentials(ossSetting.getTencentCOSSecretId(), ossSetting.getTencentCOSSecretKey()); // 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224 ClientConfig clientConfig = new ClientConfig(new Region(ossSetting.getTencentCOSRegion())); // 这里建议设置使用 https 协议 clientConfig.setHttpProtocol(HttpProtocol.https); // 3 生成 cos 客户端。 return new COSClient(cred, clientConfig); } /** * 获取配置前缀 * * @return */ private String getUrlPrefix() { return "https://" + ossSetting.getTencentCOSBucket() + ".cos." + ossSetting.getTencentCOSRegion() + ".myqcloud.com/"; } @Override public String pathUpload(String filePath, String key) { COSClient cosClient = getCOSClient(); try { cosClient.putObject(ossSetting.getTencentCOSBucket(), key, new File(filePath)); } catch (CosServiceException oe) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } catch (CosClientException ce) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } finally { cosClient.shutdown(); } return getUrlPrefix() + key; } @Override public String inputStreamUpload(InputStream inputStream, String key) { COSClient cosClient = getCOSClient(); try { ObjectMetadata meta = new ObjectMetadata(); meta.setContentType("image/jpg"); cosClient.putObject(ossSetting.getTencentCOSBucket(), key, inputStream, meta); } catch (CosServiceException oe) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } catch (CosClientException ce) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } finally { cosClient.shutdown(); } return getUrlPrefix() + key; } @Override public void deleteFile(List keys) { COSClient cosClient = getCOSClient(); try { List delObjects = new ArrayList<>(); for (String key : keys) { delObjects.add(new DeleteObjectsRequest.KeyVersion(key)); } cosClient.deleteObjects(new DeleteObjectsRequest(ossSetting.getTencentCOSBucket()).withKeys(delObjects)); } catch (CosServiceException oe) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } catch (CosClientException ce) { throw new ServiceException(ResultCode.OSS_EXCEPTION_ERROR); } finally { cosClient.shutdown(); } } }