阿里oss服务端签名后直传
服务端签名后直传
- 1.背景
- 2.原理介绍
- 3.OSS中的相关概念
- 4.编码
- 5.源码地址
- 6.博客地址
- 7.码云代码地址
1.背景
采用JavaScript客户端直接签名时,AccessKeyID和AcessKeySecret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。
2.原理介绍
服务端签名后直传的原理如下:
1.用户发送上传Policy请求到应用服务器。
2.应用服务器返回上传Policy和签名给用户。
3.用户直接上传数据到OSS。
本示例中,Web端向服务端请求签名,然后直接上传,不会对服务端产生压力,而且安全可靠。但本示例中的服务端无法实时了解用户上传了多少文件,上传了什么文件。如果想实时了解用户上传了什么文件,可以采用服务端签名直传并设置上传回调。详见下片文章阿里oss服务端签名直传并设置上传回调。
官方文档地址:服务端签名后直传
3.OSS中的相关概念
Endpoint:访问域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。
AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。
之前有一篇文章已经介绍了各个参数的位置。如有不知道的,请看这篇springboot整合oss实现文件的上传,查看,删除,下载
4.编码
在pom.xml中添加相关依赖
<!-- OSS SDK 相关依赖 --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.5.0</version></dependency>
修改SpringBoot配置文件
server:port: 80
# OSS相关配置信息
aliyun:oss:endpoint: endpoint # oss对外服务的访问域名accessKeyId: accessKeyId # 访问身份验证中用到用户标识accessKeySecret: accessKeySecret # 用户用于加密签名字符串和oss用来验证签名字符串的密钥bucketName: tuanzi-ne # oss的存储空间policy:expire: 300 # 签名有效期(S)maxSize: 10 # 上传文件大小(M)dir:prefix: tuanzi/images/ # 上传文件夹路径前缀
添加OSS的相关Java配置
用于配置OSS的连接客户端OSSClient。
package com.tuanzi.config;import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** oss配置文件* @auther 团子* @date 2019-07-31 10:03*/
@Configuration
@Data
public class OssConfig {@Value("${aliyun.oss.endpoint}")private String ALIYUN_OSS_ENDPOINT;@Value("${aliyun.oss.accessKeyId}")private String ALIYUN_OSS_ACCESSKEYID;@Value("${aliyun.oss.accessKeySecret}")private String ALIYUN_OSS_ACCESSKEYSECRET;@Beanpublic OSSClient ossClient(){return new OSSClient(ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_ACCESSKEYID, ALIYUN_OSS_ACCESSKEYSECRET);}
}
添加OSS上传策略封装对象OssPolicyResult
前端直接上传文件时所需参数,从后端返回过来。
package com.tuanzi.dto;import io.swagger.annotations.ApiModelProperty;
import lombok.Data;/*** 获取OSS上传文件授权返回结果* @auther 团子* @date 2019-07-31 11:31*/@Data
public class OssPolicyResult {@ApiModelProperty("访问身份验证中用到用户标识")private String accessKeyId;@ApiModelProperty("用户表单上传的策略,经过base64编码过的字符串")private String policy;@ApiModelProperty("对policy签名后的字符串")private String signature;@ApiModelProperty("上传文件夹路径前缀")private String dir;@ApiModelProperty("oss对外服务的访问域名")private String host;
}
添加OssController定义接口
/*** Oss相关操作接口* @auther 团子* @date 2019-07-31 11:31*/@Controller
@Api(tags = "OssController", description = "Oss管理")
@RequestMapping("/aliyun/oss")
public class OssController {public static final Logger logger = LoggerFactory.getLogger(OssController.class);@Autowiredprivate OssServiceImpl ossService;@ApiOperation(value = "oss上传签名生成")@RequestMapping(value = "/policy", method = RequestMethod.GET)@ResponseBodypublic CommonResult<OssPolicyResult> policy() {logger.info("policy --------------> start");OssPolicyResult result = ossService.policy();logger.info("policy --------------> end");return CommonResult.success(result);}}
添加OSS业务接口OssService
/*** oss上传管理Service* @auther 团子* @date 2019-07-31 11:31*/public interface OssService {/*** oss上传策略生成*/OssPolicyResult policy();}
添加OSS业务接口OssService的实现类OssServiceImpl
private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);@Value("${aliyun.oss.policy.expire}")private int ALIYUN_OSS_EXPIRE;@Value("${aliyun.oss.maxSize}")private int ALIYUN_OSS_MAX_SIZE;@Value("${aliyun.oss.bucketName}")private String ALIYUN_OSS_BUCKET_NAME;@Value("${aliyun.oss.endpoint}")private String ALIYUN_OSS_ENDPOINT;@Value("${aliyun.oss.dir.prefix}")private String ALIYUN_OSS_DIR_PREFIX;@Autowiredprivate OSSClient ossClient;/*** 签名生成*/@Overridepublic OssPolicyResult policy() {OssPolicyResult result = new OssPolicyResult();// 存储目录SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");String dir = ALIYUN_OSS_DIR_PREFIX+sdf.format(new Date());// 签名有效期long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;Date expiration = new Date(expireEndTime);// 文件大小long maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024;// 提交节点String action = "http://" + ALIYUN_OSS_BUCKET_NAME + "." + ALIYUN_OSS_ENDPOINT;try {PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String policy = BinaryUtil.toBase64String(binaryData);String signature = ossClient.calculatePostSignature(postPolicy);result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());result.setPolicy(policy);result.setSignature(signature);result.setDir(dir);result.setHost(action);} catch (Exception e) {LOGGER.error("签名生成失败", e);}return result;}
这样我们就全写完了。我们来进行接口测试!
这里我利用postman进行演示
会调用两次请求,第一次访问本地接口获取上传的策略
第二次调用oss服务 的接口进行文件上传
我们再来看看oss管理控制台
5.源码地址
完整源码地址:阿里oss服务端签名后直传
6.博客地址
博客地址
7.码云代码地址
代码地址
阿里oss服务端签名后直传相关推荐
- oss服务端签名后直传分析与代码实现
文章目录 1.简介 1.1 普通上传方式 1.2 服务端签名后直传 3.服务端签名后直传文档 3.1 用户向应用服务器请求上传Policy和回调. 3.2 应用服务器返回上传Policy和签名给用户. ...
- 阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
分片上传(结合element-ui的upload组件实现自定义上传) async uploadFree(content){let data = await this.getOssToken(); // ...
- 阿里云oss文件上传(简单上传、服务端签名后直传)
前置: 自行开通阿里oss服务: https://www.aliyun.com/product/oss?spm=a2c4g.11174283.J_8058803260.125.d9387da2TjNf ...
- 商城项目09_品牌管理菜单、快速显示开关、阿里云进行文件上传、结合Alibaba管理OSS、服务端签名后直传
文章目录 ①. 品牌管理菜单 ②. 快速显示开关 ③. 阿里云上传概述 ④. 使用代码进行文件上传 ⑤. 结合Alibaba来管理oss ⑥. gulimall-third-party微服务 ⑦. 服 ...
- 分布式电商项目二十六:使用阿里云存储的服务端签名后直传(前端联调)
使用阿里云存储的服务端签名后直传(前端联调) 在前端显示上传的界面,可以根据人人fast-vue的结构,在src\components目录下添加upload文件夹,直接添加vue组件即可,总计三个组件 ...
- java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS
继续上一章文章,这次要操作的是,浏览器请求服务要到签名后直传给OSS对象存储. 1.写好服务端的方法,传给前台相应的密钥 @Resource OSSClient ossClient; @Value(& ...
- 【OSS】服务端签名后直传实现阿里云存储上传文件
文章目录 1.前言 2.阿里云OSS 2.1.开通服务 2.2.创建Bucket 2.3.创建子账户 3.服务端 3.1.依赖导入 3.2.配置文件 3.3.控制器编写 3.4.接口测试 4.前端联调 ...
- 阿里云OSS服务端签名前端JS直传(php)示例
阿里云OSS服务端签名后前端JS直传(php)示例 需求:服务端上传图片太慢,需要使用前端直传的方式.但前端把阿里云的 AccessKey ID 和 AccessKey Secret 放在前端文件中会 ...
- oss 服务端签名直传核心代码
OSS 相关配置 spring:cloud:alicloud:access-key: XXXXXXXsecret-key: XXXXXXXoss:endpoint: XXXXXXXbucket: pi ...
- 微信小程序:阿里云OSS直传实践-PHP实现服务端签名
目录 1.阿里云OSS上传方式 1.1.Web端Browser.js SDK直传(不推荐) 1.2.Web端上传服务端再上传至OSS 1.3.服务端签名后Web端直传(推荐) 2.PHP服务端生成签名 ...
最新文章
- 微软System Center 2012推进私有云计算
- linux 多源代码文件编译
- 求矩阵中各列数字的和 Exercise08_01
- Django ajax 检测用户名是否已被注册
- TyepScript入门教程 之 async await
- Linux下配置CentOS7网络设置 获取ip地址
- js触发click事件
- 推荐一款颜值逆天且功能齐全的开源Shell工具
- c语言中的字符数组和字符串之间的关系
- 深度学习语音降噪方法对比_一种语音降噪方法与流程
- 微服务下蓝绿发布、滚动发布、灰度发布等方案
- 考研英语二2017阅读理解Text3
- Django项目 | 使用MongoDB存储图片
- GitHub 为什么很慢很卡
- 詹姆斯高斯林_Oracle-谷歌专利纠纷不让詹姆斯·高斯林惊讶
- 和菜头-和腾讯新闻哥谈谈腾讯价值观
- 文件:因为懂你,所以永恒 +习题复习
- 直观理解拉格朗日乘子法和Karush-Kuhn-Tucker(KKT)条件
- Nginx-正向代理
- 列表过滤(百度搜索框用vue来实现)