阿里云 OSS 对象存储 配置(文件上传)
1.创建新模块(qilemo-third-party);
Group:com.qilemo
Artifact:qilemo-third-party
Type:Maven Project
Language:Java
Packaging:Jar
Java Version:11
Version:0.0.1-SNAPSHOT
Name:qilemo-third-party
Description:第三方插件
Package:com.qilemo.thirdparty
2.选择需要的组件;
Web:
Spring Web
Spring Cloud Routing:
OpenFeign
3.在 pom.xml 项目配置文件中添加 qilemo-common 依赖,并排除掉和数据库有关的依赖;
<dependency>
<groupId>com.qilemo</groupId>
<artifactId>qilemo-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--排除与数据库交互-->
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
4.将 aliyun-oss-spring-boot-starter 也添加到 pom.xml 项目配置文件中;
<!--ali仓储服务-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
5.开启 nacos 注册发现,配置管理服务;
5.1开启注册发现
@EnableDiscoveryClient
@SpringBootApplication
public class QilemoThirdPartyApplication {
public static void main(String[] args) {
SpringApplication.run(QilemoThirdPartyApplication.class, args);
}
}
5.2在 nacos 客户端中添加 第三方插件 微服务的命名空间(qilemo-third-party);
5.3在 第三方插件 命名空间下添加 配置文件 qilemo-third-party.properties (dev);
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=qilemo-third-party
spring.cloud.alicloud.access-key=LTAI5t5eDs6z8QgHFHMdpsVT
spring.cloud.alicloud.secret-key=xyZAiQhPBPYBuPGCqlut2e5dOI829l
spring.cloud.alicloud.oss.endpoint=oss-cn-shenzhen.aliyuncs.com
spring.cloud.alicloud.oss.bucket=qilemo
server.port=20004
5.4在本地第三方插件微服务中添加 bootstrap.properties 配置管理配置文件;
spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=qilemo-third-party
spring.cloud.nacos.config.server-addr=localhost:8848
spring.application.name=qilemo-third-party
spring.cloud.nacos.config.namespace=c3891a34-d4ec-4848-84d0-e2eb72197744
spring.cloud.nacos.config.group=dev
6.配置 服务端签名直传并设置上传回调 ;
6.1创建 class OssController.java 请求类;
@RestController
public class OssController {
@Autowired
OSS ossClient;
@Value("${spring.cloud.alicloud.access-key}")
String accessId;
// @Value("${alibaba.cloud.secret-key}")
// String accessKey;
@Value("${spring.cloud.alicloud.oss.endpoint}")
String endpoint;
@Value("${spring.cloud.alicloud.oss.bucket}")
String bucket;
@RequestMapping("/oss/policy")
public R policy() {
// String accessId = "<yourAccessKeyId>"; // 请填写您的AccessKeyId。
// String accessKey = "<yourAccessKeySecret>"; // 请填写您的AccessKeySecret。
// String endpoint = "oss-cn-hangzhou.aliyuncs.com"; // 请填写您的 endpoint。
// 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 date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = date+"/"; // 用户上传文件时指定的前缀。
// 创建OSSClient实例。
// OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
Map<String, String> respMap = null;
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, dir);
String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
byte[] binaryData = postPolicy.getBytes("utf-8");
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
respMap = new LinkedHashMap<String, String>();
respMap.put("accessid", accessId);
respMap.put("policy", encodedPolicy);
respMap.put("signature", postSignature);
respMap.put("dir", dir);
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);
}
}
6.2启动微服务,在浏览器中访问地址:localhost:20004/oss/policy
如果可以正常访问,表示连通。
{"msg":"success","code":0,"data":{"accessid":"LTAI5t5eDs6z8QgHFHMdpsVT","policy":"eyJleHBpcmF0aW9uIjoiMjAyMi0wMi0xOFQyMDoxMzoxMy4xMjhaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIyMDIyLTAyLTE5LyJdXX0=","signature":"fXqYcbz1KjgQPIAmpzoWKpDD7FQ=","dir":"2022-02-19/","host":"https://qilemo.oss-cn-shenzhen.aliyuncs.com","expire":"1645215193"}}
7.添加新的路由规则,使其将上传功能的请求转发给第三方服务;
修改网关的配置文件 application.yml,在 商品服务 路由下方添加此路由,(admin-route路由上方)
# 第三方服务路由 - id: thirdparty-route uri: lb://qilemo-third-party predicates: - Path=/api/thirdparty/** filters: - RewritePath=/api/thirdparty/(?<segment>.*), /$\{segment}
再次测试连通性;
访问网关地址:localhost:88/api/thirdparty/oss/policy
显示如上数据表示连通。
如果测试上传时,不显示图片,但是可以正确上传和显示路径,原因是:oss仓库的权限设置为了私有,需要更改为可读,或者可读写。