Aliyun工具类

package com.firefly.performance.core.common;

import com.alibaba.fastjson.JSON;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.DeleteObjectsResult;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.firefly.performance.api.enums.oss.TemporaryAccessTokenVO;
import com.firefly.performance.core.entity.auxiliary.AnnexFile;
import com.firefly.performance.core.utils.Assert;
import com.firefly.performance.core.utils.BaseException;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


@Slf4j
@Component
@RefreshScope
public class AliyunOSS {


    private static String springProfilesActive;

    private static Integer accessTime;

    @Value("${spring.profiles.active}")
    public void setSpringProfilesActive(String springProfilesActive) {
        AliyunOSS.springProfilesActive = springProfilesActive;
    }

    public static Integer getAccessTime() {
        return accessTime;
    }

    @Value("${oss.access.time}")
    public void setAccessTime(Integer accessTime) {
        AliyunOSS.accessTime = accessTime;
    }

    //正式
    private static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
    private static final String END_POINT_STS_FORMAL = "sts.cn-shanghai.aliyuncs.com";
    private static final String ACCESS_KEY_ID_FORMAL = "LTAI4G2ASqmcugTXazk6nTAL";
    private static final String ACCESS_KEY_SECRET_FORMAL = "AdMItHW9uEa2Rl4rVhJlTqxpoproI0";
    private static final String ROLE_ARN = "acs:ram::1446505179830577:role/aliyunosstokengeneratorrole";
    private static final String ROLE_SESSION_NAME = "external-username";
    private static final String BUCKET_NAME = "hfmpaas";
    private static final String M_PAAS_APP_ID = "ONEXAA9E451231640";
    private static final String WORK_SPACE_ID = "default";
    //文件转码
    //地域id
    private static final String MPS_REGION_ID = "cn-shanghai";
    // RAM账号的AccessKey ID
    private static final String ACCESS_KEY_ID = "LTAI4G4SjvSoGep2rAhMgwaq";
    // RAM账号Access Key Secret
    private static final String ACCESS_KEY_SECRET = "UW039YEQRuyO9CjoGLP0VA0ZMafF16";
    private static final String OSS_LOCATION = "oss-cn-shanghai";
    //管道id
    private static final String PIPELINE_ID = "4faa3fc58df949579f00bb6839bd5ff7";

    //任务系统获取token
    private static final String CRM_ACCESS_KEY_ID = "LTAI5tBr2TneFkWTYTjNB4SG";
    private static final String CRM_ACCESS_KEY_SECRET = "re06VHDJW8hifj6ZMmZYBLWvy2xfDc";
    private static final String CRM_ROLE_ARN = "acs:ram::1499450746592740:role/aliyunosstokengeneratorrole";
    private static final String CRM_BUCKET_NAME = "rh-firefly";


    /**
     * 阿里云任务系统获取token
     *
     * @return
     */
    public static TemporaryAccessTokenVO taskGetToken() {
        log.info("开始获取临时访问凭证");
        TemporaryAccessTokenVO tokenVO = null;
        try {

            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", END_POINT_STS_FORMAL);
            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("", ACCESS_KEY_ID_FORMAL, ACCESS_KEY_SECRET_FORMAL);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setMethod(MethodType.POST);
            request.setRoleArn(ROLE_ARN);
            request.setRoleSessionName(ROLE_SESSION_NAME);
            // 若policy为空,则用户将获得该角色下所有权限
            request.setPolicy(null);
            // 设置凭证有效时间
            request.setDurationSeconds(Long.valueOf(accessTime));
            final AssumeRoleResponse response = client.getAcsResponse(request);
            Assert.fail(response == null, "STS获取临时访问凭证响应为空!");
            tokenVO = new TemporaryAccessTokenVO();
            tokenVO.setKeyId(response.getCredentials().getAccessKeyId());
            tokenVO.setKeySecret(response.getCredentials().getAccessKeySecret());
            tokenVO.setSecurityToken(response.getCredentials().getSecurityToken());
            log.info("结束获取临时访问凭证:{}", JSON.toJSONString(tokenVO));
            return tokenVO;
        } catch (ClientException e) {
            log.error("异常原因:{}",e);
        }
        return tokenVO;
    }

    /**
     * 阿里云任务系统获取token - 蜂鸟桶
     *
     * @return
     */
    public static TemporaryAccessTokenVO fnTaskGetToken() {
        log.info("开始获取fn临时访问凭证");
        TemporaryAccessTokenVO tokenVO = null;
        try {
            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", END_POINT_STS_FORMAL);
            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("", CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setMethod(MethodType.POST);
            request.setRoleArn(CRM_ROLE_ARN);
            request.setRoleSessionName(ROLE_SESSION_NAME);
            // 若policy为空,则用户将获得该角色下所有权限
            request.setPolicy(null);
            // 设置凭证有效时间
            request.setDurationSeconds(Long.valueOf(accessTime));
            final AssumeRoleResponse response = client.getAcsResponse(request);
            Assert.fail(response == null, "STS获取临时访问凭证响应为空!");
            tokenVO = new TemporaryAccessTokenVO();
            tokenVO.setKeyId(response.getCredentials().getAccessKeyId());
            tokenVO.setKeySecret(response.getCredentials().getAccessKeySecret());
            tokenVO.setSecurityToken(response.getCredentials().getSecurityToken());
            log.info("结束获取fn临时访问凭证:{}", JSON.toJSONString(tokenVO));
            return tokenVO;
        } catch (ClientException e) {
            log.error("异常原因:{}",e);
        }
        return tokenVO;
    }

    /**
     * sts上传文件
     */
    public static String stsUploadFile(String keyId, String keySecret, String securityToken, MultipartFile file) {
        // 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
        // 创建OSSClient实例。注意,这里使用到了上一步生成的临时访问凭证(STS访问凭证)。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, keyId, keySecret, securityToken);
//        String type = FileTypeEnum.VIDEO.getType().equals(fileType) ? "video/" : "test/picture/";
        boolean sign = false;
        try {
            // 创建PutObjectRequest对象。
            InputStream stream = file.getInputStream();
            //判断文件类型
            //PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, type + file.getOriginalFilename(), stream);
            PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, file.getOriginalFilename(), stream);

            // 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
            // ObjectMetadata metadata = new ObjectMetadata();
            // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
            // metadata.setObjectAcl(CannedAccessControlList.Private);
            // putObjectRequest.setMetadata(metadata);

            // 上传文件。
            ossClient.putObject(putObjectRequest);
        } catch (Exception e) {
            sign = true;
            log.error("异常原因:{}",e);
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
        Assert.fail(sign, "文件上传失败!");
        return file.getOriginalFilename();
    }

    /**
     * oss删除文件
     *
     * @param filePath
     */
    public static void delFile(String filePath, String coverPicture, String fluencyFilePath, String normFilePath, String highDefinitionFilePath) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID_FORMAL, ACCESS_KEY_SECRET_FORMAL);

        // 删除文件或目录。如果要删除目录,目录必须为空。
        //删除单个
        /**
         * String type = FileTypeEnum.VIDEO.getType().equals(fileType) ? "video/" : "test/picture/";
         * ossClient.deleteObject(BUCKETNAME, filePath);
         * ossClient.deleteObject(BUCKETNAME, coverPicture);
         */
        //删除多个
        List<String> keys = new ArrayList<>();
        keys.add(filePath);
        if (coverPicture != null && !"".equals(coverPicture)) {
            keys.add(coverPicture);
        }
        if (fluencyFilePath != null) {
            keys.add(fluencyFilePath);
        }
        if (normFilePath != null) {
            keys.add(normFilePath);
        }
        if (highDefinitionFilePath != null) {
            keys.add(highDefinitionFilePath);
        }
        DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(BUCKET_NAME).withKeys(keys));
        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * oss删除文件
     *
     * @param filePath
     */
    public static void delFileByCrmFilePath(String filePath) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        // 删除文件或目录。如果要删除目录,目录必须为空。
        //删除单个
        ossClient.deleteObject(CRM_BUCKET_NAME, filePath);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 获取文件临时访问url
     *
     * @param fileName
     * @return
     */
    public static String getTemporaryUrl(String fileName) {
        TemporaryAccessTokenVO temporaryAccessToken = taskGetToken();
        if (temporaryAccessToken==null){
            return null;
        }
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build("https://" + ENDPOINT, temporaryAccessToken.getKeyId(), temporaryAccessToken.getKeySecret(), temporaryAccessToken.getSecurityToken());

        // 设置URL过期时间为10分钟。
        Date expiration = new Date(System.currentTimeMillis() + 600 * 1000);
        // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(BUCKET_NAME, fileName, expiration);
        log.info("生成临时url:{}", JSON.toJSONString(url));
        // 关闭OSSClient。
        ossClient.shutdown();
        return url.toString();
    }

    // 使用签名URL进行临时授权
    public static URL accessByStsGetDemo() {
        /****     获取临时访问凭证 START   ****/
        //构建一个阿里云客户端,用于发起请求。
        //设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
        DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        //构造请求,设置参数。
        AssumeRoleRequest request = new AssumeRoleRequest();
        request.setRegionId(MPS_REGION_ID);
        request.setRoleArn(CRM_ROLE_ARN);
        request.setRoleSessionName(ROLE_SESSION_NAME);

        //发起请求,并得到响应。
        AssumeRoleResponse response = null;
        try {
            response = client.getAcsResponse(request);
            log.info(new Gson().toJson(response));
        } catch (ClientException e) {
            log.info("ErrCode:{}", e.getErrCode());
            log.info("ErrMsg:{}", e.getErrMsg());
            log.info("RequestId:{}", e.getRequestId());
        } catch (Exception ex) {
            log.error("异常原因:{}",ex);
        }
        /****     获取临时访问凭证 START   ****/
        if (response==null||response.getCredentials()==null){
            return null;
        }

        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
        String accessKeyId = response.getCredentials().getAccessKeyId();
        String accessKeySecret = response.getCredentials().getAccessKeySecret();
        // 从STS服务获取的安全令牌(SecurityToken)。
        String securityToken = response.getCredentials().getSecurityToken();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = CRM_BUCKET_NAME;
        // 填写Object完整路径,例如exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "upms/prod/2022/07/25/霍冬琴.png";

        // 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);

        URL url = null;
        try {
            // 设置签名URL过期时间,单位为毫秒。
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
            // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
            url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
            log.info("{}",url);
        } catch (OSSException oe) {
            log.info("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            log.info("Error Message:{}", oe.getErrorMessage());
            log.info("Error Code:{}", oe.getErrorCode());
            log.info("Request ID:{}", oe.getRequestId());
            log.info("Host ID:{}", oe.getHostId());
        } catch (Exception ce) {
            log.info("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.");
            log.info("Error Message:{}", ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return url;
    }

    /**
     * 获取单个文件的URL(私有Object)
     *
     * @param endpoint   地址
     * @param bucketName 桶名
     * @param objectName 文件地址
     */
    public static String genOssFileTempUrlByPrivate(String endpoint, String bucketName, String objectName) {
        // 接口文档地址:https://help.aliyun.com/document_detail/39607.htm?spm=a2c4g.11186623.0.0.11a62cb76fROaf#concept-39607-zh
        // 私有Object

        /****     获取临时访问凭证 START   ****/
        //构建一个阿里云客户端,用于发起请求。
        //设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
        DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        //构造请求,设置参数。
        AssumeRoleRequest request = new AssumeRoleRequest();
        request.setRegionId(MPS_REGION_ID);
        request.setRoleArn(CRM_ROLE_ARN);
        request.setRoleSessionName(ROLE_SESSION_NAME);

        //发起请求,并得到响应。
        AssumeRoleResponse response = null;
        try {
            response = client.getAcsResponse(request);
            log.info(new Gson().toJson(response));
        } catch (ClientException e) {
            log.info("ErrCode:{}", e.getErrCode());
            log.info("ErrMsg:{}", e.getErrMsg());
            log.info("RequestId:{}", e.getRequestId());
        } catch (Exception ex) {
            log.error("异常原因:{}",ex);
        }
        /****     获取临时访问凭证 START   ****/

        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String fullEndpoint = "https://" + endpoint;
        if (response==null||response.getCredentials()==null){
            return null;
        }
        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
        String accessKeyId = response.getCredentials().getAccessKeyId();
        String accessKeySecret = response.getCredentials().getAccessKeySecret();
        // 从STS服务获取的安全令牌(SecurityToken)。
        String securityToken = response.getCredentials().getSecurityToken();

        // 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(fullEndpoint, accessKeyId, accessKeySecret, securityToken);
        URL url = null;
        try {
            // 设置签名URL过期时间,单位为毫秒。
            Date expiration = new Date(System.currentTimeMillis()+ Long.valueOf(accessTime));
            // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
            url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
            log.info("{}",JSON.toJSONString(url));
        } catch (OSSException oe) {
            log.info("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            log.info("Error Message:{}", oe.getErrorMessage());
            log.info("Error Code:{}", oe.getErrorCode());
            log.info("Request ID:{}", oe.getRequestId());
            log.info("Host ID:{}", oe.getHostId());
        } catch (Exception ce) {
            log.info("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.");
            log.info("Error Message:{}", ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return Objects.isNull(url) ? "" : url.toString();
    }

    // 上传网络流
    public static void uploadFileByNetworkStream(String tempNewOssUrl, String ossPath, String endPoint, String bucketName) {
        // 接口文档地址:https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.0.0.10d2567aA9Cq38
        // 上传网络流
        /*****      上传网络流 START      *****/
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String fullEndpoint = "https://" + endPoint;
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = CRM_ACCESS_KEY_ID;
        String accessKeySecret = CRM_ACCESS_KEY_SECRET;
        // 填写Bucket名称,例如examplebucket。
//        String bucketName = CRM_BUCKETNAME;
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
//        String ossPath = "performance/35/signatureCommunication/宋杨_101_20221018.jpeg";

        // 填写网络流地址。
        // String tempNewOSSUrl = "https://rh-firefly.oss-cn-shanghai.aliyuncs.com/upms/prod/2022/08/01/%E5%AE%8B%E6%9D%A8.jpeg?Expires=1666061063&OSSAccessKeyId=STS.NTNN7eGRawLU2p3DioGThheki&Signature=ksyby4FWUu0azo9U2WqE2NK6LqE%3D&security-token=CAISiwJ1q6Ft5B2yfSjIr5f7BY3Rqo1AwI6%2BMFaCoGk6S9tEh6DAizz2IH5LdXhuBuEXsf8zmGpZ6Pkalrh%2BW4NIX0rNaY5t9ZlN9wqkbtJxdU0aO%2BRW5qe%2BEE2%2FVjTZvqaLEcibIfrZfvCyESOm8gZ43br9cxi7QlWhKufnoJV7b9MRLGLaBHg8c7UwHAZ5r9IAPnb8LOukNgWQ4lDdF011oAFx%2BwgdgOadupTAu0uC0QWllrFI9t6ufsCeApMybMslYbCcx%2Fdrc6fN6ilU5iVR%2Bb1%2B5K4%2BommY74DDXAgAvE7ab7CFrII3NnxwYqkrBqhDt%2BPgkv51vOPekYntwgpKJ%2FtSVynPyFMnAEJbpIkagAFhEVZk7e96VlZ8Goug82taEGxoQ1QGiU0VTJmES6Ho4qcs%2FBQAEz3NvKolvsLbdJa%2F02%2Fu9LC4nD8Kb4nXnFOOFq6dWSqriXmi3WbsTJQSsae9tGVd437kHvaZuNND6IcqHPNXvJLWlYfJcYHw8%2FBlqJhTzTGybnEvt2qPl4TV1A%3D%3D";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(fullEndpoint, accessKeyId, accessKeySecret);

        try {
            InputStream inputStream = new URL(tempNewOssUrl).openStream();
            // 创建PutObject请求。
            ossClient.putObject(bucketName, ossPath, inputStream);
        } catch (OSSException oe) {
            log.info("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            log.info("Error Message:{}", oe.getErrorMessage());
            log.info("Error Code:{}", oe.getErrorCode());
            log.info("Request ID:{}", oe.getRequestId());
            log.info("Host ID:{}", oe.getHostId());
        } catch (Exception ce) {
            log.info("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.");
            log.info("Error Message:{}", ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        /*****      上传网络流 End      *****/
    }

    public static String getSignatureCommunicationUrl(String employeeName,Long sheetId,String suffix) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String newFilename = employeeName + "_" + sheetId + "_" + sdf.format(new Date()) + suffix;
        return String.format("%s/%s/%s/%s", "performance", springProfilesActive, "signatureCommunication", newFilename);
    }

    /**
     * 字符替换
     *
     * @param str 字符串
     * @return 替换后的字符串
     */
    public static String replaceEnter(String str) {
        String reg = "[\n-\r]";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        return m.replaceAll("");
    }


    // 授权访问:使用STS进行临时授权
    public static void accessByStsDemo() {
//        String ossURL = "http://rh-fengniao.oss-cn-shanghai.aliyuncs.com/upms/prod/2022/07/25/穆相如.png";

        /****     获取临时访问凭证 START   ****/
        //构建一个阿里云客户端,用于发起请求。
        //设置调用者(RAM用户或RAM角色)的AccessKey ID和AccessKey Secret。
        DefaultProfile profile = DefaultProfile.getProfile(MPS_REGION_ID, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        IAcsClient client = new DefaultAcsClient(profile);

        //构造请求,设置参数。
        AssumeRoleRequest request = new AssumeRoleRequest();
        request.setRegionId(MPS_REGION_ID);
        request.setRoleArn(CRM_ROLE_ARN);
        request.setRoleSessionName(ROLE_SESSION_NAME);

        //发起请求,并得到响应。
        AssumeRoleResponse response = null;
        try {
            response = client.getAcsResponse(request);
            log.info("{}", new Gson().toJson(response));
        } catch (ClientException e) {
            log.info("ErrCode:{}", e.getErrCode());
            log.info("ErrMsg:{}", e.getErrMsg());
            log.info("RequestId:{}", e.getRequestId());
        } catch (Exception ex) {
            log.error("异常原因:{}",ex);
        }
        /****     获取临时访问凭证 START   ****/

        if (response == null || response.getCredentials() == null) {
            return;
        }
        /****   使用STS临时授权上传和下载文件  START  ****/
        String endpoint = ENDPOINT;
        // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
        String accessKeyId = response.getCredentials().getAccessKeyId();
        String accessKeySecret = response.getCredentials().getAccessKeySecret();

        // 从STS服务获取的安全令牌(SecurityToken)。
        String securityToken = response.getCredentials().getSecurityToken();

        // 从STS服务获取临时访问凭证后,您可以通过临时访问密钥和安全令牌生成OSSClient。
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);
        String pathName = "D:\\tmp\\何依兰.png";
        try {
            // 执行OSS相关操作,例如上传、下载文件等。
            // 上传文件,此处以上传本地文件为例介绍。
            // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
            //PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(pathName));
            //ossClient.putObject(putObjectRequest);

            // 下载OSS文件到本地文件。如果指定的本地文件存在则覆盖,不存在则新建。
            // 如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
            ossClient.getObject(new GetObjectRequest(CRM_BUCKET_NAME, "upms/prod/2022/07/25/于行果.png"), new File(pathName));

            // 流式下载
//            OSSObject ossObject = ossClient.getObject(bucketName, "upms/prod/2022/07/25/何依兰.png");
//            BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
//            while (true) {
//                String line = reader.readLine();
//                if (line == null) break;
//                log.info("\n" + line);
//            }
//            String ss = new String(Base64.getEncoder().encode(reader.), Charsets.toCharset("utf-8"));
//            log.info("{}",ss);
            // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            //reader.close();
            // ossObject对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            //ossObject.close();

        } catch (OSSException oe) {
            log.info("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            log.info("Error Message:{}", oe.getErrorMessage());
            log.info("Error Code:{}", oe.getErrorCode());
            log.info("Request ID:{}", oe.getRequestId());
            log.info("Host ID:{}", oe.getHostId());
        } catch (Exception ioe) {
            log.error("异常原因:{}",ioe);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        /****   使用STS临时授权上传和下载文件  END  ****/
    }

    /**
     * 上传流
     *
     * @param objectPath 文件路径
     * @param file       web端上传的文件
     * @return 上传结果
     */
    public static Boolean upload(String objectPath, MultipartFile file) {

        OSS ossClient = null;
        boolean uploadResult = false;
        try {
            // 创建OSSClient实例。
            ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
            // 判断oss是否已经有路径的文件
            boolean exist = ossClient.doesObjectExist(CRM_BUCKET_NAME, objectPath);
            // coverOnExist == false 时,如果已存在(objectPath&&bucketName都相同),则抛出异常
            Assert.fail(exist, "oss已存在同名文件!");
            // 设置下载附件时附件的文件名称
            String originalFilename = file.getOriginalFilename();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentDisposition(String.format("attachment;filename=%s", originalFilename));
            PutObjectResult putObjectResult = ossClient.putObject(CRM_BUCKET_NAME, objectPath, file.getInputStream(), metadata);
            uploadResult = true;
            // 关闭OSSClient。
        } catch (IOException e) {
            log.error("上传文件异常:", e);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return uploadResult;
    }

    /**
     * 获取oss的原始url
     *
     * @param objectPath oss文件路径
     * @return oss原始的url
     */
    public static URL getDownloadUrl(String objectPath) {
        OSS ossClient = null;
        URL urlResult = null;
        try {
            // 构造ossClient
            ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
            // 构造失效时间
            Calendar current = Calendar.getInstance();
            current.add(Calendar.MINUTE, 5);
            Date expiraAt = current.getTime();
            urlResult = ossClient.generatePresignedUrl(CRM_BUCKET_NAME, objectPath, expiraAt);
        } catch (Exception e) {
            log.error("生成下载url时失败", e);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return urlResult;
    }

    public static String uploadFile(MultipartFile multipartFile, String filePath) {
        OSS ossClient = (new OSSClientBuilder()).build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        String originalFilename = null;
        try {
            originalFilename = URLEncoder.encode(multipartFile.getOriginalFilename(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            log.error("异常原因:{}",e);
        }
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String ossPath = String.format("%s/%s/%s/%s-%s", "performance", springProfilesActive, filePath, uuid, originalFilename);
        boolean sign = false;
        try {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentDisposition(String.format("attachment;filename=%s", originalFilename));
            ossClient.putObject(CRM_BUCKET_NAME, ossPath, multipartFile.getInputStream(), metadata);
        } catch (Exception var11) {
            sign = true;
            log.info("文件上传失败:{}", var11.getMessage());
        } finally {
            ossClient.shutdown();
        }

        Assert.fail(sign, "文件" + originalFilename + "上传失败!");
        return ossPath;
    }

    public static String uploadByInputStream(String filePath, String fileName, InputStream inputStream) {
        OSS ossClient = (new OSSClientBuilder()).build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String ossPath = String.format("%s/%s/%s/%s-%s", "performance", springProfilesActive, filePath, uuid, fileName);
        boolean sign = false;
        try {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentDisposition(String.format("attachment;filename=%s", fileName));
            ossClient.putObject(CRM_BUCKET_NAME, ossPath, inputStream, metadata);
        } catch (Exception var11) {
            sign = true;
            log.info("文件上传失败:{}", var11.getMessage());
        } finally {
            ossClient.shutdown();
        }
        Assert.fail(sign, "文件" + fileName + "上传失败!");
        return ossPath;
    }

    /**
     * 批量下载oss 文件 并打成zip 包 返回到response中
     *
     * @param annexFiles  附件集合
     * @param zipFileName 压缩包文件名
     * @param response    HttpServletResponse
     */
    public static void batchDownLoadOssFile(List<AnnexFile> annexFiles, String zipFileName, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + zipFileName);
        BufferedInputStream bis = null;
        try(ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());) {
            OSS ossClient = new OSSClientBuilder().build(ENDPOINT, CRM_ACCESS_KEY_ID, CRM_ACCESS_KEY_SECRET);
            int num = 0;
            for (AnnexFile annexFile : annexFiles) {
                OSSObject ossObject = ossClient.getObject(CRM_BUCKET_NAME, annexFile.getPath());
                if (ossObject != null) {
                    InputStream inputStream = ossObject.getObjectContent();
                    String zipFile = num + "_" + annexFile.getFileName();
                    ZipEntry zipEntry = new ZipEntry(zipFile);
                    zos.putNextEntry(zipEntry);
                    int bytesRead = 0;
                    // 向压缩文件中输出数据
                    while ((bytesRead = inputStream.read()) != -1) {
                        zos.write(bytesRead);
                    }
                    inputStream.close();
                    zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
                    ossObject.close();
                }
                num++;
            }
        } catch (Exception e) {
            log.error("异常原因:{}",e);
        } finally {
            try {
                if (null != bis) {
                    bis.close();
                }
                response.getOutputStream().flush();
                response.getOutputStream().close();
            } catch (IOException e) {
                log.error("异常原因:{}",e);
            }
        }
    }

    public static void batchDownLoadOssFile1(List<String> filePathList, String zipFileName, HttpServletResponse
            response) {
        Assert.fail(CollectionUtils.isEmpty(filePathList), "参数不能为空!");
        try {
            response.reset();
            response.setCharacterEncoding("UTF-8");
            // 不同类型的文件对应不同的MIME类型
            response.setContentType("application/x-msdownload");
            // inline在浏览器中直接显示,不提示用户下载
            // attachment弹出对话框,提示用户进行下载保存本地
            // 默认为inline方式
            response.setHeader("Content-Disposition", "attachment;filename=" + zipFileName);
            // --设置成这样可以不用保存在本地,再输出, 通过response流输出,直接输出到客户端浏览器中。
            ZipOutputStream zos = null;
            zos = new ZipOutputStream(response.getOutputStream());
            zipFile(filePathList, zos);
        } catch (IOException e) {
            log.error("异常原因:{}",e);
            throw new BaseException("下载失败!");
        }
    }

    /**
     * 压缩文件
     *
     * @param filePaths 需要压缩的文件路径集合
     * @throws IOException
     */
    private static void zipFile(List<String> filePaths, ZipOutputStream zos) throws IOException {
        //设置读取数据缓存大小
        byte[] buffer = new byte[4096];
        BufferedInputStream bis = null;
        try {
            //循环读取文件路径集合,获取每一个文件的路径
            for (String filePath : filePaths) {
                File inputFile = new File(filePath);
                //判断文件是否存在
                if (inputFile.exists()) {
                    //判断是否属于文件,还是文件夹
                    //创建输入流读取文件
                    bis = new BufferedInputStream(new FileInputStream(inputFile));
                    //将文件写入zip内,即将文件进行打包
                    zos.putNextEntry(new ZipEntry(inputFile.getName()));
                    //写入文件的方法,同上
                    int size = 0;
                    //设置读取数据缓存大小
                    while ((size = bis.read(buffer)) > 0) {
                        zos.write(buffer, 0, size);
                    }
                    //关闭输入输出流
                    zos.closeEntry();
                    bis.close();
                }
            }
        } finally {
            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    log.error("异常原因:{}",e);
                }
            }
            if (null != zos) {
                try {
                    zos.close();
                } catch (IOException e) {
                    log.error("异常原因:{}",e);
                }
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据引用\[1\]中的阿里云短信服务官方文档,您可以通过以下步骤来创建一个阿里云发送短信的工具类: 1. 开通阿里云账号并登录,然后申请一个子权限账户,并授予该账户短信服务管理的权限。 2. 在短信服务控制台中申请签名和模板,具体的规则可以参考审核标准。 3. 根据短信接收对象的不同,选择相应的签名和模板。 4. 调用阿里云短信服务的接口来发送短信。 在编写工具类时,您可以使用引用\[2\]中提供的阿里云短信依赖,即aliyun-java-sdk-core和aliyun-java-sdk-dysmsapi。您可以在您的项目中添加这两个依赖,并按照官方文档提供的示例代码来调用阿里云短信服务的接口。 如果您需要同时向多个不同的手机号码发送不同签名的短信,可以参考引用\[3\]中的文档,该文档提供了相关的参考信息。 请注意,以上是一个简要的概述,具体的实现细节和代码编写需要根据您的具体需求和项目环境进行调整。建议您参考阿里云短信服务的官方文档和示例代码来完成您的工具类的编写。 #### 引用[.reference_title] - *1* *3* [阿里云短信服务工具类](https://blog.csdn.net/qq_40147276/article/details/93724745)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【阿里云】短信服务 无认证 测试版本 附带短信发送工具类](https://blog.csdn.net/SPX113/article/details/125862420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值