博主最近接入阿里云的OSS对象存储,踩了两个很无语的坑。官方文档地址
- 问题一
文件上传报错SignatureDoesNotMatch:The request signature we calculated does not match the signature you provided. Check your key and signing method。 - 问题二
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