MinIO框架安装使用+实现上传需求

MinIO框架

  • 什么是MinIO框架
  • 如何安装(Docker版)
    • 安装步骤
      • 1. 查询MinIO的服务版本
      • 2. 拉取MinIO
      • 3.启动
        • 报错在docker中没有操作文件的权限
      • 4. 访问
  • 简单配置
    • 1.找到创建用户界面
    • 2. 设置用户信息
    • 3. 创建一个桶
  • 使用MinIO
    • 依赖搭建
    • MinIO的初始化
    • API
      • 存储桶的基本操作
        • 1. 检查桶是否存在
        • 2. 创建存储桶
        • 3. 查询所有桶的列表信息
        • 4. 删除存储桶
      • 对象的基本操作
        • 上传对象
          • PutObject方法
        • 获取对象
          • getObject方法
          • downloadObject方法
          • getPresignedObjectUrl方法
          • getPresignedPostFormData方法
        • 复制对象
          • copyObject方法
        • 删除对象
          • removeObject方法
          • removeObjects方法
        • 桶对象的信息查询
          • 查询桶下对象
          • 递归查询桶下对象
          • 条件查询
  • 总结

什么是MinIO框架

前置知识:对象存储

对象存储服务( Object Storage Service,OSS ):
是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。
容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

MinIO对象存储系统是为海量数据存储、人工智能、大数据分析而设计,基于Apache License v2.0开源协议的对象存储系统,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。

通常在企业中我们会将一些图片,视频,文档等相关数据存储在对象存储中,常见的对象存储服务有阿里云的OSS对象存储、FastDFS分布式文件系统以及公司的私有云平台等等,以便于数据的存储和快速获取。但随着业务的快速发展,我们需要存储一些身份信息用于审核和实名相关的数据,这部分数据较为敏感,因此对于敏感数据的存储也可以选择Minio来进行自建服务。

如何安装(Docker版)

MinIO安装非常的简单,在网上你很少会看到有关于MinIo的安装问题,所以基本上你去搜一下就能很容易成功安装,在这里我采用的是Docker去安装它。
但是Docker中会有一些坑在,我基本上凭实力全踩上一遍,所以你跟着我去安装,基本不会出什么问题 。

安装步骤

1. 查询MinIO的服务版本

docker search minio

2. 拉取MinIO

docker pull minio/minio
下载稳定版本的镜像
下载后使用docker images查看下载的镜像

操作如下图所示
在这里插入图片描述

3.启动

注意端口要起两个(一个9090,一个9000)!!!查了2个小时!!!
下面的代码不能完全套用,关于用户名,密码,数据卷的绑定记得

docker run -d -p 9000:9000 -p 9090:9090 --name=minio --restart=always -e "MINIO_ROOT_USER=xxx" -e "MINIO_ROOT_PASSWORD=xxx" -v /home/data:/data -v /home/config:/root/.minio  minio/minio server /data --console-address ":9000" --address ":9090"

报错在docker中没有操作文件的权限

docker: Error response from daemon: Mounts denied: 
The path /home/data is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/desktop/mac for more info.

解决:

  1. 打开Docker客户端的首选项(Preference)
  2. 找到 Resources下的 FILE SHARING
  3. 配置你允许让Docker访问使用的目录

在这里插入图片描述
然后就大功告成!!!
在这里插入图片描述

4. 访问

注意我们访问的地址为:http://127.0.0.1:9090
然后输入用户名和密码就可以登录进去了。

简单配置

1.找到创建用户界面

在导航栏中找到identity/user处创建一个用户,点击create user按钮
在这里插入图片描述

2. 设置用户信息

用户名密码以及权限写完之后,就可以使用该用户登录MinIO控制台了。
在这里插入图片描述
创建用户之后,点击用户弹出用户的基本信息,点击导航栏中的Service Accounts,出现下面的界面

在这里插入图片描述
点击右边的Create Access Key,系统会随机生成Create Access Key,点击create按钮后,会展示出它们的信息,这时记得将它们复制粘贴到你的笔记或者存储文件中,后续使用代码上传文件时需要用到这两个key。
在这里插入图片描述

3. 创建一个桶

在页面导航栏中找到Administrator/Buckets,点击右上角创建桶按钮
在这里插入图片描述
然后输入桶的名字,就大功告成了!
在这里插入图片描述

使用MinIO

依赖搭建

 <!-- minio依赖--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.3</version></dependency><!-- 官方 miniodemo需要的依赖--><dependency><groupId>me.tongfei</groupId><artifactId>progressbar</artifactId><version>0.7.4</version></dependency><!-- 这个依赖最好是在4.8.1以上,就用下面这个一般不出什么问题--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.2</version></dependency>

MinIO的初始化

MinioClient minioClient =MinioClient.builder().endpoint("https://play.min.io").credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG").build();
  • builder:用于构建一个Minio客户端的配置对象
  • endpoint:指定Minio服务的URL地址和端口号
  • credentials:提供认证凭证,这里使用的是用户名(admin)和密码(xxx)
  • build:客户端的创建
    我们获取到的了MinIOClient对象,就可以进行MinIo的API操作。

API

存储桶的基本操作

1. 检查桶是否存在

  • boolean bucketExists(BucketExistsArgs args):检查存储桶是否存在(注意里面的参数还需要创建)
    代码如下:
    public final static String endPoint = "xxx";public final static String accessKey = "xxxx";public final static String secretKey = "xxxx";public final static String BucketName = "xxxx";public static void uploadFile() throws  InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException  {try {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey,secretKey).build();// 存储桶的基本使用,新版需要使用build来构造BucketExistsArgs对象BucketExistsArgs existsArgs = BucketExistsArgs.builder().bucket(BucketName).build();boolean existBucketFlag = minoClient.bucketExists(existsArgs);System.out.println("桶是否存在:"+existBucketFlag);} catch (MinioException e) {System.out.println("Error occurred: " + e);}}

2. 创建存储桶

  • public void makeBucket(MakeBucketArgs args):创建一个启用给定区域和对象锁定功能的存储桶。
    代码如下:
   public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey,secretKey).build();// 创建存储桶String bucketName="wang";//存储桶不存在则创建  if(!minoClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())){MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();minoClient.makeBucket(makeBucketArgs);System.out.println("创建存储桶成功"+bucketName);}else{System.out.println("已存在");}}
}

结果如下:
在这里插入图片描述

3. 查询所有桶的列表信息

  • public List listBuckets():列出所有桶的桶信息
    代码如下:
 public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey,secretKey).build();List<Bucket> buckets = minoClient.listBuckets();buckets.forEach(bucket -> {System.out.println("存储桶名称:"+bucket.name()+"存储时间"+bucket.creationDate());});}

注意:桶的创建时间默认是美国时间,创建桶时我们可以指定桶的时区或者设置 MinIO服务器时区。
结果如下:
在这里插入图片描述

4. 删除存储桶

  • public void removeBucket(RemoveBucketArgs args):删除一个空桶
    注意,如果存储桶不是空桶,删除会报错
    代码如下:
    public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey,secretKey).build();String bucketName = "wang";RemoveBucketArgs bucketArgs=RemoveBucketArgs.builder().bucket(bucketName).build();if(minoClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {minoClient.removeBucket(bucketArgs);System.out.println("删除存储桶成功!"+bucketName);}else {System.out.println("存储桶不存在,无法删除");}}

对象的基本操作

上传对象

PutObject方法
  • public ObjectWriteResponse putObject(PutObjectArgs args):将给定的流上传为存储桶的对象
    InputStream上传:
    public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey,secretKey).build();String bucketName= "testdemo";//创建InputStream上传File file = new File("D:\\testUploadFile\\test1.webp");InputStream inputStream = new FileInputStream(file);long start = System.currentTimeMillis();//上传流minoClient.putObject(PutObjectArgs.builder().bucket(bucketName).object("one/"+file.getName()).stream(inputStream,inputStream.available(),-1).build());inputStream.close();long over = System.currentTimeMillis();System.out.println("uploaded successfully 耗时:"+(over-start));}

结果如下:
在这里插入图片描述
需要注意几个点:

  • 添加的Object大小不能超过 5GB。
  • 默认情况下,如果已存在同名Object且对该Object有访问权限,则新添加的Object将覆盖原有的Object,并返回 200 OK。
  • OSS没有文件夹的概念,所有资源都是以文件来存储,但您可以通过创建一个以正斜线(/)结尾,大小为 0的Object来创建模拟文件夹(指定 /后,默认会自动创建)。
  • 上传文件是也可以使用SSE-C加密,添加自定义元数据及消息头等操作。

获取对象

getObject方法
  • public GetObjectResponse getObject(GetObjectArgs args):获取对象的数据
    代码如下:
    public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();String bucketName = "testdemo";GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(bucketName).object("one/test1.webp").build();GetObjectResponse objectResponse = minoClient.getObject(getObjectArgs);System.out.println(objectResponse.bucket());System.out.println(objectResponse);}

结果如下:
在这里插入图片描述

downloadObject方法
  • public void downloadObject(downloadObjectArgs args):将对象的数据下载到磁盘。
        //将对象数据下载到磁盘DownloadObjectArgs objectArgs = DownloadObjectArgs.builder().bucket(bucketName).object("one/test1.webp").filename("D:\\testUploadFile\\download\\test1.webp").build();minoClient.downloadObject(objectArgs);

结果
在这里插入图片描述

getPresignedObjectUrl方法
  • public String getPresignedObjectUrl(GetPresignedObjectUrlArgs args):获取HTTP方法,到期时间和自定义请求参数的对象的预签名URL。
    这个方法的用途在于:
    可以提供给不用登录进行图片浏览,第三方共享访问等。
    我们还可以对返回 URL,根据业务做一些参数验签等控制。
    代码如下:
    public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();String bucketName = "testdemo";GetPresignedObjectUrlArgs urlArgs = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object("one/test1.webp").method(Method.GET).expiry(120, TimeUnit.SECONDS).build();String presignedObjectUrl = minoClient.getPresignedObjectUrl(urlArgs);System.out.println(presignedObjectUrl);}

结果如下
http://127.0.0.1:9090/testdemo/one/test1.webp?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=wang%2F20230829%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230829T032634Z&X-Amz-Expires=120&X-Amz-SignedHeaders=host&X-Amz-Signature=aa1bbaac4906eeac505cd2602954973ab99189f4674570f078f412b6e7dc7109
返回带签名的URL有点小长,过期之后访问会报错。

getPresignedPostFormData方法
  • public Map<String,String> getPresignedPostFormData(PostPolicy policy):获取对的PostPolicy的表单数据以使用POST方法上传其数据。
  • 使用此方法,获取对象的上传策略(包含签名、文件信息、路径等),然后使用这些信息采用 POST 方法的表单数据上传数据。也就是可以生成一个临时上传的信息对象,第三方可以使用这些信息,就可以上传文件。
    注意:第三方请求中的签名必须和 创建策略中的签名参数等一致,不符合策略要求的就会上传失败。
    一般使用场景:
  1. 第三方请求应用服务器接口,来获取一个上传策略信息
  2. 第三方使用 Http+访问策略信息直接请求应用服务器接口进行上传文件。

代码如下:

public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();String bucketName = "testdemo";String objectName = "one/test2.webp";//1.为存储桶创建一个上传策略,过期时间为7天PostPolicy policy = new PostPolicy(bucketName, ZonedDateTime.now().plusDays(7));//设置一个参数key-value,值为上传对象的名称(保留为桶中的名字)policy.addEqualsCondition("key",objectName);//添加 Content-Type以”image/“开头,表示只能上传照片policy.addStartsWithCondition("Content-Type","image/");//设置上传文件的大小 10 KiB to 10MiBpolicy.addContentLengthRangeCondition(10*1024,10*1024*1024);//2. 获取策略的认证令牌,签名等信息Map<String, String> formData = minoClient.getPresignedPostFormData(policy);//3. 模拟第三方,使用OkHttp调用Post上传对象//创建MultipartBody对象MultipartBody.Builder multipartBuilder = new MultipartBody.Builder();multipartBuilder.setType(MultipartBody.FORM);for (Map.Entry<String,String> entry : formData.entrySet()){multipartBuilder.addFormDataPart(entry.getKey(),entry.getValue());}multipartBuilder.addFormDataPart("key",objectName);multipartBuilder.addFormDataPart("Content-Type","image/webp");//todoFile uploadFile =new File("D:\\testUploadFile\\test2.webp");multipartBuilder.addFormDataPart("file",objectName, RequestBody.create(uploadFile,null));Request request =new Request.Builder().url(endPoint+bucketName).post(multipartBuilder.build()).build();OkHttpClient httpClient = new OkHttpClient().newBuilder().build();Response response = httpClient.newCall(request).execute();if(response.isSuccessful()){System.out.println("successfully");}else{System.out.println("error");}}

结果:
在这里插入图片描述

复制对象

copyObject方法
  • public ObjectWriteResponse copyObject(CopyObjectArgs args):通过服务器端从另一个对象复制数据来创建一个对象。
    代码如下:
  public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();String bucketName = "testdemo";String bucketName2 = "hao";CopyObjectArgs objectArgs = CopyObjectArgs.builder().source(CopySource.builder().bucket(bucketName).object("one/test2.webp").build()).bucket(bucketName2).object("two/test1.webp").build();minoClient.copyObject(objectArgs);}

结果如下:
在这里插入图片描述

删除对象

removeObject方法
  • public void removeObject(RemoveObjectArgs args):移除一个对象。
    代码如下:
    public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().bucket(BucketName).object("one/test2.webp").build();minoClient.removeObject(objectArgs);}

结果如下:
在这里插入图片描述

removeObjects方法
  • public Iterable removeObjects(RemoveObjectsArgs args):懒惰地删除多个对象。它需要迭代返回的 Iterable 以执行删除。
    代码如下:
        //构建需要删除的对象List<DeleteObject> objects = new LinkedList<>();objects.add(new DeleteObject("2023/07/05/1189f7file01.jfif"));objects.add(new DeleteObject("onetest1.webp"));objects.add(new DeleteObject("onetest3.webp"));RemoveObjectsArgs objectsArgs = RemoveObjectsArgs.builder().bucket(BucketName).objects(objects).build();Iterable<Result<DeleteError>> results = minoClient.removeObjects(objectsArgs);

结果如下:
在这里插入图片描述

桶对象的信息查询

查询桶下对象
  • public Iterable listObjects(ListObjectsArgs args):列出桶的对象信息。
    代码如下:
  public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(BucketName).build();Iterable<Result<Item>> results = minoClient.listObjects(listObjectsArgs);for (Result<Item> result : results) {Item item = result.get();System.out.println(item.objectName()+"\t"+item.size());}}

结果如下:
在这里插入图片描述

递归查询桶下对象

代码如下:

  public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(BucketName).recursive(true).build();Iterable<Result<Item>> results = minoClient.listObjects(listObjectsArgs);for (Result<Item> result : results) {Item item = result.get();System.out.println(item.objectName()+"\t"+item.size());}}

结果如下:
在这里插入图片描述

条件查询

代码如下:

 public static void uploadFile() throws InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, ServerException {// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象MinioClient minoClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder().bucket(BucketName).startAfter("VipSongsDownload/陶喆 - 爱是个什么东西.mflac").maxKeys(10).recursive(true).build();Iterable<Result<Item>> results = minoClient.listObjects(listObjectsArgs);for (Result<Item> result : results) {Item item = result.get();System.out.println(item.objectName()+"\t"+item.size());}}

在这里插入图片描述

总结

这里列举了一些基本的用法,后面需求方面的慢慢更

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

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

相关文章

SaaS多租户系统架构设计

前言&#xff1a;多租户是SaaS&#xff08;Software-as-a-Service&#xff09;下的一个概念&#xff0c;意思为软件即服务&#xff0c;即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上&#xff0c;客户可以根据工作的实际需求&#xff0c;通过互联网…

二级MySQL(十)——单表查询

这里我们只在一个表内查询&#xff0c;用到的是较为简单的SELECT函数形式 1、查询指定的字段&#xff1a; 用到的数据库是之前提到的S、P、SP数据库 S表格用到的总数据&#xff1a; 首先我们查询所有供应商的序号和名字 这时都是独立的&#xff0c;没有关系&#xff0c;我们找…

Acwing796.子矩阵的和

理解二维前缀和&#xff1a; #include <iostream>using namespace std;const int N 1010;int a[N][N], s[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1; i < n; i)for (int j 1; j < m; j) {scanf("%d", &a…

SpringBoot的自动装配源码分析

文章目录 一&#xff1a;什么是自动装配二、springboot的启动流程1.调用SpringApplication&#xff08;&#xff09;的构造方法2.执行核心run方法&#xff08;&#xff09;3.执行核心prepareContext&#xff08;&#xff09;4.执行核心refreshContext&#xff08;&#xff09;5…

机房安全之道:构筑坚固的网络防线

引言&#xff1a; 在数字化时代&#xff0c;机房成为了许多组织和企业的核心基础设施&#xff0c;承载着重要的数据和应用。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;机房的安全性显得尤为重要。本文将深入探讨如何构建坚固的网络防线&#xff0c;保护机房免受攻击的方…

测试理论与方法----测试流程的第四个步骤:执行测试,提出缺陷

8、执行测试—–>提交缺陷报告 测试流程&#xff1a;执行测试—–>提交缺陷报告 1、缺陷的概述&#xff08;回顾&#xff09; 结果角度&#xff1a;实际结果和预期结果不一致 需求角度&#xff1a;所有不满足需求或超出需求的&#xff0c;都是缺陷 2、缺陷的相关属性…

基于React实现无限滚动的日历详细教程,附源码【手写日历教程第二篇】

前言 最常见的日历大部分都是滚动去加载更多的月份&#xff0c;而不是让用户手动点击按钮切换日历月份。滚动加载的交互方式对于用户而言是更加丝滑和舒适的&#xff0c;没有明显的操作割裂感。 那么现在需要做一个这样的无限滚动的日历&#xff0c;前端开发者应该如何去思考…

设计模式--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

requests之post请求data传参和json传参区别

问题描述 在一次接口post测试请求传参异常的记录 print(header)rp requests.post(EvnUrlConfig.getUrl(url),headersheader,datauserDevcieParam)传输到后台服务器报了异常 原因分析&#xff1a; 显而易见我的请求头的content-type类型有异常了&#xff0c;但我明明传的是app…

如何利用人工智能实现软件测试的左移

在本文中&#xff0c;我们&#xff08;作者&#xff09;探讨了如何利用人工智能的力量&#xff0c;在软件测试领域实现左移。 用AI驱动的创新变革测试领域 测试在确保应用程序质量和可靠性方面发挥着至关重要的作用。然而&#xff0c;随着测试要求变得越来越复杂&#xff0c;人…

2023年最新版Windows环境下|Java8(jdk1.8)安装教程

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 jdk1.8的下载和使用总共分为3个步骤&#xff1a; jdk1.8的下载、jdk1.8的安装、配置环境变量。 目录 一、jdk1.8下载…

C#,《小白学程序》第五课:队列(Queue)

日常生活中常见的排队&#xff0c;软件怎么体现呢&#xff1f; 排队的基本原则是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先进先出 1 文本格式 /// <summary> /// 《小白学程序》第五课&#xff1a;队列&#xff08;Queue&#xff09; /// 日常生活中常见…

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源&#xff08;图片、JS、CSS&#xff09;&#xff0c; WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下&#xff0c;完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…

【LeetCode-中等题】2. 两数相加

文章目录 题目方法一&#xff1a;借助一个进制位&#xff0c;以及更新尾结点方法一改进&#xff1a;相比较第一种&#xff0c;给head一个临时头节点&#xff08;开始节点&#xff09;&#xff0c;最后返回的时候返回head.next&#xff0c;这样可以省去第一次的判断 题目 方法一…

北大C++课后记录:自增、自减运算符重载的小Demo

前言 自增、自减运算符有前置&#xff08;x&#xff09;和后置&#xff08;x&#xff09;之分&#xff0c;为了对其进行区分&#xff0c;C规定&#xff1a; 前置运算符作为一元运算符进行重载&#xff1a;&#xff08;注意T1对象和T2对象是有差异的&#xff09; 后置运算符作…

打造抖音小店的用户黏性:六大策略助你脱颖而出

要提高抖音小店的用户黏性&#xff0c;即增加用户对店铺的依赖和留存&#xff0c;不若与众科技为你介绍可以从以下几个方面入手&#xff1a; 1. 提供个性化推荐&#xff1a;抖音小店可以通过算法分析用户的兴趣和行为&#xff0c;为用户提供个性化的商品推荐。通过了解用户的购…

Git 中的 HEAD

1、Git HEAD 存放位置 HEAD 指的就是 .git/HEAD 文件&#xff0c;它存储着当前分支的名字&#xff0c;我们可以打这个文件看一看&#xff1a; ref: refs/heads/master由此&#xff0c;我们可以得知当前所处于 master 分支。 如果我们继续往下走&#xff1a;打开 refs/heads/…

SpringBoot与前端交互遇到的一些问题

一、XXX.jar中没有主清单属性 场景&#xff1a; SpringBoot打的jar包在Linux运行报错 解决方案&#xff1a; 百度找了很多都是一样的答案&#xff0c;但是解决不了我的问题&#xff0c;于是我新建了一个springboot项目发现打的jar包可以在Linux上运行。检查了下只要把下面这2个…

对称二叉树判断

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 对称二叉树判断 题目要求 题目链接 示例 解答 方法一、 递归法 实现思路 使用到了判断两棵二叉树是否相等的方法&#xff0c;只不过对称二叉树…

SpringBoot实现简单的登录验证码

参考了一些资料&#xff0c;完成了这个验证码的功能&#xff0c;下面记录一下功能的实现过程。 一、效果图 二、实现原理 后台生成验证码图片&#xff0c;将图片传到前台。后台在session中保存验证码内容。前台输入验证码后传到后台在后台取出session中保存的验证码进行校验。…