做网站重庆,站长工具站长之家,东莞网站建设的公司,wordpress找不到页面内容编辑文章目录 一#xff0c;创建第三方服务模块thrid-party1#xff0c;创建一个名为gulimall-third-party的模块2#xff0c;nacos上创建third-party命名空间#xff0c;用来管理这个服务的所有配置3#xff0c;配置pom文件4#xff0c;配置文件5#xff0c;单元测试6… 文章目录 一创建第三方服务模块thrid-party1创建一个名为gulimall-third-party的模块2nacos上创建third-party命名空间用来管理这个服务的所有配置3配置pom文件4配置文件5单元测试6增加网关路由配置 二后台提供生成密钥的接口代码解释使用说明 问题记录 一创建第三方服务模块thrid-party 根据图片的架构设计前端上传文件的步骤如下
①从后台获取签名②携带签名将文件上传至阿里云OSS
因此上传文件涉及到第三方服务阿里云OSS以后还会有第三方短信服务等为了统一管理第三方服务创建一个专门的模块third-party。
1创建一个名为gulimall-third-party的模块 2nacos上创建third-party命名空间用来管理这个服务的所有配置 3配置pom文件
OSS相关的包依赖 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdaliyun-oss-spring-boot-starter/artifactId/dependency4配置文件
application.properties。
server.port30000
alibaba.cloud.secret-keyfzQdkkAR4D1dRopvBC40d1202jgb
alibaba.cloud.access-keyLTAI5tC6QtV3C5dzq7uau
alibaba.cloud.oss.endpointoss-cn-hangzhou.aliyuncs.com
spring.application.namegulimall-third-party
spring.cloud.nacos.discovery.server-addr127.0.0.1:8848bootstrap.yml。
spring:application:name: gulimall-third-partycloud:nacos:config:server-addr: 127.0.0.1:8848namespace: 0ae75f1a-5bd3-4113-aec9-aad4a23403d75单元测试
编写单元测试。
package com.atguigu.gulimall.thirdparty;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyuncs.exceptions.ClientException;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.File;SpringBootTest
RunWith(SpringRunner.class)
class GulimallThirdPartyApplicationTests {Autowiredprivate OSS ossClient;Testvoid contextLoads() {}Testpublic void testUpload() throws ClientException {String bucketName gulimallfuck;// 填写Object完整路径完整路径中不能包含Bucket名称例如exampledir/exampleobject.txt。String objectName 134.png;// 填写本地文件的完整路径例如D:\\localpath\\examplefile.txt。// 如果未指定本地路径则默认从示例程序所属项目对应本地路径中上传文件。String filePath C:\\Users\\Lenovo\\Desktop\\1.png;// 创建OSSClient实例。try {// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest new PutObjectRequest(bucketName, objectName, new File(filePath));// 上传文件。PutObjectResult result ossClient.putObject(putObjectRequest);} catch (Exception oe) {oe.printStackTrace();}}}
6增加网关路由配置 - id: gulimall-third-partyuri: lb://gulimall-third-partypredicates:- Path/api/thirdparty/**filters:- RewritePath/api/thirdparty/(?segment.*),/$\{segment}二后台提供生成密钥的接口
参考阿里云OSS文档后端生成密钥的代码如下。
package com.atguigu.gulimall.thirdparty.controller;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.atguigu.common.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;/*** Description:* Created: with IntelliJ IDEA.* createTime: 2020-05-27 15:56**//****/
RestController
public class OssController {Value(${alibaba.cloud.access-key})private String accessKeyId;Value(${alibaba.cloud.oss.endpoint})private String endpoint;Autowiredprivate OSS ossClient;RequestMapping(/oss/policy)public R policy() {String bucket gulimallfuck; // 请填写您的 bucketname 。String host https:// bucket . endpoint; // host的格式为 bucketname.endpoint// callbackUrl为 上传回调服务器的URL请将下面的IP和Port配置为您自己的真实信息。String format new SimpleDateFormat(yyyy-MM-dd).format(new Date());String dir format /; // 用户上传文件时指定的前缀。// 创建OSSClient实例。MapString, String respMap null;try {long expireTime 30;long expireEndTime System.currentTimeMillis() expireTime * 1000;Date expiration new Date(expireEndTime);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 LinkedHashMapString, String();respMap.put(accessid, accessKeyId);respMap.put(policy, encodedPolicy);respMap.put(signature, postSignature);respMap.put(dir, dir);respMap.put(host, host);respMap.put(expire, String.valueOf(expireEndTime / 1000));} catch (Exception e) {System.out.println(e.getMessage());} finally {ossClient.shutdown();}return R.ok().put(data,respMap);}}
这段代码展示了如何生成一个预签名的策略policy允许客户端通过POST方式上传文件到阿里云OSS服务。policy方法返回了一个LinkedHashMap类型的respMap该映射包含了客户端上传文件所需的参数。下面是respMap中各个键值对的作用解释 accessid: 作用: 客户端上传文件时的身份标识即Access Key ID。用途: 验证客户端的身份。 policy: 作用: 一个Base64编码的JSON字符串定义了上传文件的策略条件。用途: 客户端上传文件时需要携带此策略以满足预设的限制条件。 signature: 作用: 对policy进行签名的结果确保策略的完整性和安全性。用途: 客户端上传文件时需要携带此签名以证明策略的有效性。 dir: 作用: 文件上传的目标目录前缀。用途: 指定文件上传后的存储位置前缀便于组织和管理文件。 host: 作用: OSS服务的访问域名。用途: 客户端通过此域名发起上传请求。 expire: 作用: 策略的有效截止时间以秒为单位的时间戳。用途: 客户端必须在此时间戳之前完成文件上传。
代码解释
假设我们想要允许客户端上传文件到名为gulimallfuck的Bucket中并且文件会被存储在2023-07-25/目录下。policy方法会生成一个策略该策略包含以下限制
文件大小范围在0到1048576000字节之间。文件名必须以2023-07-25/开头。
客户端在发起POST请求时需要携带这些参数以符合策略的要求。如果所有条件都满足文件将被成功上传到OSS。
使用说明 客户端生成表单: 客户端通常是前端JavaScript代码会根据返回的respMap构建一个HTML表单包含所有的必要字段。 表单提交: 当用户选择文件后表单会通过POST方式提交到OSS服务文件作为表单的一部分被上传。 OSS验证: OSS服务会验证accessid、policy和signature确保它们有效且符合策略条件。 文件存储: 如果验证通过文件将被存储在指定的Bucket和目录中。
问题记录
参考文章https://blog.csdn.net/epitomizelu/article/details/140608401