All Downloads are FREE. Search and download functionalities are using the official Maven repository.

love.keeping.starter.web.components.upload.handler.impl.CosUploadHandler Maven / Gradle / Ivy

The newest version!
package love.keeping.starter.web.components.upload.handler.impl;

import love.keeping.starter.common.constants.StringPool;
import love.keeping.starter.common.exceptions.impl.DefaultSysException;
import love.keeping.starter.common.utils.Assert;
import love.keeping.starter.common.utils.StringUtil;
import love.keeping.starter.web.components.upload.handler.UploadHandler;
import love.keeping.starter.web.service.SysParameterService;
import love.keeping.starter.web.utils.JsonUtil;
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.http.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import java.io.InputStream;
import java.util.List;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

@Slf4j
public class CosUploadHandler implements UploadHandler {

  @Autowired
  private SysParameterService sysParameterService;

  @Override
  public String getType() {
    return "COS";
  }

  @Override
  public String upload(InputStream is, List locations, String fileName) {
    String configStr = sysParameterService.findRequiredByKey("upload.cos.config");
    CosConfig config = JsonUtil.parseObject(configStr, CosConfig.class);

    Assert.notBlank(config.getCustomUrl());
    Assert.notBlank(config.getRegion());
    Assert.notBlank(config.getBucketName());
    Assert.notBlank(config.getSecretId());
    Assert.notBlank(config.getSecretKey());

    String objectName = StringUtil.join("/", locations) + fileName;

    TransferManager transferManager = null;
    try {
      transferManager = createTransferManager(config);

      PutObjectRequest request = new PutObjectRequest(config.getBucketName(), objectName, is,
          new ObjectMetadata());
      Upload upload = transferManager.upload(request);
      upload.waitForUploadResult();

      return config.getCustomUrl() + (config.getCustomUrl().endsWith("/") ? StringPool.EMPTY_STR
          : "/") + objectName;
    } catch (InterruptedException e) {
      log.error(e.getMessage(), e);
      throw new DefaultSysException(e.getMessage());
    } finally {
      if (transferManager != null) {
        transferManager.shutdownNow(true);
      }
    }
  }

  private TransferManager createTransferManager(CosConfig config) {

    COSClient cosClient = createCosClient(config);

    TransferManager transferManager = new TransferManager(cosClient);

    return transferManager;
  }

  private COSClient createCosClient(CosConfig config) {

    String secretId = config.getSecretId();
    String secretKey = config.getSecretKey();
    COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

    ClientConfig clientConfig = new ClientConfig();
    clientConfig.setRegion(new Region(config.getRegion()));

    clientConfig.setHttpProtocol(HttpProtocol.https);

    // 设置 socket 读取超时,默认 30s
    clientConfig.setSocketTimeout(30 * 1000);
    // 设置建立连接超时,默认 30s
    clientConfig.setConnectionTimeout(30 * 1000);

    return new COSClient(cred, clientConfig);
  }

  @Data
  public static class CosConfig {

    private String customUrl;

    private String region;

    private String secretId;

    private String secretKey;

    private String bucketName;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy