aliyun-oss-spring-boot-starter之服务端签名后直传

本文介绍如何利用阿里云OSS进行文件上传操作,详细解释了配置签名数据的方法及前端上传组件的具体实现流程。

具体流程:首先我们需要将aliyun-oss-spring-boot-starter需要的签名数据配置在项目的配置文件里

其中签名数据包括四个部分:access-key、secret-key、endpoint、bucket,如下配置:

# 引入oss依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>    

# 配置参数
alibaba:
  cloud:
    access-key: LTAI5tLjeLxxxxxxx
    secret-key: loUIZ566Zxxxxxxxx
    oss:
      endpoint: oss-cn-shanghai.aliyuncs.com
      bucket: xxxxxxxx

当我们进行文件上传时,前端先向后获取上传的防伪签名,然后带着防伪签名和文件到OSS进行文件上传,这个过程阿里云OSS会验证签名是否正确,正确则进行文件上传。

为OSS对象存储配置专门的子账户,使用子账户的AccessKey和Security来生成访问签名,开通子账户地址阿里云开通OSS子账户  ,开通完子账户之后,我们还需要为该子账户添加特定的权限,比如管理OSS权限等。

 参考代码:

 @Autowired
    private OSS ossClient;

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

    @Value("${alibaba.cloud.oss.bucket}")
    private String bucket;

    @Value("${alibaba.cloud.access-key}")
    private String accessId;

    @GetMapping("/policy")
    public R policy() throws ServletException, IOException {

//        String bucket = "bucket-name"; // 请填写您的 bucketname 。
        String host = "https://" + bucket + "." + endpoint; // host的格式为 bucketname.endpoint
        // callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
//        String callbackUrl = "http://88.88.88.88:8888";
//        String dir = "user-dir-prefix/"; // 用户上传文件时指定的前缀。
        String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        Map<String, String> respMap = new HashMap<>();
        try {
            long expireTime = 30;
            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, date);

            // 生成post请求代理
            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            // 将String类型的签名转换成字节数组
            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
            // 将字节数组转换成
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            // 生成签名
            String postSignature = ossClient.calculatePostSignature(postPolicy);

            respMap.put("accessid", accessId);
            respMap.put("policy", encodedPolicy);
            respMap.put("signature", postSignature);
            respMap.put("dir", date);
            respMap.put("host", host);
            respMap.put("expire", String.valueOf(expireEndTime / 1000));
            // respMap.put("expire", formatISO8601Date(expiration));

        } catch (Exception e) {
            // Assert.fail(e.getMessage());
            System.out.println(e.getMessage());
        } finally {
            ossClient.shutdown();
        }
        return R.ok().put("data",respMap);
    }

当前端从后端拿到签名数据后,前端的上传组件就可以通过绑定oss的backet地域节点为上传地址,同时携带上传数据和签名进行上传。

### 阿里云OSSSpring Boot集成失败的解决方案 在阿里云OSSSpring Boot集成时,如果出现`aliyun-oss-spring-boot-starter`依赖引入失败的问题,可能是由于以下几种原因导致的:依赖版本不兼容、缺少必要的依赖管理配置或指定的构件未找到。以下是详细的解决方法: #### 1. 确保正确的依赖声明 确保在`pom.xml`文件中正确声明了`aliyun-oss-spring-boot-starter`依赖。如果直接使用该依赖无法正常工作,可以尝试将其替换为`spring-cloud-starter-alicloud-oss`[^3]。 ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> </dependency> ``` #### 2. 引入依赖管理模块 为了确保所有相关依赖的版本兼容性,建议在`pom.xml`中引入`aliyun-spring-boot-dependencies`作为依赖管理模块[^4]。通过这种方式,可以避免因版本冲突导致的运行时错误。 ```xml <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>aliyun-spring-boot-dependencies</artifactId> <version>1.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` #### 3. 检查Maven仓库配置 如果仍然遇到`Could not find artifact`的错误,可能是因为本地Maven配置中未包含阿里云的官方仓库。需要在`pom.xml`或`settings.xml`中添加阿里云的Maven仓库地址[^1]。 ```xml <repositories> <repository> <id>alibaba-maven-repo</id> <url>https://maven.aliyun.com/repository/public</url> </repository> </repositories> ``` #### 4. 升级相关依赖版本 如果程序运行时抛出`NoSuchMethodError`异常,可能是由于依赖版本不兼容引起的。例如,`alicloud-context`与`aliyun-java-sdk-core`之间的版本冲突[^2]。可以通过升级`aliyun-java-sdk-core`到最新版本来解决问题。 ```xml <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.0</version> </dependency> ``` #### 5. 清理并重新构建项目 在完成上述配置后,建议清理本地Maven缓存并重新构建项目,以确保所有依赖正确下载。 ```bash mvn clean install ``` --- ### 注意事项 - 如果问题仍未解决,可以检查是否存在其他冲突的依赖,或者尝试将`aliyun-oss-spring-boot-starter`替换为手动配置的方式。 - 确保使用的Spring Boot版本与阿里云依赖版本兼容。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值