阿里云OSS文件存储

文章目录

    • 参考
    • 准备
      • 创建bucket
      • endpoint 和 bucket域名的访问路径
      • AccessKey和OSS的开发文档
    • Springboot整合OSS
      • 引入依赖
      • AliyunOssConfig
      • AliyunOssProperties
      • applicatioin.yml
      • 简单上传和下载
      • 使用签名URL进行临时授权访问
      • 生成以PUT方法访问的签名URL来上传文件
      • 通过签名URL临时授权简单上传文件
      • 使用签名URL临时授权下载文件
      • 服务端签名直传

参考

阿里云java的sdk官方示例代码

前端不暴露ak/sk直接上传阿里云oss的方案

前端直传阿里云OSS

阿里云 OSS 客户端直传 Policy 模式使用
服务端签名直传并设置上传回调官方文档Java

使用阿里云STS临时token完成阿里云OSS图片上传(Springboot+Vue)
使用STS临时访问凭证通过客户端直连OSS对象存储服务器
使用STS临时访问凭证访问OSS-官方文档
阿里云OSS STS最佳实践,看这一篇就够了
前端通过STS方式直传至阿里云OSS(包含文件上传、下载和自动刷新stsToken)

准备

创建bucket

在这里插入图片描述

endpoint 和 bucket域名的访问路径

endpoint 和 bucket域名的访问路径
在这里插入图片描述

AccessKey和OSS的开发文档

创建AccessKey(图中点击进去即可创建)和查看OSS的开发文档
在这里插入图片描述
开发文档
在这里插入图片描述
AccessKey在这里插入图片描述

Springboot整合OSS

引入依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

AliyunOssConfig

@EnableConfigurationProperties(AliyunOssProperties.class)
@Component
public class AliyunOssConfig {@Autowiredprivate AliyunOssProperties aliyunOssProperties;@Beanpublic OSS ossClient() {OSS oss = new OSSClientBuilder().build(aliyunOssProperties.getEndpoint(),aliyunOssProperties.getAccessKeyId(),aliyunOssProperties.getSecretAccessKey());return oss;}}

AliyunOssProperties

@Data
@ConfigurationProperties(prefix = "oss")
public class AliyunOssProperties {private String endpoint;private String accessKeyId;private String secretAccessKey;// 上传到哪个桶private String bucketName;// 上传的桶中的文件的访问域名private String bucketDomain;}

applicatioin.yml

oss:accessKeyId: ~~~secretAccessKey: ~~~endpoint: https://oss-cn-shenzhen.aliyuncs.combucketName: zzhua-oss-bucket2bucketDomain: https://${oss.bucketName}.oss-cn-shenzhen.aliyuncs.com

简单上传和下载

@SpringBootTest(classes = MinioApp.class)
public class TestOssApp {@Autowiredprivate OSSClient ossClient;@Autowiredprivate AliyunOssProperties aliyunOssProperties;// 流式上传@Testvoid testStreamUpload() throws Exception {String filePath= "C:\\Users\\zzhua195\\Desktop\\soft-dev.png";File file = new File(filePath);InputStream inputStream = new FileInputStream(file);String objectName = file.getName();// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(aliyunOssProperties.getBucketName(),objectName,inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);System.out.println(file.getName());// 注意需要关闭 阻止公共访问, 读写权限改为公共读// 如: https://zzhua-oss-bucket2.oss-cn-shenzhen.aliyuncs.com/soft-dev.pngSystem.out.println("访问路径为: " + aliyunOssProperties.getBucketDomain() + "/" + objectName);}// 流式下载@Testvoid testStreamDownload() throws Exception {String filePath= "C:\\Users\\zzhua195\\Desktop\\soft-dev1111.png";File file = new File(filePath);try {OSSObject ossObject = null;ossObject = ossClient.getObject(aliyunOssProperties.getBucketName(), "soft-dev.png");FileOutputStream fos = new FileOutputStream(file);StreamUtils.copy(ossObject.getObjectContent(), fos);fos.close();} catch (Exception e) {System.out.println("获取资源失败");}}
}

使用签名URL进行临时授权访问

bucket开启阻止公共访问, 读写权限设置为私有, 此时直接使用{bucketDomain}/{objectName}无法直接访问资源。此时,需要生成1个url, 并且携带签名信息才能访问

@Test
void testGeneratedSignedUrl() {String objectName = "20240825/soft-dev.png";GeneratePresignedUrlRequest generatePresignedUrlReq = new GeneratePresignedUrlRequest(aliyunOssProperties.getBucketName(),objectName,HttpMethod.GET);// 必须设置有效时间generatePresignedUrlReq.setExpiration(new Date(new Date().getTime() + 3 * 60 * 1000L));URL url = ossClient.generatePresignedUrl(generatePresignedUrlReq);// 示例: https://zzhua-oss-bucket.oss-cn-shenzhen.aliyuncs.com/20240825/soft-dev.png?Expires=1724635526&OSSAccessKeyId=LTAI5tDVake7ZcZrwbCDjP97&Signature=3BT%2BCJPRx3YDxOxRS8qtVhTHJHI%3DSystem.out.println(url.toString());}

生成以PUT方法访问的签名URL来上传文件

@Test
void testGenrateSignedPut() throws Exception {GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(aliyunOssProperties.getBucketName(),"naughty.gif",HttpMethod.PUT);// 设置签名URL过期时间,单位为毫秒。本示例以设置过期时间为1小时为例。Date expiration = new Date(new Date().getTime() + 3600 * 1000L);request.setExpiration(expiration);// 设置ContentType。request.setContentType("image/gif");// 设置自定义元数据。request.addUserMetadata("author", "zzhua");// 生成签名URL。URL signedUrl = ossClient.generatePresignedUrl(request);System.out.println(signedUrl);Map<String, String> requestHeaders = new HashMap<String, String>();// 设置ContentType,必须和生成签名URL时设置的ContentType一致。requestHeaders.put(HttpHeaders.CONTENT_TYPE, "image/gif");// 设置自定义元数据。requestHeaders.put(OSS_USER_METADATA_PREFIX + "author", "zzhua");FileInputStream inputStream = new FileInputStream("C:\\Users\\zzhua195\\Desktop\\naughty.gif");// 使用签名URL上传文件。PutObjectResult putObjectResult = ossClient.putObject(signedUrl, inputStream, -1, requestHeaders, true);}

通过签名URL临时授权简单上传文件

使用下面代码可以先生成1个上传的签名url,然后使用这个url来put上传文件(但是在postman中就是上传失败,报SignatureDoesNotMatch错误)

@Test
void testGenratePutSimpleUpload() throws Exception {// 设置请求头。Map<String, String> headers = new HashMap<String, String>();/*// 指定Object的存储类型。headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString());// 指定ContentType。headers.put(OSSHeaders.CONTENT_TYPE, "text/txt");*/// 设置用户自定义元数据。Map<String, String> userMetadata = new HashMap<String, String>();/*userMetadata.put("key1","value1");userMetadata.put("key2","value2");*/URL signedUrl = null;try {// 指定生成的签名URL过期时间,单位为毫秒。本示例以设置过期时间为1小时为例。Date expiration = new Date(new Date().getTime() + 3600 * 1000L);// 生成签名URL。String objectName = "naughty.gif";GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(aliyunOssProperties.getBucketName(),objectName,HttpMethod.PUT);// 设置过期时间。request.setExpiration(expiration);// 将请求头加入到request中。request.setHeaders(headers);// 添加用户自定义元数据。request.setUserMetadata(userMetadata);// 通过HTTP PUT请求生成签名URL。signedUrl = ossClient.generatePresignedUrl(request);// 打印签名URL。System.out.println("signed url for putObject: " + signedUrl);} catch (OSSException oe) {System.out.println("生成失败~~~");}if (1 > 0) {return;}// 使用生成的签名url来上传文件CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;try {HttpPut put = new HttpPut(signedUrl.toString());HttpEntity entity = new FileEntity(new File("C:\\Users\\zzhua195\\Desktop\\naughty.gif"));put.setEntity(entity);// 如果生成签名URL时设置了header参数,例如用户元数据,存储类型等,则调用签名URL上传文件时,也需要将这些参数发送至服务端。如果签名和发送至服务端的不一致,会报签名错误。for(Map.Entry header: headers.entrySet()){put.addHeader(header.getKey().toString(),header.getValue().toString());}for(Map.Entry meta: userMetadata.entrySet()){// 如果使用userMeta,sdk内部会为userMeta拼接"x-oss-meta-"前缀。当您使用其他方式生成签名URL进行上传时,userMeta也需要拼接"x-oss-meta-"前缀。put.addHeader("x-oss-meta-"+meta.getKey().toString(), meta.getValue().toString());}httpClient = HttpClients.createDefault();response = httpClient.execute(put);System.out.println("返回上传状态码:"+response.getStatusLine().getStatusCode());if(response.getStatusLine().getStatusCode() == 200){System.out.println("使用网络库上传成功");}System.out.println(response.toString());} catch (Exception e){e.printStackTrace();} finally {response.close();httpClient.close();}
}

使用签名URL临时授权下载文件

跟使用签名URL进行临时授权访问是一样的

@Test
void testGenerateDownload() throws IOException {// 设置请求头。Map<String, String> headers = new HashMap<String, String>();/*// 指定Object的存储类型。headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString());// 指定ContentType。headers.put(OSSHeaders.CONTENT_TYPE, "text/txt");*/// 设置用户自定义元数据。Map<String, String> userMetadata = new HashMap<String, String>();/*userMetadata.put("key1","value1");userMetadata.put("key2","value2");*/URL signedUrl = null;try {// 指定生成的签名URL过期时间,单位为毫秒。本示例以设置过期时间为1小时为例。Date expiration = new Date(new Date().getTime() + 3600 * 1000L);// 生成签名URL。GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(aliyunOssProperties.getBucketName(),"20240825/soft-dev.png",HttpMethod.GET);// 设置过期时间。request.setExpiration(expiration);// 将请求头加入到request中。request.setHeaders(headers);// 添加用户自定义元数据。request.setUserMetadata(userMetadata);// 设置查询参数。// Map<String, String> queryParam = new HashMap<String, String>();// 指定IP地址或者IP地址段,对应日志中sourceIpFromSource的值。// queryParam.put("x-oss-ac-source-ip","192.0.2.0");// 将子网掩码转换为二进制,然后填写转换结果中1的数量。// queryParam.put("x-oss-ac-subnet-mask","32");// 指定VPC ID。// queryParam.put("x-oss-ac-vpc-id","vpc-12345678");// 指定是否允许转发请求。// queryParam.put("x-oss-ac-forward-allow","true");// request.setQueryParameter(queryParam);// 设置单链接限速,单位为bit,例如限速100 KB/s。// request.setTrafficLimit(100 * 1024 * 8);// 通过HTTP GET请求生成签名URL。signedUrl = ossClient.generatePresignedUrl(request);// 打印签名URL。System.out.println("signed url for putObject: " + signedUrl);} catch (Exception e) {System.out.println("发生错误" + e);}// 通过签名URL下载文件,以HttpClients为例说明。CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;try {HttpGet get = new HttpGet(signedUrl.toString());// 如果生成签名URL时设置了header参数,例如用户元数据,存储类型等,则调用签名URL下载文件时,也需要将这些参数发送至服务端。如果签名和发送至服务端的不一致,会报签名错误。for(Map.Entry header: headers.entrySet()){get.addHeader(header.getKey().toString(),header.getValue().toString());}for(Map.Entry meta: userMetadata.entrySet()){// 如果使用userMeta,sdk内部会为userMeta拼接"x-oss-meta-"前缀。当您使用其他方式生成签名URL进行下载时,userMeta也需要拼接"x-oss-meta-"前缀。get.addHeader("x-oss-meta-"+meta.getKey().toString(), meta.getValue().toString());}httpClient = HttpClients.createDefault();response = httpClient.execute(get);System.out.println("返回下载状态码:"+response.getStatusLine().getStatusCode());if(response.getStatusLine().getStatusCode() == 200){System.out.println("使用网络库下载成功");}System.out.println(response.toString());// 保存文件到磁盘。DataInputStream in = null;OutputStream out = null;try {in = new DataInputStream(response.getEntity().getContent());String pathName = "C:\\Users\\zzhua195\\Desktop\\ttt.png";out = new DataOutputStream(new FileOutputStream(pathName));int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {out.write(bufferOut, 0, bytes);}} catch (Exception e){e.printStackTrace();} finally {in.close();out.close();}} catch (Exception e){e.printStackTrace();} finally {response.close();httpClient.close();}
}

服务端签名直传

在这里插入图片描述

@GetMapping("/getPolicy")
public JSONObject getPolicy() throws Exception {// host的格式为 bucketname.endpoint// String host = StringFormatter.concat("https://", bucketName, ".", endpoint).getValue();String host = aliyunOssProperties.getBucketDomain();// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。// String callbackUrl = "http://88.88.88.88:8888";// 每一天产生一个文件夹String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀,如果是 / 则自动检测为文件夹。JSONObject jsonObject = new JSONObject();long expireTime = 600;long expireEndTime = System.currentTimeMillis() + expireTime * 1000; //过期时间 100 秒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);jsonObject.put("OSSAccessKeyId", aliyunOssProperties.getAccessKeyId());jsonObject.put("policy", encodedPolicy);jsonObject.put("signature", postSignature);jsonObject.put("dir", dir);jsonObject.put("host", host);jsonObject.put("expire", String.valueOf(expireEndTime / 1000));return jsonObject;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html快速入门

HTML语言不区分大小写HTML语言不区分单双引号 基本结构&#xff1a;HTML head title&#xff1a;浏览器标题 body 示例&#xff1a; <!DOCTYPE html> <head><meta charset"UTF-8"><title>Hello World</title> </head><bod…

Centos LVM磁盘合并方法

Centos LVM磁盘合并方法 使用fdisk -l命令查看机器增加了2块物理磁盘&#xff0c;一块40G另一块50G 需要将这两块盘的空间合并在一起&#xff0c;而且还需要动态扩展即在不关机的情况下操作 使用pvcreate将两块新增的物理磁盘加入物理卷 [rootlocalhost ~]# pvcreate /dev/sdb…

想避免踩雷选到好用的骨传导耳机?精选热门五款分享

目前在市面当中&#xff0c;骨传导耳机被称之为是黑科技耳机&#xff0c;骨传导耳机拥有很多优势&#xff0c;在听歌时不需要入耳&#xff0c;不会伤耳朵。随着骨传导耳机品牌的不断发展&#xff0c;人们在选购骨传导耳机时&#xff0c;也会觉得非常困难&#xff0c;可能一不小…

小红书产品分析报告

一、体验环境 产品版本&#xff1a;V5.26.2 测试设备:OPPO 系统版本&#xff1a;Android 6.0.1 体验时间&#xff1a;2018-10-31 二、产品介绍 产品名称&#xff1a;小红书 产品类型&#xff1a;社交电商 产品slogan:标记我的生活 产品定位&#xff1a;一款年轻人都分享的…

运维学习————LVS集群和Keepalived+LVS高可用

目录 官网&#xff1a;LVS中文官网 一、概念 二、组成及软件工作层次图 ​编辑 三、整体架构 四、名词解释 五、三种工作模式 1、LVS-NAT 2、LVS-TUN 3、LVS-DR 六、DR模式的实现 1、克隆出LVS&#xff0c;配置虚拟IP 2、配置Nginx的虚拟IP Nginx1的配置 Nginx2…

react中配置Sentry

sentry 打开sentrySentry Docs | Application Performance Monitoring &amp; Error Tracking Software官网&#xff0c; 注册。根据提示创建应用后 在 React 应用中配置 Sentry 可以按照以下步骤进行&#xff1a; 安装 Sentry SDK: 在项目根目录下运行&#xff1a; npm in…

Android settings命令讲解和实战

1&#xff0c;简介 在Android系统中&#xff0c;settings命令用于管理设备设置。这些命令可以与Settings提供者&#xff08;Settings provider&#xff09;交互&#xff0c;后者是一个用于存储和检索系统设置的系统服务。Settings provider在Android系统中可以被看作是一个特殊…

(一) 初入MySQL 【认识和部署】

前置资源 一、数据库概述 1.1、数据库基本概念 数据(Data) 描述事物的符号记录称为数据。数字、文字、图形、图像、声音、档案记录等都是数据。数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&#xff0…

IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀放大器

IP-DAR-250、IP-DAR-43C-L、IP-DAR-43C-H、IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀 EE-PRB、EE-PRD比例压力阀 EE-P2G、ET-P2S、EB-P2A、EE-P2A、ET-P2A、EE-P2H、EG-F2A、EU-F2A比例流量阀 EF-F3G、EU-F3G比例压力补偿流量阀 EQ-S4M、EG-S4M、EQ…

Java 入门指南:Java IO流 —— 转换流、扫描流、打印流

转换流 转换流可以将一个 字节流 包装成 字符流&#xff0c;或者将一个字符流包装成字节流。这种转换通常用于处理文本数据&#xff0c;如读取文本文件或将数据从网络传输到应用程序。 转换流主要有两种类型&#xff1a;InputStreamReader 和 OutputStreamWriter。 InputStr…

文档翻译软件哪个好用?这里有5个顶尖选择

在我的书架上摆满琳琅满目的书籍&#xff0c;这些数据不断的在拓宽我的眼界&#xff0c;但其实我还有秘密武器——5款文献翻译app。 每当我遇到那些充满智慧却难以理解的外文文献时&#xff0c;这些工具总能伸出援手&#xff0c;让复杂的专业术语变得亲切&#xff0c;让晦涩的…

Kafka事件(消息、数据、日志)的存储

1、查看有关kafka日志配置文件的信息 2、查看kafka全部主题的日志文件 3、查看每个主题的日志文件 4、__consumer_offsets-xx文件夹的作用 package com.power;public class Test {public static void main(String[] args) {int partition Math.abs("myTopic".hashCo…

无线通信频率分配

首先看看无线电信号的频谱如何划分&#xff1a; 一、5G NR 3GPP已指定5G NR 支持的频段列表&#xff0c;5G NR频谱范围可达100GHz&#xff0c;指定了两大频率范围&#xff1a; ① Frequency range 1 &#xff08;FR1&#xff09;&#xff1a;就是我们通常讲的6GHz以下频段 频率…

Java算法—排序篇之快速排序(Quick sort)

快速排序&#xff08;Quick sort&#xff09; 核心思路&#xff1a; 从数列中挑出一个元素&#xff0c;一般都是左边第一个数字&#xff0c;称为 “基准数”;创建两个指针&#xff0c;一个从前往后走&#xff0c;一个从后往前走。先执行后面的指针&#xff0c;找出第一个比基…

灵魂 20 问帮你彻底搞定Transformer

1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09; 捕捉多种依赖关系&#xff1a; 多头注意力机制允许模型同时关注输入数据的不同部分和特征。每个“头”都能够学习输入序列的不同表示子空间&#xff0c;从而捕捉到不同类型的依赖关…

霸王茶姬小程序(8月优化版)任务脚本——带教程

文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/BTQ1HK 若失效&#xff0c;可用地址 https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?source5176.29345612&userCode49hts92d 2.部署…

Java基础(4)- IDEA

目录 一、Module 1.创建module 2.关闭modue 3.导入module 4.src灰色 二、Package 1.创建package 2.删除package 3.package取名规范 三、类 1.创建类 2.快捷语法 3.HelloWorld 四、IDEA基本设置说明 1.字体 2.提示的快捷键 五、常用快捷键 一、Module 1.创建mod…

SpringData-ElasticSearch入门

文章目录 1、创建demo工程2、application.properties3、Goods 实体类4、EsDemoApplicationTests 测试类5、pom.xml6、查看索引库7、查看单个索引&#xff08;数据库&#xff09;8、从goods索引中检索出符合特定搜索条件的文档&#xff08;或记录&#xff09; 1、创建demo工程 2…

ctfhub-web-SSRF通关攻略

一、内网访问 1.打开ctfhub给的环境地址 2.观察题目 发现让我们访问127.0.0.1下的flag.php 在地址栏后面有一个url参数 ?urlhttp://127.0.0.1/flag.php 提交即可 二、伪协议读取文件 1.打开ctfhub给的环境 2.观察题目 发现让我们读取flag.php文件 读取文件用到的协议是…

mathtype 公式编号 添加章节号 章节编号错乱 解决方法

1 怎么添加编号 左编号方法和右编号一样。 打开word软件,选择mathtype工具,点击右编号以后会打开mathtype软件界面,在mathtype软件界面中对于公式进行编写,编写完成后退出并且保存,就可以完成编号添加。 如果是对已有的公式进行编写的话,则通过ctrl+A进行全文选择,选择…