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上传(Java和Js)准备工作创建RAM用户创建角色创建权限策略给角色授予权限策略获取临时访问凭证Java普通上传OSSJava分片上传OSSJS普通上传OSSJS分片上传OSS使用RAM用户或STS方式访问 由于阿里云账号AccessKey拥有所有API访问权限,建议遵循阿…...
【虚拟机】VirtualBox Host-Only + 主机网络共享配置
文章目录创建Host-Only虚拟机配置主机配置其它工作中经常会使用到虚拟机进行各种技术的试验,之前为了省事常用桥接模式,可是我经常变换办公地点,每个办公地点的局域网网段并不一样,所以我采取了仅主机模式网络共享这种方式&#x…...
小公司“混”的3年,我认真做了5件事,真的受益终生
小公司“混”的3年,我认真做了5件事,真的受益终生 目录:导读 功能测试很重要但不值钱 自动化测试在小公司没市场,但是你得会 给自己的一些忠告 第一件事:分清阶段,制定计划 第二件事:梳理…...
Linux Crontab命令定时任务基本语法与操作教程
Linux Crontab命令定时任务基本语法与操作教程 一、Crontab查看编辑重启 1、查看crontab定时执行任务列表 crontab -l 2、编辑crontab定时执行任务 crontab -e 3、删除crontab定时任务 crontab -r 4、相关命令: sudo service crond start #启动服务 sudo …...
文档测试要测什么,如何进行测试?
文档测试要测什么,如何进行测试? 对于交付用户文档来说,以需求、用户手册、安装手册等为主,检查用户文档是否和实际的存在差别,主要从以下几个方面来考虑: 阅读者:文档面向的读者定位要清晰&…...
.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() 实现自定义 语法: SELECT * from table_name ORDER BY FIELD(str,str1,str2,str3,…) str: 字段名, str1,str2,str3: 自定义排序的数值 例1排序-所有值: 先姓名排序后出生日期排序 SELECT * from name_info ORDER BY FIELD(name…...
FFMPEG自学二 ⾳频编码实战
一、FFmpeg编码流程二、流程关键函数avcodec_find_encoder:根据指定的AVCodecID查找注册的编码器。 avcodec_alloc_context3:为AVCodecContext分配内存。 avcodec_open2:打开编码器。 avcodec_send_frame:将AVFrame⾮压缩数据给…...
一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人
2月21日,湖北一致魔芋生物科技股份有限公司(下称“一致魔芋”,BJ:839273)在北京证券交易所上市。本次上市,一致魔芋的发行价为11.38元/股,发行1350万股,募资总额约为1.54亿元。 本次发行后&…...
进程或线程终止是否会释放锁
线程锁的必要性比如一个多线程抢票程序,tickets作为临界资源,所有的线程都要对它进行判断ticket是否大于0,以及ticket–的操作。用ticket–操作举例,虽然他看起来是一行C语言的代码,但是实际上它的底层汇编经历了三个阶…...
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 配置文件与发布订阅
目录 配置文件 一,Units 二, INCLUDE 三,NETWORK 1, bind 2, tcp-backlog 3,timeout 4, tcp-keepalive 四,GENERAL 1,daemonize 2, pidfile 3&…...
ChatGPT来了,英语不能丢,但我不想上班
文 / 谷雨(微信公众号:王不留) 好久没写文,可能大伙已把我忘了。春节之后,状态一直不太好。我在2月1号时从老家直接来到了深圳出差,而后以996的工作状态疲于应付工作中的各种问题。 终于这周末休息了两天&a…...
【LeetCode】二叉树的直径 [E](二叉树)
543. 二叉树的直径 - 力扣(LeetCode) 一、题目 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例 : 给定二叉树 1 / \ 2 3 …...
Mybatis框架详解(全)
目录 MyBatis简介 MyBatis整体架构及运行流程 1.数据源配置文件 2.Sql映射文件 3.会话工厂与会话 4.运行流程 mybatis实现增删改查 Mybatis的获取参数的方式 mapper中自定义映射 mybatis注解开发 mybatis缓存 mybatis分页插件 MyBatis简介 MyBatis 是一款优秀的持久…...
2023年爆火的csgo搬砖项目详细拆解,steam搬砖长期稳定
不懂的同学可以听我下面慢慢道来 我的态度:存在即有意义,没有长久的赚钱项目,但是一定有长久赚钱的人。 我们团队也一直在做这个项目,赚钱是一定的,简单总结:执行力技巧量化。 开门见山 一、steam搬砖项…...
C语言实现动态管理通讯录信息系统(静态通讯录plus版)
文章目录前言:一.动态管理思想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…...
拒绝背锅:测试项目中的风险管理一定要知道
测试经理除了要管理产品线的质量保障和日常部门事务工作外,另一项比较重要的就是测试项目全流程的管理。 今天不聊整体的测试项目流程如何开展,而是想聊一聊在同行中比较高频出现的一个字眼:风险管理。 什么是风险管理 引用百度上的解释&a…...
20-js本地存储
js本地存储 localStorage localStorage是window下的对象,可以使用window.localStorage调用,也可以直接使用localStorage调用。 浏览器关闭,localStorage也不会消失 示例: <body><h2>localStorage</h2><…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
