Java整合阿里云OSS,授权链接给前端上传文件报错签名异常解决

博主最近接入阿里云的OSS对象存储,踩了两个很无语的坑。官方文档地址

  1. 问题一
    文件上传报错SignatureDoesNotMatch:The request signature we calculated does not match the signature you provided. Check your key and signing method
  2. 问题二
    object_name问题,加上/object_name后上传失败。(这里的路径不能以 ‘/’ 开头,需要以 '路径/路径/路径…/文件名称.后缀’格式)

排查了跨域设置(没问题),排查了防盗链(没问题)。最后访问官方给的问题排查页面,也没有找到问题。官方问题参考文档地址

最后联系阿里技术才摸到问题

总结一下上述问题,在接入COS时
其一:COS创建授权链接时,不需要设置’Content-type’,而OSS是必须要设置的。
其二:COS配置project_name时,需要以’ / '开头,而OSS不能以’ / '开头。


下面会以Java+前端axios为例进行OSS集成。通过调用后端接口获取授权上传链接,前端使用授权链接进行文件上传。

优点:使用授权后,上传是通过前端上传的,将流量压力全部交给了对象存储服务器,不再需要将压力放在业务服务器上面。OSS服务器的流量费用比业务服务器等便宜的多。

  • 加入maven依赖
<!--阿里OSS对象存储-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>
  • 写入配置到yml
  aliOss:
    endpoint: https://oss-cn-beijing.aliyuncs.com # 上传到的OSS地址
    access_key_id: 你的账号keyid# 主账户的keyId
    access_key_secret: 你账号的keySecret
    bucket_name: 你创建的bucket的name
    path: data 你要存储的路径(可选)
  • Config实体

@Component
public class AliOssConfig {
   

    public static String endpoint;

    @Value("${sdk.aliOss.endpoint}")
    public void setEndpoint(String endpoint) {
   
        this.endpoint = endpoint;
    }

    public static String accessKeyId;

    @Value("${sdk.aliOss.access_key_id}")
    public void setAccessKeyId(String accessKeyId) {
   
        this.accessKeyId = accessKeyId;
    }

    public static String accessKeySecret;

    @Value("${sdk.aliOss.access_key_secret}")
    public void setAccessKeySecret(String accessKeySecret) {
   
        this.accessKeySecret = accessKeySecret;
    }

    public static String bucketName;

    @Value("${sdk.aliOss.bucket_name}")
    public void setBucketName(String bucketName) {
   
        this.bucketName = bucketName;
    }

    public static String path;

    @Value("${sdk.aliOss.path}")
    public void setPath(String path) {
   
        this.path = path;
    }
}

  • 公共实体
@Data
public class AliOssPublicEntity {
   

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;

    private String objectKey;

    public static AliOssPublicEntity build(String objectKey) {
   
        AliOssPublicEntity entity = new AliOssPublicEntity();
        entity.setEndpoint(AliOssConfig.endpoint);
        entity.setAccessKeyId(AliOssConfig.accessKeyId);
        entity.setAccessKeySecret(AliOssConfig.accessKeySecret);
        entity.setBucketName(AliOssConfig.bucketName);
        entity.setObjectKey(objectKey);
        return entity;
    }
}

  • 工具类
package com.ych.SDK.alibaba.ossSDK;

import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.ych.SDK.alibaba.ossSDK.entity.AliOssPublicEntity;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import java.i
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值