package cn.com.qmth.stmms.ms.commons.utils;

import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CopyObjectResult;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Description: oss工具
 * @Param:
 * @return:
 * @Author: wangliang
 * @Date: 2020/4/4
 */
@Component
public class OssUtil {

    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(OssUtil.class);

    @Resource
    AliYunOssConfig aliYunOssConfig;

    /**
     * oss上传文件
     *
     * @param dirName
     * @param inputStream
     */
    public void ossUpload(String dirName, InputStream inputStream) {
//        LOGGER.info("ossUpload is come in");
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = aliYunOssConfig.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = aliYunOssConfig.getAccessKeyId();
        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
        String bucketName = aliYunOssConfig.getBucket();
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        String objectName = dirName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（objectName）。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
        PutObjectResult por = ossClient.putObject(putObjectRequest);
        // 关闭OSSClient。
        ossClient.shutdown();
        LOGGER.info("objectName:{},requestid:{}", objectName, por.getRequestId());
    }

    /**
     * oss copy
     *
     * @param dirName
     * @param dirNewName
     */
    public void ossCopy(String dirName, String dirNewName) {
        LOGGER.info("ossCopy is come in");
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = aliYunOssConfig.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = aliYunOssConfig.getAccessKeyId();
        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
        String sourceBucketName = aliYunOssConfig.getBucket();
        String sourceObjectName = dirName;
        String destinationBucketName = aliYunOssConfig.getBucket();
        String destinationObjectName = dirNewName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 拷贝文件。
        CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
        LOGGER.info("ETag:{},LastModified:{}", result.getETag(), result.getLastModified());
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 从oss上下载文件到本地
     *
     * @param dirName
     * @param localPath
     * @throws IOException
     */
    public File ossDownload(String dirName, String localPath) throws IOException {
        LOGGER.info("ossDownload is come in");
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = aliYunOssConfig.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = aliYunOssConfig.getAccessKeyId();
        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
        String bucketName = aliYunOssConfig.getBucket();
        // <yourObjectName>从OSS下载文件时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        String objectName = dirName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖，不存在则新建。
        File localFile = new File(localPath);
        if (!localFile.getParentFile().exists()) {
            localFile.getParentFile().mkdirs();
        }
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), localFile);
        // 关闭OSSClient。
        ossClient.shutdown();
        return localFile;
    }
}
