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

Spring Boot | 基于MinIO实现文件上传和下载

关注:CodingTechWork

介绍

  在现代的 web 应用中,文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务,可以用来存储和管理大量的非结构化数据,如图片、视频、日志文件等。本文将介绍如何在 Spring Boot 应用中,结合 MinIO 来实现文件的上传和下载功能,并使用 Feign 客户端进行远程调用文件上传和下载的服务。

MinIO 相关介绍

  MinIO 是一个高性能的分布式对象存储系统,兼容 Amazon S3 API,通常用于存储和管理大量非结构化数据,如图片、视频、备份、日志等。它提供了与 S3 完全兼容的 API,使得开发者能够使用相同的工具和库与其进行交互。MinIO 被设计为云原生,适用于在 Docker、Kubernetes 和虚拟机中运行。

MinIO 特点

  1. 高性能:支持高吞吐量、高并发的读写操作,适用于需要大规模数据存储的应用。
  2. S3 兼容:MinIO 实现了完整的 Amazon S3 API,支持通过现有的 S3 客户端、SDK 和工具来进行交互。
  3. 高可扩展性:支持水平扩展,支持分布式部署,能够在多台机器上运行并提供统一的对象存储服务。
  4. 轻量级:MinIO 是一个轻量级的应用程序,易于部署和管理,可以在资源受限的环境中运行(如单机或者小型集群)。
  5. 支持对象加密:MinIO 支持对象级加密,可以为上传到存储中的对象加密,保证数据安全。
  6. 支持版本控制:MinIO 支持对象版本管理,允许对存储中的文件进行版本控制。

MinIO 核心概念

桶(Bucket)

  1. 在 MinIO 中,桶类似于文件系统中的文件夹。每个桶用于存储一组对象。
  2. 每个桶都可以有独立的权限配置。
  3. 存储在桶中的对象有唯一的标识符(通常是对象的文件名)。

对象(Object)

  1. 对象是 MinIO 存储的基本单位,类似于文件系统中的文件。
  2. 对象由数据和元数据组成,可以是任何类型的数据,如文本、图像、视频等。

对象键(Object Key)

  1. 对象键是对象在桶中的唯一标识符,通常对应于文件名。

访问密钥和密钥(Access Key & Secret Key)

  1. MinIO 使用访问密钥(Access Key)和密钥(Secret Key)进行身份验证,类似于 S3。
  2. 用户可以配置访问密钥和密钥以确保数据的访问权限。

MinIO API 介绍

  MinIO 的 API 设计遵循 S3 API,几乎所有 S3 的 API 都可以在 MinIO 中使用。以下是 MinIO 支持的常见操作和 API:

Bucket 操作

  1. 创建桶(Create Bucket):创建一个新桶来存储对象。
minioClient.makeBucket("mybucket");
  1. 列举桶(List Buckets):获取当前 MinIO 实例中所有存在的桶。
List<Bucket> buckets = minioClient.listBuckets();
  1. 检查桶是否存在(Bucket Exists):检查桶是否存在。
boolean exists = minioClient.bucketExists("mybucket");
  1. 删除桶(Delete Bucket):删除桶(桶必须为空才能删除)。
minioClient.removeBucket("mybucket");

对象操作

  1. 上传对象(Put Object):上传一个文件到 MinIO 中指定的桶。
minioClient.putObject("mybucket", "myfile.txt", fileInputStream, fileSize, null, null, "application/octet-stream");
  1. 获取对象(Get Object):从指定桶中获取对象内容。
InputStream inputStream = minioClient.getObject("mybucket", "myfile.txt");
  1. 删除对象(Remove Object):删除 MinIO 存储桶中的某个对象。
minioClient.removeObject("mybucket", "myfile.txt");
  1. 列举对象(List Objects):列举桶中的所有对象(可以按前缀过滤)。
Iterable<Result<Item>> objects = minioClient.listObjects("mybucket");
for (Result<Item> result : objects) {Item item = result.get();System.out.println("Object name: " + item.objectName());
}
  1. 获取对象元数据(Stat Object):获取对象的元数据,如大小、最后修改时间等。
StatObjectResponse stat = minioClient.statObject("mybucket", "myfile.txt");
System.out.println("Object size: " + stat.size());

文件下载

  1. 下载对象(Get Object):从 MinIO 中下载一个对象,并将其存储到本地文件系统。
minioClient.getObject("mybucket", "myfile.txt", Paths.get("/path/to/destination"));

对象版本控制

  1. 启用版本控制:启用桶的版本控制功能。
minioClient.enableBucketVersioning("mybucket");
  1. 获取对象版本(Get Object Version):获取对象的指定版本。
InputStream inputStream = minioClient.getObject("mybucket", "myfile.txt", "versionId");
  1. 删除对象版本(Remove Object Version):删除某个版本的对象。
minioClient.removeObject("mybucket", "myfile.txt", "versionId");

权限管理

  MinIO 支持基于用户的权限控制,可以通过配置桶的访问策略来管理谁可以访问存储中的对象。

  1. 设置桶的访问权限(Bucket Policy):设置桶的访问权限来限制用户对对象的访问。
String policy = "{ \"Version\": \"2025-01-07\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"AWS\": \"*\" }, \"Action\": [ \"s3:GetObject\" ], \"Resource\": [ \"arn:aws:s3:::mybucket/*\" ] } ] }";
minioClient.setBucketPolicy("mybucket", policy);

MinIO 安全性特性

  1. 加密:
    MinIO 支持两种类型的加密:服务端加密(SSE)客户端加密(CSE)。服务端加密会在对象上传到 MinIO 时自动对其进行加密。
  2. 身份验证与授权:
    MinIO 使用访问密钥(Access Key)密钥(Secret Key)来进行身份验证。用户可以通过配置 MinIO 的访问控制列表(ACL)来限制谁可以访问桶和对象。
  3. TLS/SSL 支持:
    MinIO 支持通过 TLS(即 HTTPS)加密通信来保护数据传输安全。

项目结构

本项目的文件上传和下载功能将分成两个部分:

  1. minio 服务端(本地服务处理文件上传)
  2. Feign 客户端(模拟远程文件上传请求)
file-upload-demo
│
├── src/main/java/com/example/fileupload
│   ├── controller
│   │   └── FileController.java
│   ├── service
│   │   └── FileService.java
│   ├── feign
│   │   └── FileFeignClient.java
│   ├── FileUploadDemoApplication.java
│   └── ...
├── pom.xml
└── resources└── application.properties

Maven 依赖

在 pom.xml 中添加以下依赖:

<dependencies><!-- Spring Boot Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Feign 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- minio 客户端依赖 --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.5</version></dependency><!-- 文件上传需要的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
</dependencies>

同时,在 application.properties 中配置文件上传大小限制:

properties配置文件

# MinIO 配置
minio.url=http://localhost:9000
minio.access-key=your-access-key
minio.secret-key=your-secret-key
minio.bucket-name=mybucket# 文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

代码示例

MinIO 配置

创建一个 MinIO 配置类来初始化 MinIO 客户端。
MinioConfig.java

package com.example.fileupload.config;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinioConfig {@Value("${minio.url}")private String minioUrl;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;@Beanpublic MinioClient minioClient() {try {MinioClient minioClient = MinioClient.builder().endpoint(minioUrl).credentials(accessKey, secretKey).build();// 如果桶不存在则创建桶boolean isExist = minioClient.bucketExists(bucketName);if (!isExist) {minioClient.makeBucket(bucketName);}return minioClient;} catch (Exception e) {throw new RuntimeException("初始化 MinIO 客户端失败", e);}}
}

Controller 层:文件上传与下载接口

  在 Controller 层,我们定义文件上传和下载的接口。上传文件时将文件存储到 MinIO 中,下载文件时从 MinIO 拉取文件。
FileController.java

package com.example.fileupload.controller;import com.example.fileupload.service.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@RestController
@RequestMapping("/api/files")
public class FileController {@Autowiredprivate FileService fileService;// 文件上传接口@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {try {String fileUrl = fileService.uploadFile(file);return ResponseEntity.ok("文件上传成功: " + fileUrl);} catch (IOException e) {return ResponseEntity.status(500).body("文件上传失败: " + e.getMessage());}}// 文件下载接口@GetMapping("/download/{filename}")public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String filename) {try {InputStreamResource resource = fileService.downloadFile(filename);return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + filename).contentType(MediaType.APPLICATION_OCTET_STREAM).body(resource);} catch (IOException e) {return ResponseEntity.status(500).body(null);}}
}

Service 层:文件处理业务

  在 Service 层,我们定义实际的文件处理逻辑,包括文件上传和下载。我们使用 MultipartFile 来接收文件,并将其保存到服务器上。
FileService.java

package com.example.fileupload.service;import io.minio.MinioClient;
import io.minio.errors.MinioException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;@Service
public class FileService {@Autowiredprivate MinioClient minioClient;private final String bucketName = "mybucket";  // 从配置中加载桶名// 文件上传方法public String uploadFile(MultipartFile file) throws IOException {try {// 获取文件输入流InputStream fileInputStream = file.getInputStream();// 上传文件到 MinIOminioClient.putObject(bucketName, file.getOriginalFilename(), fileInputStream, file.getSize(), null, null, "application/octet-stream");return "http://localhost:9000/" + bucketName + "/" + file.getOriginalFilename();  // MinIO 文件 URL} catch (MinioException | IOException e) {throw new IOException("上传文件失败", e);}}// 文件下载方法public InputStreamResource downloadFile(String filename) throws IOException {try {// 获取文件输入流InputStream fileInputStream = minioClient.getObject(bucketName, filename);return new InputStreamResource(fileInputStream);} catch (MinioException | IOException e) {throw new IOException("下载文件失败", e);}}
}

Feign 客户端:远程调用文件上传下载服务

  Feign 是一个声明式的 HTTP 客户端,它简化了 HTTP 请求的调用过程。在这个例子中,我们使用 Feign 来调用远程的文件上传和下载接口。
FileFeignClient.java

package com.example.fileupload.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;@FeignClient(name = "file-upload-service", url = "http://localhost:8080/api/files")
public interface FileFeignClient {@PostMapping("/upload")String uploadFile(@RequestParam("file") MultipartFile file);@GetMapping("/download/{filename}")byte[] downloadFile(@PathVariable("filename") String filename);
}

Feign 使用示例

  在 Service 层,我们可以使用 Feign 客户端来调用远程的文件上传和下载接口。
FileService.java(使用 Feign 上传下载文件)

package com.example.fileupload.service;import com.example.fileupload.feign.FileFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;@Service
public class FileService {@Autowiredprivate FileFeignClient fileFeignClient;// 使用 Feign 上传文件public String uploadFileViaFeign(MultipartFile file) {return fileFeignClient.uploadFile(file);}// 使用 Feign 下载文件public byte[] downloadFileViaFeign(String filename) {return fileFeignClient.downloadFile(filename);}
}

总结

  本文通过详细的代码示例,展示了如何将 MinIO 集成到 Spring Boot 中,来实现文件的上传和下载。通过 Feign 客户端的远程调用,可以将文件上传和下载的请求发送到远程服务中进行处理。

参考资料
Spring Boot 官方文档
Spring Cloud Feign 官方文档

相关文章:

Spring Boot | 基于MinIO实现文件上传和下载

关注&#xff1a;CodingTechWork 介绍 在现代的 web 应用中&#xff0c;文件上传和下载是常见的需求。MinIO 是一个开源的高性能分布式对象存储服务&#xff0c;可以用来存储和管理大量的非结构化数据&#xff0c;如图片、视频、日志文件等。本文将介绍如何在 Spring Boot 应用…...

【DNS 阿里云,域名解析,解析到IP的指定端口】

- 进入 阿里云域名解析界面 - 点击 解析设置 - 添加记录 1.添加一条 A/AAAA 类型解析你的服务器的IP地址&#xff08;不需要带端口号&#xff0c;这条解析只是起到中转作用&#xff09; 示例&#xff1a;主机记录&#xff1a;aa.bb.com 记录值&#xff1a;xxx.xxx.xxx.xxx (…...

力扣经典二分题:4. 寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 一、题目分析 这道题目是让我们在 两个正序的数组中寻找中位数已知两个数组的大小分别是&#xff1a;int m nums1.size(),n nums2.size();中位数性质1&#xff1a;中位数左侧元素 …...

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架&#xff0c;它简化了 JPA 的实现&#xff0c;为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时&#xff0c;开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…...

PySpark用sort-merge join解决数据倾斜的完整案例

假设有两个大表 table1 和 table2 &#xff0c;并通过 sort-merge join 来解决可能的数据倾斜问题。 from pyspark.sql import SparkSession from pyspark.sql.functions import col# 初始化SparkSession spark SparkSession.builder.appName("SortMergeJoinExample&quo…...

【2025 Rust学习 --- 11 实用工具特型01】

清理特型Drop 当一个值的拥有者消失时&#xff0c;Rust 会丢弃&#xff08;drop&#xff09;该值。丢弃一个值就必须释放 该值拥有的任何其他值、堆存储和系统资源。 丢弃可能发生在多种情况下&#xff1a; 当变量超出作用域时&#xff1b;在表达式语句的末尾&#xff1b;当…...

关于Linux PAM模块下的pam_listfile

讲《Linux下禁止root远程登录访问》故事的时候&#xff0c;说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。 下面这些就好比人物的简介&#xff0c;甚是恼人&#xff1b;让人看得不明就里&#xff0c;反正“他大舅他二舅都是他舅”。可以直接跳…...

根据中文名称首字母进行分组

很多项目中&#xff0c;需要用到中文名称到首字母进行分组&#xff0c;例如&#xff1a;城市、游戏等等。。。 /*** 将集合数据按照汉字首字母分组排序** param list* return*/public Map<String, Object> screenManufacturer(List<Game> list) {Set<String>…...

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…...

人工智能-数据分析及特征提取思路

1、概况 基于学生行为数据预测是否涉黄、涉黑等。 2.数据分析 数据分析的意义包括得到数据得直觉、发掘潜在的结构、提取重要的变量、删除异常值、检验潜在的假设和建立初步的模型。 2.1数据质量分析 2.1.1数据值分析 查看数据类型&#xff1a; 首先明确各字段的数据类型…...

设计模式 行为型 状态模式(State Pattern)与 常见技术框架应用 解析

状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为&#xff0c;使得对象看起来好像修改了它的类。这种设计模式的核心思想是将对象的状态和行为封装成不同的状态类&#xff0c;通过状态对象的行为改变来避免…...

Android 系统签名 keytool-importkeypair

要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包&#xff0c;可以按照以下步骤操作&#xff1a; 步骤 1&#xff1a;准备系统签名文件 从 Android 系统源码中获取系统签名文件&#xff0c;通常位于 build/target/product/security 目录下&#xff0c;包括 pla…...

ubuntu22.04 gcc,g++从10.5切换到低版本9.5

一、安装gcc-9.5 mkdir gcc cd gcc sudo apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends gcc-9 | grep -v i386 | grep "^\w") sudo dpkg -i *.deb sudo…...

Microsoft 已经弃用了 <experimental/filesystem> 头文件

#define _CRT_SECURE_NO_WARNINGS 1 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING 1 //Microsoft 已经弃用了 <experimental / filesystem> 头文件&#xff0c;并计划在将来移除它。取而代之的是 C17 标准引入的 //<filesystem> 头文件&#xf…...

git 提交命令记录

1.已有本地和远程仓库 查看仓库远程地址: git remote -v 大量提交 git add . git commit -m "提交说明" git push 之后输入用户名密码 删除文件 git rm 文件名 替代git add 后面一样 2.全新提交 新建远程仓库 git init touch README.md git add . …...

Unity + Firebase + GoogleSignIn 导入问题

我目前使用 Unity版本&#xff1a;2021.3.33f1 JDK版本为&#xff1a;1.8 Gradle 版本为&#xff1a;6.1.1 Firebase 版本: 9.6.0 Google Sign In 版本为&#xff1a; 1.0.1 问题1 &#xff1a;手机点击登录报错 apk转化成zip&#xff0c;解压&#xff0c;看到/lib/armeabi-v…...

深度学习的加速器:Horovod,让分布式训练更简单高效!

什么是 Horovod&#xff1f; Horovod 是 Uber 开发的一个专注于深度学习分布式训练的开源框架&#xff0c;旨在简化和加速多 GPU、多节点环境下的训练过程。它以轻量级、易用、高性能著称&#xff0c;特别适合需要快速部署分布式训练的场景。Horovod 的名字来源于俄罗斯传统舞…...

AI刷题-异或编码、拼凑单词 chi

目录 一、异或编码 问题描述 测试样例 解题思路&#xff1a; 问题理解 解题思路 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、拼凑单词 chi 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&a…...

xml简介

目录 基本语法特点及应用场景一个简单示例 xml&#xff08;全称eXtensible Markup Language&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;跨平台并且跨语言&#xff0c;xml内容较多&#xff0c;这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…...

MYSQL------MySQL 复制MySQL Cluster 架构

MySQL 复制 安装配置 主服务器配置 首先&#xff0c;在主服务器的配置文件&#xff08;my.cnf 或 my.ini&#xff09;中添加以下基本配置&#xff1a; [mysqld] server-id 1 log-bin /var/log/mysql/mysql-bin.logserver-id&#xff1a;为服务器分配唯一的标识&#xff0…...

【人工智能】 用Python构建图像分类模型:从TensorFlow到PyTorch的全面指南

随着深度学习在计算机视觉领域的迅猛发展&#xff0c;图像分类作为其核心任务之一&#xff0c;受到了广泛的关注。本文旨在详细介绍如何使用Python构建图像分类模型&#xff0c;从TensorFlow到PyTorch两个主流深度学习框架进行全面对比与实践。文章首先回顾了图像分类的基本概念…...

计算机网络 笔记 数据链路层 2

1,信道划分&#xff1a; (1)时分复用TDM 将时间等分为“TDM帧”&#xff0c;每个TDM帧内部等分为m个时隙&#xff0c;m个用户对应m个时隙 缺点&#xff1a;每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据&#xff0c;那么就会在这个时间信道被闲置&#xff0c;利用…...

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看...

Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱

一、Apache Hop是什么&#xff1f; 1、Apache Hop&#xff0c;简称Hop&#xff0c;全称为Hop Orchestration Platform&#xff0c;即Hop 工作编排平台&#xff0c;是一个数据编排和数据工程平台&#xff0c;旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…...

Unity 人体切片三维可视化,可任意裁切切割。查看不同断层的图像。

Unity 人体切片三维可视化&#xff0c;真彩色&#xff0c;可任意裁切切割。查看不同断层的图像。 点击查看效果: 视频效果...

ModuleNotFoundError: No module named ‘podm.metrics‘报错等解决方法

ModuleNotFoundError: No module named podm.metrics’报错等解决方法 podm.metrics 在运行时报错&#xff1a; ModuleNotFoundError: No module named ‘podm.metrics’ 安装了podm后还是报错 解决方法&#xff1a; 查看安装位置 查看podm的安装位置&#xff0c;并打开到该…...

Java虚拟机运行时数据区域(内存模型)

程序计数器&#xff08;线程私有内存&#xff09; What&#xff1a;程序计数器是一块较小的内存空间&#xff0c;可以看作是当前线程所执行的字节码的行号指示器。 程序控制流的指示器&#xff0c; 分支&#xff0c;循环&#xff0c;跳转&#xff0c;异常处理&#xff0c;线程…...

trf 4.10安装与使用-生信工具42

01 背景 DNA 中的串联重复&#xff08;Tandem Repeat&#xff09;指的是两个或多个相邻且近似的核苷酸模式的拷贝。Tandem Repeats Finder (TRF) 是一个程序&#xff0c;用于定位并显示 DNA 序列中的串联重复。用户只需提交一个以 FASTA 格式编写的序列&#xff0c;无需指定重…...

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计&#xff0c;配备6.9英寸全面屏.八核处理器骁龙636&#xff0c;后置双摄像头1200万500万像素&#xff0c;前置800万像素.机型代码 &#xff1a;nitrogen.官方最终版为稳定版12.5…...

PySide6-UI界面设计

导论&#xff1a; PySide6和PyQt都是Python对Qt框架的绑定&#xff0c;允许开发者使用Qt创建平台的GUI应用程序。如果你正在开发商业项目&#xff0c;或者需要使用最新的QT6特性&#xff0c;PySide6是一个更好的选择。如果你更倾向于一个成熟的社区和丰富的资源&#xff0c;Py…...

Java创建线程的方式有哪些?

创建线程的方式 1. 继承 Thread 类 在 Java 中&#xff0c;当你启动一个线程时&#xff0c;实际上是调用了 Thread 类的 start() 方法。这个方法会执行以下几个步骤&#xff1a; 线程的状态转变&#xff1a;调用 start() 方法后&#xff0c;线程的状态从 NEW 转变为 RUNNABL…...

Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.

解决 sudo apt install apt-file sudo apt-file updatesudo apt-file search xmllint sudo apt install libxml2-utils执行 # postgres源码安装包解压文件夹中 make install make install问题 make -C src install make[2]: Entering directory /home/postgres/postgresql-1…...

Jenkins pipeline 发送邮件及包含附件

Jenkins pipeline 发送邮件及包含附件 设置邮箱开启SMTP服务 此处适用163 邮箱 开启POP3/SMTP服务通过短信获取TOKEN &#xff08;保存TOKEN, 后面Jenkins会用到&#xff09; Jenkins 邮箱设置 安装 Build Timestamp插件 设置全局凭证 Dashboard -> Manage Jenkins …...

基于深度学习的视觉检测小项目(十) 通过样式表改变界面的外观

一、创建色卡模板文件 在PS中打开之前创建的色卡文件&#xff0c;用吸管拾色器吸取各个色卡的色彩值&#xff1a; 并保存为JSON文件&#xff0c;color_card.json&#xff0c;文件保存在项目的/settings目录下&#xff1a; {"colors": {"RED": "#dc1…...

【Java基础】Stream流、文件File相关操作,IO的含义与运用

1. Java 流(Stream)、文件(File)和IO Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。 输入流表…...

Java-日志-Slf4j-Log4j-logback

文章目录 SLF4J基础概念使用输出形式日志绑定桥接旧的框架实战 logback基础概念配置文件 Log4j概述 SLF4J 参考&#xff1a; https://www.cnblogs.com/shenStudy/p/15806951.html https://slf4j.org/ 基础概念 是什么&#xff1f;SLF4J&#xff08;Simple Logging Facade fo…...

探索式测试

探索式测试是一种软件测试风格&#xff0c;它强调独立测试人员的个人自由和职责&#xff0c;为了持续优化其工作的价值&#xff0c;将测试学习、测试设计、测试执行和测试结果分析作为相互支持的活动&#xff0c;在整个项目实现过程中并行地执行。 选择合适的探索式测试方法我…...

LeetCode LCP17速算机器人

速算机器人&#xff1a;探索字符指令下的数字变换 在编程的奇妙世界里&#xff0c;我们常常会遇到各种有趣的算法问题&#xff0c;这些问题不仅考验我们的逻辑思维&#xff0c;还能让我们感受到编程解决实际问题的魅力。今天&#xff0c;就让我们一同探讨一个关于速算机器人的…...

Taro+Vue实现图片裁剪组件

cropper-image-taro-vue3 组件库 介绍 cropper-image-taro-vue3 是一个基于 Vue 3 和 Taro 开发的裁剪工具组件&#xff0c;支持图片裁剪、裁剪框拖动、缩放和输出裁剪后的图片。该组件适用于 Vue 3 和 Taro 环境&#xff0c;可以在网页、小程序等平台中使用。 源码 https:…...

ISP各模块功能介绍

--------声明&#xff0c;本文为转载整理------- ISP各个模块功能介绍&#xff1a; 各模块前后效果对比&#xff1a; 黑电平补偿&#xff08;BLC&#xff09; 在理想情况下&#xff0c;没有光照射的像素点其响应值应为0。但是&#xff0c;由于杂质、受热等其它原因的影响&…...

SQL-leetcode-584. 寻找用户推荐人

584. 寻找用户推荐人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中&#xff0c;id 是该表的主键列。 该表的每一行表示一个客户的 id、姓名以及推…...

新冠肺炎服务预约微信小程序的设计与实现ssm+论文源码调试讲解

第4章 系统设计 4.1 系统设计的原则 在系统设计过程中&#xff0c;也需要遵循相应的设计原则&#xff0c;这些设计原则可以帮助设计者在短时间内设计出符合设计规范的设计方案。设计原则主要有可靠性&#xff0c;安全性&#xff0c;可定制化&#xff0c;可扩展性&#xff0c;可…...

多模态人工智能在零售业的未来:通过GPT-4 Vision和MongoDB实现智能产品发现

多模态人工智能在零售业的未来&#xff1a;通过GPT-4 Vision和MongoDB实现智能产品发现 引言 想象一下&#xff0c;顾客在购物时只需上传一张他们所期望的服装或产品的照片&#xff0c;几分钟内便能收到来自他们最喜欢的商店的个性化推荐。这就是多模态人工智能在零售领域所带…...

3D目标检测数据集——kitti数据集

KITTI官网网址:The KITTI Vision Benchmark Suite 下载数据集:The KITTI Vision Benchmark Suite KITTI数据集论文:CMSY9 github可视化代码:GitHub - kuixu/kitti_object_vis: KITTI Object Visualization (Birdview, Volumetric LiDar point cloud )...

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…...

Cocos二维Slider

1、可拖动区域计算 根据UI的世界坐标了宽高信息计算出handle的坐标范围 this.posMin new Vec2(this.node.worldPosition.x - this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y - this.uiSelf.contentSize.height * 0.5); this.posMax new Vec2(this.node.w…...

kubeneters-循序渐进Cilium网络(二)

文章目录 概要IP 地址配置接口配置解析结论 概要 接续前一章节&#xff0c;我们还是以这张图继续深入Cilium网络世界 IP 地址配置 通过检查 Kubernetes 集群的当前环境&#xff0c;可以获取实际的 IP 地址和配置信息。这些信息将被补充到之前的网络示意图中&#xff0c;以使…...

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中&#xff0c;我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤&#xff0c;但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式&#xff08;Template Method Design Pattern&#xff09;就为解决这类问题提供了…...

[开源]自动化定位建图系统(视频)

系统状态机&#xff1a; 效果展示&#xff1a; 1、 机器人建图定位系统-基础重定位&#xff0c;定位功能演示 2、 机器人建图定位系统-增量地图构建&#xff0c;手动回环检测演示 3、… 开源链接&#xff1a; https://gitee.com/li-wenhao-lwh/lifelong-backend Qt人机交互…...

Kali系统(Debian 10.3) 遇到的问题

目录 问题一&#xff1a;非问题 kali 基础官网与安装 问题二&#xff1a; 问题三&#xff1a; Kali系统 MySQL问题Cant connect to local MySQL server through socket /run/mysqld/mysqld.sock (2) 问题四&#xff1a;重新安装MySQL 也就是MariaDB(MariaDB 含 MySQL相关…...