- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
今天在对接阿里云OSS对象存储, 把这过程记录下来 。
阿里云的内容很多,文档是真的难找又难懂 本文主要是用的PostObject API 加上 Callback参数 PostObject -> https://help.aliyun.com/document_detail/31988.html?spm=a2c4g.31989.0.0 Callback -> https://help.aliyun.com/document_detail/31989.html?spm=a2c4g.31988.0.0 。
相比应用服务器直接上传到OSS,大大减少了带宽和应用服务器的压力,缺点就是相对麻烦一点 。
我们用的是SpringBoot,我们导入 aliyun-oss-spring-boot-starter 包,因为我这个是 SpringCloud项目父项目管理了SpringCloud 和 SpringCloud Alibaba 、SpringBoot版本的,所以一开始我是没有写版本号的,结果一直爆红,导不进来,然后仔细一看,原来这是aliyun-oss-spring-boot-starter,注意这个boot-starter,我还以为是cloud系列的,然而哈哈,然后导入aliyun-spring-boot-dependencies,我在仓库里面去找版本号,然而它也只有这一个1.0.0版本 。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 阿里云OSS -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>aliyun-spring-boot-dependencies</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
alibaba:
cloud:
# 阿里控制台OSS子账户的信息
access-key: LTAI5tDZ51bANyHxYpwZzvpi
secret-key: zPxHPuaZMTPzTPy0WF88vI99HHLOzO
oss:
# 深圳endpoint
endpoint: oss-cn-shenzhen.aliyuncs.com
# 认证过期 单位秒
expireTime: 1200
# 储存空间名字
bucket: yues-oss
package com.yues.gulimall.thirdparty.controller;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
@RestController
public class OssController {
@Autowired
private OSS ossClient;
@Value("${alibaba.cloud.oss.endpoint}")
private String endpoint;
@Value("${alibaba.cloud.access-key}")
private String accessId;
@Value("${alibaba.cloud.oss.expireTime}")
private long expireTime;
@Value("${alibaba.cloud.oss.bucket}")
private String bucket;
/**
* 回调
* @param request request
* @return Map
*/
@RequestMapping("/ossCallback")
public Map<String,String> ossCallback(HttpServletRequest request) {
HashMap<String, String> result = new HashMap<>();
String filename = request.getParameter("filename");
Map<String, String[]> parameterMap = request.getParameterMap();
parameterMap.forEach((item,value) -> {
System.out.println(item);
System.out.println(Arrays.toString(value));
});
filename = "https://".concat(bucket).concat(".").concat(endpoint).concat("/").concat(filename);
result.put("url", filename);
result.put("size", request.getParameter("size"));
result.put("mimeType", request.getParameter("mimeType"));
return result;
}
/**
* 签名
* @return Map
*/
@PostMapping("/getOssSecret")
public Map<String,String> getOssSign() {
// 填写Host地址,格式为https://bucketname.endpoint。
String host = "https://" + bucket + "."+ endpoint;
// OSS会在文件上传完成后,把文件上传信息发送给应用服务器。需要外网ip
String callbackUrl = "https://23d4-1-196-175-217.ngrok-free.app/ossCallback";
// 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。
// 将日期作为上传的文件夹目录
String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/";
Map<String, String> respMap = null;
try {
long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
// 过期时间
Date expiration = new Date(expireEndTime);
// 上传回调参数。
Callback callback = new Callback();
callback.setCallbackUrl(callbackUrl);
// 设置回调请求消息头中Host的值,即您的服务器配置Host的值。需要外网ip
callback.setCallbackHost("23d4-1-196-175-217.ngrok-free.app");
// 设置发起回调时请求body的值。
callback.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}");
// 设置发起回调请求的Content-Type。
callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
// 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。
callback.addCallbackVar("x:var1", "value1");
callback.addCallbackVar("x:var2", "value2");
// 序列化callback
String callbackString = BinaryUtil.toBase64String(new ObjectMapper().writeValueAsString(callback).getBytes(StandardCharsets.UTF_8));
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(StandardCharsets.UTF_8);
// 转为Base64
String encodedPolicy = BinaryUtil.toBase64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
respMap = new LinkedHashMap<>();
respMap.put("OSSAccessKeyId", accessId);
respMap.put("policy", encodedPolicy);
respMap.put("Signature", postSignature);
respMap.put("dir", dir);
respMap.put("host", host);
respMap.put("callback", callbackString);
// 过期时间的时间戳
respMap.put("expire", String.valueOf(expireEndTime / 1000));
} catch (Exception e) {
throw new RuntimeException("aliyun上传文件获取认证信息失败:" + e.getMessage());
}
return respMap;
}
}
{
"OSSAccessKeyId": "LTAI5tDZ51bANyHxYpwZzvpi",
"policy": "eyJleHBpcmF0aW9uIjoiMjAyMy0wNy0wM1QxNzoxNzo1MS44ODBaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIyMDIzLTA3LTA0LyJdXX0=",
"Signature": "yK5oF8Cj0ncR0ceuIMtXdMW1yco=",
"dir": "2023-07-04/",
"host": "https://yues-oss.oss-cn-shenzhen.aliyuncs.com",
"callback": "eyJjYWxsYmFja1VybCI6Imh0dHBzOi8vMjNkNC0xLTE5Ni0xNzUtMjE3Lm5ncm9rLWZyZWUuYXBwL29zc0NhbGxiYWNrIiwiY2FsbGJhY2tIb3N0IjoiMjNkNC0xLTE5Ni0xNzUtMjE3Lm5ncm9rLWZyZWUuYXBwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsImNhbGJhY2tCb2R5VHlwZSI6IkpTT04iLCJjYWxsYmFja1ZhciI6eyJ4OnZhcjIiOiJ2YWx1ZTIiLCJ4OnZhcjEiOiJ2YWx1ZTEifX0=",
"expire": "1688404671"
}
拿到第四步的JSON后,请求JSON中的host,key = dir + 文件名.后缀,然后按照下图方式请求 注意 :
最后此篇关于SpringBoot对接阿里云OSS上传文件以及回调(有坑)的文章就讲到这里了,如果你想了解更多关于SpringBoot对接阿里云OSS上传文件以及回调(有坑)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
阿里云、华为云、Google Cloud、微软Azure、亚马逊AWS等等云服务器厂商,除了一些大厂,小厂的云服务器质量参差不齐,这也导致很多做非专业人员在选择云服务器进行相关业务时遇到各种问题
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章阿里云、腾讯云的恩怨情仇由作者收集整理,如果你对这篇文章有兴趣,记得点赞
在阿里云中,我在同一VPC中拥有一个托管的Kubernetes集群和一个MySQL RDS(RDS端点位于内部),当白名单包含3306时,Kubernetes容器可以很好地到达RDS端口0.0.0.0
IPSec简介 IPSec(Internet Protocol Security):是一组基于网络层的,应用密码学的安全通信协议族。IPSec不是具体指哪个协议,而是一个开放的协议族。 IPSe
问题现象 云服务器 ECS Linux 服务器内部无法正常解析域名。 问题原因 可能的原因包括: 1、DNS 设置问题 2、防火墙策略问题 3、NSCD 服务问题 处理办法 可以依次
wdCP是基于linux的WEB管理面板系统,对于新手站长是一大福音,众所周知PHP类型网站在linux环境下才能发挥最大的极致,但是并不是所有的站长都熟悉linux系统,拿我来说,我接触过一段时间
腾讯云 阿里云 一般都是两个盘 数据盘需要分区挂在一下 先检查下数据盘在不在 命令 复制代码 代码如下: fdisk -l
骨感的云主机网络应用性能评测 网络应用性能测试,是通过模拟真实的网络应用请求,对网络产品的实际网络应用处理能力进行评测。通过网络应用测试,应该可以完全真实的评估出网络产品在现实应用中的实际应用情
数据包转发资源规划问题 在云计算的虚拟网络之中,数据包的转发是依赖于CPU这个通用处理器进行处理的。然而作为一个通用处理器,CPU在处理数据包转发的时候,效率并不是很高。过高的数据包转发,对CP
直播业务概述 大家所熟知的直播平台虎牙、斗鱼、快手、抖音、B站,直播功能看似普遍,但从零到一开发却不简单。直播中运用到的技术难点非常之多,音频视频处理/编解码,前后处理,直播分发,即时通讯等技
近日,Synergy Research Group公布了2019年第一季度全球主要地区公有云厂商排名。 Synergy Research Group最新的第一季度 、数据显示,中国云服务商在亚
1、到python官网 https://www.python.org 查找最新的原码,我使用的,Python-3.6.3 2、mkdir /home/soft 创建软件管理目录、 3、cd /
卸载MariaDB CentOS7默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包。因为MariaDB和MySQL可能会冲突,故先卸载MariaDB。 1
网站如果使用阿里云 CDN 的时候,图片(使用oss、或者其他图床的图片)、图标字体可能会碰到无法显示或者无法访问的问题。这可能就是碰到了 CDN 的跨域问题。 一般在浏览器的控制台出现下面的错误
我是一名优秀的程序员,十分优秀!