package com.platform.utils;

import com.aliyun.oss.*;
import com.aliyun.oss.model.CompleteMultipartUploadResult;
import com.aliyun.oss.model.UploadFileRequest;
import com.aliyun.oss.model.UploadFileResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * @author abnerhou
 * @date 2020/5/28 10:37
 * @desciption
 */
@Service
@Slf4j
public class OssCheckPointUploadUtil {

    @Value("${oss.point}")
    private String endpoint;

    @Value("${oss.key}")
    private String accessKeyId;

    @Value("${oss.secrey}")
    private String accessKeySecret;

    @Value("${oss.bucket}")
    private String bucketName;
    public void doUploadThenDelete(String uploadFile , String objectName){
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            File localFile = new File(uploadFile);
            log.info("Object name = {}" ,objectName);
            UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, objectName);
            // The local file to upload---it must exist.
            // 指定上传的本地文件。
            uploadFileRequest.setUploadFile(uploadFile);
            log.info("本地文件为:{}" ,uploadFile);
            // Sets the concurrent upload task number to 5.
            uploadFileRequest.setTaskNum(5);
            // Sets the part size to 1MB.1
            uploadFileRequest.setPartSize(1024 * 1024 * 1);
            // 开启断点续传，默认关闭。
            // Enables the checkpoint file. By default it's off.
            uploadFileRequest.setEnableCheckpoint(true);
            // 记录本地分片上传结果的文件。开启断点续传功能时需要设置此参数，上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。默认与待上传的本地文件同目录，为uploadFile.ucp。
            String localCheckFile = localFile.getName() + "_uploadFile.ucp";
            uploadFileRequest.setCheckpointFile(localCheckFile);

            UploadFileResult uploadResult = ossClient.uploadFile(uploadFileRequest);

            CompleteMultipartUploadResult multipartUploadResult =
                    uploadResult.getMultipartUploadResult();
            log.info("断点续传结果:{}", multipartUploadResult.getETag());

        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message: " + oe.getErrorMessage());
            System.out.println("Error Code:       " + oe.getErrorCode());
            System.out.println("Request ID:      " + oe.getRequestId());
            System.out.println("Host ID:           " + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message: " + ce.getMessage());
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
            FileUtils.deleteFile(uploadFile);
            log.info("关闭oss client，并且本地删除文件");
        }
    }

    public void upload2(String filePath, String key1) {
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                log.error("要上传的文件不存在：" + filePath);
            }
            ossClient.putObject(bucketName, key1, file);
        } catch (Exception e) {
            log.error(e.toString() + filePath);
        }
    }
}
