当前位置: 首页 > news >正文

OSS上传(Java和Js)

OSS上传(Java和Js)

  • 准备工作
    • 创建RAM用户
    • 创建角色
    • 创建权限策略
    • 给角色授予权限策略
  • 获取临时访问凭证
  • Java普通上传OSS
  • Java分片上传OSS
  • JS普通上传OSS
  • JS分片上传OSS

使用RAM用户或STS方式访问
由于阿里云账号AccessKey拥有所有API访问权限,建议遵循阿里云安全最佳实践。如果部署在服务端可以使用RAM用户或STS来进行API访问或日常运维管控操作,如果部署在客户端请使用STS方式来进行API访问。

本文采用STS方式来实现上传功能,STS可以给第三方提供权限,在考虑接口安全的前提下,还是很合适的,当然如果是自己企业使用的话,也可以直接用RAM用户方式。代码都是类似的

准备工作

登录控制台进入RAM控制台
在这里插入图片描述

创建RAM用户

在这里插入图片描述

在这里插入图片描述
创建完成之后记得复制密钥后面代码里面要用到
在这里插入图片描述
返回用户列表,点击添加权限,现在下面权限后点击确定

在这里插入图片描述

创建角色

在这里插入图片描述
选择阿里云账号,点击下一步
在这里插入图片描述
输入名称,点击下一步
在这里插入图片描述
点击完成创建
在这里插入图片描述

然后角色列表,找到刚刚创建的角色,点击进入
在这里插入图片描述
复制角色的ARN,后面的代码里面会用到
在这里插入图片描述

创建权限策略

在这里插入图片描述

输入脚本
PutObject就是用form表单的方式上传,resource就是bucket资源路径,这个自行修改

{"Version": "1","Statement": [{"Effect": "Allow","Action": "oss:PutObject","Resource": ["acs:oss:*:*:test/img/*","acs:oss:*:*:test/mp4/*"]}]
}

在这里插入图片描述
然后点击继续编辑,添加名称后点击 确定即可

在这里插入图片描述

给角色授予权限策略

进入角色列表找到刚刚新建的角色,点击添加权限
在这里插入图片描述
选择刚刚创建的权限策略,点击确定

在这里插入图片描述

获取临时访问凭证

<!--阿里云oss-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
</dependency>

注意替换你自己的id 和 secret,这个生成的token有效期默认是3600秒,可以根据业务场景自己调整

public static void main(String[] args) {// STS接入地址,例如sts.cn-hangzhou.aliyuncs.com。String endpoint = "sts.cn-hangzhou.aliyuncs.com";// 填写步骤1生成的RAM用户访问密钥AccessKey ID和AccessKey Secret。String accessKeyId = "你刚刚创建的RAM用户的AccessKey ID";String accessKeySecret = "你刚刚创建的RAM用户的AccessKey Secret";// 填写步骤3获取的角色ARN。String roleArn = "你刚刚创建的RAM用户的ARN";// 自定义角色会话名称,用来区分不同的令牌,例如可填写为SessionTest。String roleSessionName = "SessionTest";// 以下Policy用于限制仅允许使用临时访问凭证向目标存储空间examplebucket上传文件。// 临时访问凭证最后获得的权限是步骤4设置的角色权限和该Policy设置权限的交集,即仅允许将文件上传至目标存储空间examplebucket下的exampledir目录。// 如果policy为空,则用户将获得该角色下所有权限。String policy = "{\n" +"    \"Version\": \"1\", \n" +"    \"Statement\": [\n" +"        {\n" +"            \"Action\": [\n" +"                \"oss:PutObject\"\n" +"            ], \n" +"            \"Resource\": [\n" +"                \"acs:oss:*:*:test/*\" \n" +"            ], \n" +"            \"Effect\": \"Allow\"\n" +"        }\n" +"    ]\n" +"}";// 设置临时访问凭证的有效时间为3600秒。Long durationSeconds = 3600L;try {// regionId表示RAM的地域ID。以华东1(杭州)地域为例,regionID填写为cn-hangzhou。也可以保留默认值,默认值为空字符串("")。String regionId = "";// 添加endpoint。适用于Java SDK 3.12.0及以上版本。//DefaultProfile.addEndpoint(regionId, "Sts", endpoint);// 添加endpoint。适用于Java SDK 3.12.0以下版本。DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);// 构造default profile。IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);// 构造client。DefaultAcsClient client = new DefaultAcsClient(profile);final AssumeRoleRequest request = new AssumeRoleRequest();// 适用于Java SDK 3.12.0及以上版本。//request.setSysMethod(MethodType.POST);// 适用于Java SDK 3.12.0以下版本。request.setMethod(MethodType.POST);request.setRoleArn(roleArn);request.setRoleSessionName(roleSessionName);request.setPolicy(policy);request.setDurationSeconds(durationSeconds);final AssumeRoleResponse response = client.getAcsResponse(request);System.out.println("Expiration: " + response.getCredentials().getExpiration());System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());System.out.println("Security Token: " + response.getCredentials().getSecurityToken());System.out.println("RequestId: " + response.getRequestId());} catch (ClientException e) {System.out.println("Failed:");System.out.println("Error code: " + e.getErrCode());System.out.println("Error message: " + e.getErrMsg());System.out.println("RequestId: " + e.getRequestId());}
}

运行main方法,控制台输出
下面上传代码里用到的id secret token都是用这里生成的,而不是RAM用户的,千万别搞错了

在这里插入图片描述

Java普通上传OSS

public static void main(String[] args) {SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date1 = new Date();System.out.println("上传开始---" + dateFormat.format(date1));// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = "oss-cn-hangzhou.aliyuncs.com";// 填写步骤五获取的临时访问密钥AccessKey ID和AccessKey Secret,非阿里云账号AccessKey ID和AccessKey Secret。String accessKeyId = "上一步获取的id";String accessKeySecret = "上一步获取的secret";// 填写步骤五获取的安全令牌SecurityToken。String securityToken = "上一步获取的token";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, securityToken);// 将本地文件exampletest.txt上传至目标存储空间examplebucket下的目录exampledir。PutObjectRequest putObjectRequest = new PutObjectRequest("test", "mp4/111.mp4", new File("D:\\test\\111.mp4"));// ObjectMetadata metadata = new ObjectMetadata();// 上传文件时设置存储类型。// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// 上传文件时设置读写权限ACL。// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上传文件。ossClient.putObject(putObjectRequest);// 关闭OSSClient。ossClient.shutdown();Date date2 = new Date();System.out.println("上传结束---" + dateFormat.format(date2));
}

运行mian方法成功,去控制台查看是否上传成功,如果没有看到上传的文件,看看是不是路径写错了,或者token过期了,

Java分片上传OSS

分片只有在大文件才能发挥出他的功效,例如1G的文件,如果是几百兆的文件是看不出效果的,有分片上传比普通上传还要慢一些

public static void main(String[] args) throws Exception {SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date1 = new Date();System.out.println("上传开始---" + dateFormat.format(date1));// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-hangzhou.aliyuncs.com";// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。String accessKeyId = "刚刚获取的id";String accessKeySecret = "刚刚获取的secret";String securityToken = "刚刚获取的token";// 填写Bucket名称,例如examplebucket。String bucketName = "test";// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。String objectName = "mp4/111.mp4";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret,securityToken);try {// 创建InitiateMultipartUploadRequest对象。InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);// 初始化分片。InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);// 返回uploadId,它是分片上传事件的唯一标识。您可以根据该uploadId发起相关的操作,例如取消分片上传、查询分片上传等。String uploadId = upresult.getUploadId();// partETags是PartETag的集合。PartETag由分片的ETag和分片号组成。List<PartETag> partETags =  new ArrayList<PartETag>();// 每个分片的大小,用于计算文件有多少个分片。单位为字节。final long partSize = 1 * 1024 * 1024L;   //1 MB。// 填写本地文件的完整路径。final File sampleFile = new File("D:\\test\\111.mp4");long fileLength = sampleFile.length();int partCount = (int) (fileLength / partSize);if (fileLength % partSize != 0) {partCount++;}// 遍历分片上传。for (int i = 0; i < partCount; i++) {long startPos = i * partSize;long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;InputStream instream = new FileInputStream(sampleFile);// 跳过已经上传的分片。instream.skip(startPos);UploadPartRequest uploadPartRequest = new UploadPartRequest();uploadPartRequest.setBucketName(bucketName);uploadPartRequest.setKey(objectName);uploadPartRequest.setUploadId(uploadId);uploadPartRequest.setInputStream(instream);// 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。uploadPartRequest.setPartSize(curPartSize);// 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,OSS将返回InvalidArgument错误码。uploadPartRequest.setPartNumber( i + 1);// 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);// 每次上传分片之后,OSS的返回结果包含PartETag。PartETag将被保存在partETags中。partETags.add(uploadPartResult.getPartETag());}// 创建CompleteMultipartUploadRequest对象。// 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。CompleteMultipartUploadRequest completeMultipartUploadRequest =new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags);System.out.println("分片---" + partETags.size());// 完成分片上传。CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);System.out.println(completeMultipartUploadResult.getETag());} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();Date date2 = new Date();System.out.println("上传结束---" + dateFormat.format(date2));}}
}

JS普通上传OSS

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Document</title></head><body><button id="upload">上传</button><input id="file" type="file" /><!--导入SDK文件--><scripttype="text/javascript"src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script><script type="text/javascript">const client = new OSS({// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。region: 'oss-cn-hangzhou',// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。accessKeyId: '刚刚获取的id',accessKeySecret: '刚刚获取的secret',// 从STS服务获取的安全令牌(SecurityToken)。stsToken: '刚刚获取的token',// 填写Bucket名称。bucket: 'test'});// 从输入框获取file对象,例如<input type="file" id="file" />。let data;// 创建并填写Blob数据。//const data = new Blob(['Hello OSS']);// 创建并填写OSS Buffer内容。//const data = new OSS.Buffer(['Hello OSS']);const upload = document.getElementById("upload");const headers = {};async function putObject (data) {try {// 填写Object完整路径。Object完整路径中不能包含Bucket名称。// 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。// data对象可以自定义为file对象、Blob数据或者OSS Buffer。const result = await client.put("mp4/111.mp4",data//{headers});console.log(result);} catch (e) {console.log(e);}}upload.addEventListener("click", () => {data = document.getElementById("file").files[0];putObject(data);});</script></body>
</html>

JS分片上传OSS

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>Document</title></head><body><button id="submit">上传</button><input id="file" type="file" /><!--导入sdk文件--><scripttype="text/javascript"src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script><script type="text/javascript">const client = new OSS({// yourRegion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。region: "oss-cn-hangzhou",// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。accessKeyId: "刚刚获取的id",accessKeySecret: "刚刚获取的secret",// 从STS服务获取的安全令牌(SecurityToken)。stsToken: "刚刚获取的token",// 填写Bucket名称,例如examplebucket。bucket: "test",});const headers = {// 指定该Object被下载时的网页缓存行为。"Cache-Control": "no-cache",// 指定该Object被下载时的名称。"Content-Disposition": "111.mp4",// 指定该Object被下载时的内容编码格式。"Content-Encoding": "utf-8",// 指定过期时间,单位为毫秒。"Expires": "1000",// 指定Object的存储类型。"x-oss-storage-class": "Standard",// 指定Object标签,可同时设置多个标签。"x-oss-tagging": "Tag1=1&Tag2=2",// 指定初始化分片上传时是否覆盖同名Object。此处设置为true,表示禁止覆盖同名Object。"x-oss-forbid-overwrite": "true",};// 指定上传到examplebucket的Object名称,例如exampleobject.txt。const name = "111.mp4";// 获取DOM。const submit = document.getElementById("submit");const options = {// 获取分片上传进度、断点和返回值。progress: (p, cpt, res) => {console.log(p);},// 设置并发上传的分片数量。parallel: 4,// 设置分片大小。默认值为1 MB,最小值为100 KB。partSize: 1024 * 1024,// headers,// 自定义元数据,通过HeadObject接口可以获取Object的元数据。meta: { year: 2020, people: "test" },mime: "text/plain",};// 监听按钮。submit.addEventListener("click", async () => {try {const data = document.getElementById("file").files[0];// 分片上传。const res = await client.multipartUpload(name, data, {...options,// 设置上传回调。});console.log(res)} catch (err) {console.log(err);}});</script></body>
</html>

相关文章:

OSS上传(Java和Js)

OSS上传&#xff08;Java和Js&#xff09;准备工作创建RAM用户创建角色创建权限策略给角色授予权限策略获取临时访问凭证Java普通上传OSSJava分片上传OSSJS普通上传OSSJS分片上传OSS使用RAM用户或STS方式访问 由于阿里云账号AccessKey拥有所有API访问权限&#xff0c;建议遵循阿…...

【虚拟机】VirtualBox Host-Only + 主机网络共享配置

文章目录创建Host-Only虚拟机配置主机配置其它工作中经常会使用到虚拟机进行各种技术的试验&#xff0c;之前为了省事常用桥接模式&#xff0c;可是我经常变换办公地点&#xff0c;每个办公地点的局域网网段并不一样&#xff0c;所以我采取了仅主机模式网络共享这种方式&#x…...

小公司“混”的3年,我认真做了5件事,真的受益终生

小公司“混”的3年&#xff0c;我认真做了5件事&#xff0c;真的受益终生 目录&#xff1a;导读 功能测试很重要但不值钱 自动化测试在小公司没市场&#xff0c;但是你得会 给自己的一些忠告 第一件事&#xff1a;分清阶段&#xff0c;制定计划 第二件事&#xff1a;梳理…...

Linux Crontab命令定时任务基本语法与操作教程

Linux Crontab命令定时任务基本语法与操作教程 一、Crontab查看编辑重启 1、查看crontab定时执行任务列表 crontab -l 2、编辑crontab定时执行任务 crontab -e 3、删除crontab定时任务 crontab -r 4、相关命令&#xff1a; sudo service crond start #启动服务 sudo …...

文档测试要测什么,如何进行测试?

文档测试要测什么&#xff0c;如何进行测试&#xff1f; 对于交付用户文档来说&#xff0c;以需求、用户手册、安装手册等为主&#xff0c;检查用户文档是否和实际的存在差别&#xff0c;主要从以下几个方面来考虑&#xff1a; 阅读者&#xff1a;文档面向的读者定位要清晰&…...

.net 6 引入EFCore

这里默认使用sql server数据库 DBFirst nuget引入程序集 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCore.Design Microsoft.EntityFrameworkCore.Tools Microsoft.Extensions.Logging.Console 执行脚本 设置DAL…...

MySQL------自定义排序

1、MySQL函数 field() 实现自定义 语法&#xff1a; SELECT * from table_name ORDER BY FIELD(str,str1,str2,str3,…) str: 字段名, str1,str2,str3: 自定义排序的数值 例1排序-所有值&#xff1a; 先姓名排序后出生日期排序 SELECT * from name_info ORDER BY FIELD(name…...

FFMPEG自学二 ⾳频编码实战

一、FFmpeg编码流程二、流程关键函数avcodec_find_encoder&#xff1a;根据指定的AVCodecID查找注册的编码器。 avcodec_alloc_context3&#xff1a;为AVCodecContext分配内存。 avcodec_open2&#xff1a;打开编码器。 avcodec_send_frame&#xff1a;将AVFrame⾮压缩数据给…...

​一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人​

2月21日&#xff0c;湖北一致魔芋生物科技股份有限公司&#xff08;下称“一致魔芋”&#xff0c;BJ:839273&#xff09;在北京证券交易所上市。本次上市&#xff0c;一致魔芋的发行价为11.38元/股&#xff0c;发行1350万股&#xff0c;募资总额约为1.54亿元。 本次发行后&…...

进程或线程终止是否会释放锁

线程锁的必要性比如一个多线程抢票程序&#xff0c;tickets作为临界资源&#xff0c;所有的线程都要对它进行判断ticket是否大于0&#xff0c;以及ticket–的操作。用ticket–操作举例&#xff0c;虽然他看起来是一行C语言的代码&#xff0c;但是实际上它的底层汇编经历了三个阶…...

mysql复制表提示某些为null字段无效

sql_mode‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’ explicit_defaults_for_timestamp ON 1、方式1、 首先用下面的命令看下sql_mode show variables like ‘sql_mode’; 如果查询的结果如下&#…...

【数据库】redis 配置文件与发布订阅

目录 配置文件 一&#xff0c;Units 二&#xff0c; INCLUDE 三&#xff0c;NETWORK 1&#xff0c; bind 2&#xff0c; tcp-backlog 3&#xff0c;timeout 4&#xff0c; tcp-keepalive 四&#xff0c;GENERAL 1&#xff0c;daemonize 2&#xff0c; pidfile 3&…...

ChatGPT来了,英语不能丢,但我不想上班

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 好久没写文&#xff0c;可能大伙已把我忘了。春节之后&#xff0c;状态一直不太好。我在2月1号时从老家直接来到了深圳出差&#xff0c;而后以996的工作状态疲于应付工作中的各种问题。 终于这周末休息了两天&a…...

【LeetCode】二叉树的直径 [E](二叉树)

543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一棵二叉树&#xff0c;你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 …...

Mybatis框架详解(全)

目录 MyBatis简介 MyBatis整体架构及运行流程 1.数据源配置文件 2.Sql映射文件 3.会话工厂与会话 4.运行流程 mybatis实现增删改查 Mybatis的获取参数的方式 mapper中自定义映射 mybatis注解开发 mybatis缓存 mybatis分页插件 MyBatis简介 MyBatis 是一款优秀的持久…...

2023年爆火的csgo搬砖项目详细拆解,steam搬砖长期稳定

不懂的同学可以听我下面慢慢道来 我的态度&#xff1a;存在即有意义&#xff0c;没有长久的赚钱项目&#xff0c;但是一定有长久赚钱的人。 我们团队也一直在做这个项目&#xff0c;赚钱是一定的&#xff0c;简单总结&#xff1a;执行力技巧量化。 开门见山 一、steam搬砖项…...

C语言实现动态管理通讯录信息系统(静态通讯录plus版)

文章目录前言&#xff1a;一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…...

核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

目录 1. 业务场景 -> 1.1 初始化操作 -> 1.2 业务操作 -> 1.3优势 2. 实现方式(多种方式,不同思想) -> 2.1 定时调度任务(常用四种方式 task ) --> 2.1.1 Timer(单线程) --> 2.1.2 scheduledExecutorService(多线程并发执行,线程池) --> 2.1…...

拒绝背锅:测试项目中的风险管理一定要知道

测试经理除了要管理产品线的质量保障和日常部门事务工作外&#xff0c;另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展&#xff0c;而是想聊一聊在同行中比较高频出现的一个字眼&#xff1a;风险管理。 什么是风险管理 引用百度上的解释&a…...

20-js本地存储

js本地存储 localStorage localStorage是window下的对象&#xff0c;可以使用window.localStorage调用&#xff0c;也可以直接使用localStorage调用。 浏览器关闭&#xff0c;localStorage也不会消失 示例&#xff1a; <body><h2>localStorage</h2><…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...