• 阿里云 oss (二) 生成令牌


    文档:https://help.aliyun.com/document_detail/44075.html

    一,添加依赖

                <!--      oss begin      -->
                <dependency>
                    <groupId>com.aliyun.oss</groupId>
                    <artifactId>aliyun-sdk-oss</artifactId>
                    <version>3.13.0</version>
                </dependency>
                
                <dependency>
                    <groupId>com.aliyun</groupId>
                    <artifactId>dysmsapi20170525</artifactId>
                    <version>2.0.4</version>
                </dependency>
                <!--      oss end      -->

    二,配置文件

    #aliyun oss
    aliyun:
      oss_bucket_map: # Map-> sence : bucket
        advertisement: bucketName
        test: testval
      main_domain: bucketName
      aliyun_sms_sign: 1
      aliyun_sms_templet: 1
      ossEndpointValue: oss-cn-hangzhou.aliyuncs.com
      ossEndpointInner: inner
      ossAccessKeyId: 你的AccessKeyId
      ossAccessKeySecret: 你的AccessKeySecret
      ossStsRegion: region
      ossStsSessionName: session_name
      ossStsExpire: 1000
      ossStsRoleId: 1
      ossStsEndpoint: endpoint
      ossStsAccessKeyId: accessKeyId
      ossStsAccessKeySecret: accessKeySecret

    三,实体层

    AliyunOssAutoSignRequest
     
    import com.fasterxml.jackson.annotation.JsonProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.NoArgsConstructor;
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    /**
     * 获得阿里云oss的文件类型
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @AllArgsConstructor
    @NoArgsConstructor
    public class AliyunOssAutoSignRequest {
        /**
         * 文件场景
         */
        @JsonProperty("file_scene")
        private String fileScene;
        /**
         * 文件名称
         */
        @JsonProperty("file_name")
        private String fileName;
    }
    aliyun的OSS配置实例
     
    import com.alibaba.fastjson.annotation.JSONField;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import lombok.*;
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    /**
     * aliyun的OSS配置实例
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class AliyunOSSConfig {
        /**
         * oss参数:上传链接
         */
        @JSONField(name="host")
        private String host;
        /**
         * oss参数:accessKeyId
         */
        @JSONField(name="access_key_id")
        private String accessKeyId;
        /**
         * oss参数:文件路径
         */
        @JSONField(name="file_path")
        private String filePath;
        /**
         * oss参数:签名
         */
        @JSONField(name="signature")
        private String signature;
        /**
         * oss参数:策略
         */
        @JSONField(name="policy")
        private String policy;
        /**
         * bucket
         */
        @JSONField(name="bucket")
        private String bucket;
        /**
         * 目标文件夹,场景名
         */
        @JSONField(name="folder_name")
        private String folderName;
        /**
         * oss结果:文件完整URL
         */
        @JSONField(name="file_url")
        private String fileUrl;
    }
    aliyun的OSS签名配置实例
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    import lombok.*;
     
    /**
     * aliyun的OSS签名配置实例
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class AliyunOSSSignConfig {
        private String signature;
        private String policy;
        private String folderName;
    }
    aliyun的OSS配置实例
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    import lombok.*;
     
    /**
     * aliyun的OSS配置实例
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class AliyunOSSWriteConfig {
        private String bucket;
        private String targetFileName;
        private String folderName;
    }
    配置文件的实体
     
    import lombok.Data;
    import lombok.Getter;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
     
    import java.util.List;
    import java.util.Map;
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    @Component
    @ConfigurationProperties(prefix = "aliyun")
    @Data
    public class BaseConfig {
        private String mainDomain;
        private String aliyunSmsSign;
        private String aliyunSmsTemplet;
        private Map<String,String> ossBucketMap;
     
        private String ossEndpointValue;
        private String ossEndpointInner;
        private String ossAccessKeyId;
        private String ossAccessKeySecret;
        private String ossStsRegion;
        private String ossStsSessionName;
        private Integer ossStsExpire;
        private String ossStsRoleId;
        private String ossStsEndpoint;
        private String ossStsAccessKeyId;
        private String ossStsAccessKeySecret;
    }
     

    四,Service

     
     
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.common.utils.BinaryUtil;
    import com.aliyun.oss.model.MatchMode;
    import com.aliyun.oss.model.PolicyConditions;
    import com.tenyears.webCommon.config.oss.AliyunOSSSignConfig;
    import com.tenyears.webCommon.config.oss.AliyunOSSWriteConfig;
    import com.tenyears.webCommon.config.oss.BaseConfig;
    import com.tenyears.webCommon.model.message.ResultMessage;
    import com.tenyears.webCommon.service.service.OSSService;
    import org.apache.commons.lang3.StringUtils;
    import org.omg.CORBA.portable.ApplicationException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
     
    import java.nio.charset.StandardCharsets;
    import java.util.Date;
    import java.util.UUID;
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    @Service("ossService")
    public class OSSImpl implements OSSService {
        @Autowired
        BaseConfig configBase;
     
        /**
         * 获取签名
         * @param dir
         * @return
         * @throws Exception
         */
        @Override
        public AliyunOSSSignConfig generateSign(String dir) throws Exception {
            // STS接入地址,例如sts.cn-hangzhou.aliyuncs.com。
            String endpoint = configBase.getOssEndpointValue();
            // 填写步骤1生成的访问密钥AccessKey ID和AccessKey Secret。
            String accessKeyId = configBase.getOssAccessKeyId();
            String accessKeySecret = configBase.getOssAccessKeySecret();
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            try {
                long expireTime = 300;
                long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
                Date expiration = new Date(expireEndTime);
                // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
                PolicyConditions policyConds = new PolicyConditions();
                policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
                policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
                String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
                String encodedPolicy = BinaryUtil.toBase64String(postPolicy.getBytes(StandardCharsets.UTF_8));
                String postSignature = ossClient.calculatePostSignature(postPolicy);
                AliyunOSSSignConfig config = new AliyunOSSSignConfig();
                config.setPolicy(encodedPolicy);
                config.setSignature(postSignature);
                // respMap.put("expire", String.valueOf(expireEndTime / 1000));
                // respMap.put("expire", formatISO8601Date(expiration));
                return config;
            } catch (Throwable t) {
                throw new Exception("oss generateSign " + t.getMessage());
            } finally {
                ossClient.shutdown();
            }
        }
     
        /**
         * 初始化config
         * @param fileSence
         * @param originFileName
         * @return
         * @throws Exception
         */
        @Override
        public AliyunOSSWriteConfig buildConfig(String fileSence, String originFileName) throws Exception {
     
            // 获取bucketName
            String bucketName = configBase.getOssBucketMap().get(fileSence);
            AliyunOSSWriteConfig ob = new AliyunOSSWriteConfig();
            ob.setFolderName(fileSence);
            if (StringUtils.isNotBlank(originFileName)) {
                ob.setTargetFileName(generateFileName(fileSence, originFileName));
            }
            ob.setBucket(bucketName);
            return ob;
        }
     
        /**
         * 生成文件名
         * @param folder
         * @param originFileName
         * @return
         */
        @Override
        public String generateFileName(String folder, String originFileName) {
            if (StringUtils.isNotBlank(originFileName)) {
                //文件扩展类型
                String extensionName = this.getExtensionName(originFileName);
                //生成文件名
                String fileName = UUID.randomUUID().toString().replace("-", "") + "." + extensionName;
                //文件路径
                String filePath = getFilePath(folder, fileName);
                return trimStart(filePath, "/");
            }
            return originFileName;
        }
     
        /**
         * 根据文件夹和文件名生成文件路径
         * * * @param folder 文件夹
         * * @param fileName 文件名
         * * @return 文件路径
         */
        private static String getFilePath(String folder, String fileName) {
            //文件路径
            String filePath = StringUtils.EMPTY;
            if (StringUtils.isNotBlank(folder)) {
                String tempFolder = folder.replace(".", "");
                tempFolder = trimStart(tempFolder, "/");
                tempFolder = trimEnd(tempFolder, "/");
                filePath = filePath + tempFolder + "/";
            }
            if (StringUtils.isNotBlank(fileName)) {
                fileName = trimStart(fileName, "/");
                filePath = filePath + fileName;
            }
            return filePath;
        }
     
        /**
         * 获取文件的扩展名 * *
         *
         * @param fileName 文件名 *
         * @return 扩展名
         */
        private String getExtensionName(String fileName) {
            if (StringUtils.isEmpty(fileName) || !fileName.contains(".")) {
                return StringUtils.EMPTY;
            }
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        }
     
        /**
         * 去除某个开头字符串 * *
         *
         * @param str    字符串
         * @param symbol 开头字符串
         * @return string
         */
        private static String trimStart(String str, String symbol) {
            if (StringUtils.isBlank(str) || StringUtils.isBlank(symbol)) {
                return str;
            }
            str = str.trim();
            if (StringUtils.isNotBlank(str) && str.startsWith(symbol)) {
                return str.substring(symbol.length());
            }
            return str;
        }
     
        /**
         * 去除某个结尾字符串
         * * * @param str 字符串
         * * @param symbol 结尾字符串
         * * @return string
         */
        private static String trimEnd(String str, String symbol) {
            if (StringUtils.isBlank(str) || StringUtils.isBlank(symbol)) {
                return str;
            }
            str = str.trim();
            if (StringUtils.isNotBlank(str) && str.endsWith(symbol)) {
                return str.substring(0, str.length() - symbol.length());
            }
            return str;
        }
    }

    五,Controller

     
    import com.tenyears.model.common.ApiRequest;
    import com.tenyears.model.common.ApiResult;
    import com.tenyears.webCommon.config.oss.*;
    import com.tenyears.webCommon.service.service.OSSService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
     
    import java.util.Map;
     
    /**
     * @description :
     * @auther Tyler
     * @date 2021/8/16
     */
     
    /**
     * oss 文件上传
     */
    @RestController
    @RequestMapping("api/oss")
    public class OSSController {
     
        @Autowired
        OSSService manager;
        @Autowired
        BaseConfig configBase;
     
        /**
         * 获取场景和Bucket
         * key : 场景 ,value : Bucket
         * @return
         */
        @RequestMapping(value = "get_oss_bucket_map", method = RequestMethod.POST)
        public ApiResult<Map> get_oss_bucket_map()
        {
            ApiResult<Map> result=new ApiResult();
            result.setCodeToSuccessed(configBase.getOssBucketMap());
            return result;
        }
     
        /**
         *  获取 oss token
         */
        @RequestMapping(value = "get_oss_token", method = RequestMethod.POST)
        public ApiResult<AliyunOSSConfig> getOssToken(@RequestBody ApiRequest<AliyunOssAutoSignRequest> request) throws Exception {
     
            ApiResult<AliyunOSSConfig> result=new ApiResult<>();
            AliyunOssAutoSignRequest reqData=request.getData();
     
            AliyunOSSWriteConfig aliyunOSSWriteConfig = manager.buildConfig(reqData.getFileScene() ,reqData.getFileName());
            AliyunOSSSignConfig signConfig = manager.generateSign(aliyunOSSWriteConfig.getFolderName());
            AliyunOSSConfig config = new AliyunOSSConfig();
            config.setBucket(aliyunOSSWriteConfig.getBucket());
            config.setAccessKeyId(configBase.getOssAccessKeyId());
            config.setFolderName(aliyunOSSWriteConfig.getFolderName());
            config.setSignature(signConfig.getSignature());
            config.setPolicy(signConfig.getPolicy());
            config.setHost("https://" + config.getBucket() + "." + configBase.getOssEndpointValue());
            config.setFilePath(manager.generateFileName(aliyunOSSWriteConfig.getFolderName(), request.getData().getFileName()));
            config.setFileUrl(config.getHost() + "/" + config.getFilePath());
            result.setCodeToSuccessed(config);
            return result;
        }
    }

    ApiRequest<T> 和 ApiResult<T> 就不展示了,以前文档有。

    你们直接返回自己的实体对象

  • 相关阅读:
    虽然非常简单但是效果不错
    Google地图开发总结
    笔记(一):ES6所改良的javascript“缺陷”
    ex6的选择器
    android中的style部分属性值介绍
    Android ImageSwitcher
    c# Winform退出程序的方法
    Android ImageView获取网络图片
    循环向数据库(sql server)插入10W条数据
    Android Handler+Thread实现更新Ui
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/15148305.html
Copyright © 2020-2023  润新知