SpringBoot+Minio实现多文件下载和批量下载
文章目录
- SpringBoot+minio实现多文件下载
- 1、SpringBoot+minio实现多文件打成一个压缩包下载
- 1. 添加依赖
- 2. 配置 MinIO 客户端
- 3. 创建下载和压缩逻辑
- 4. 创建控制器方法来触发下载
- 5. 测试下载功能
- 注意事项
- 2、在minio指定的桶名下面生产一个文件夹
- 1. MinIO 配置
- 2. 编写业务逻辑
- 文件夹操作和压缩下载
- 3. 创建控制器
- 4. 测试
- 注意事项
- 3、在minio指定的桶名下面生产一个临时文件夹
- 1. 配置 MinIO 客户端
- 2. 创建数据库实体类
- 3. 创建存储库接口
- 4. MinIO 服务实现
- 5. 控制器实现
- 6. 测试接口
- 注意事项
- 4、直接在内存中打包再上传
- 1. MinIO 配置
- 2. 创建数据库实体类
- 3. 创建存储库接口
- 4. 编写服务逻辑
- 5. 创建控制器
- 6. 测试接口
- 注意事项
- 5、本地生产一个临时目录进行打包再上传
- 具体步骤如下:
- 1. 使用系统临时目录
- 示例代码
- 2. 应用程序的特定临时目录
- 3. 清理策略
- 4. 权限和安全性
- 5. 例子
- 本地临时目录总结
- 6. 添加依赖
- 2. MinioService 实现
- 3. 创建控制器
- 4. 测试接口
- 总结
- 6、通过多线程将下载的文件合成在一个zip包中
- 1. 添加依赖
- 2. 创建 MinioService 类
- 3. 创建控制器
- 4. 测试接口
- 注意事项
- 总结
- SpringBoot+minio实现文件批量下载
- 1、for循环
- 1. 准备工作
- 2. 添加依赖
- 3. 配置MinIO
- 4. 创建MinIO配置类
- 5. 创建下载控制器
- 6. 测试下载功能
- 7. 额外的压缩功能
- 8. 安全性
- 示例:压缩文件下载
- 总结
- 2、多线程
- 1. 添加依赖
- 2. 创建MinIO配置类
- 3. 创建下载控制器
- 4. 关键点解析
- 5. 测试下载功能
- 6. 性能优化
- 7. 安全性
- 总结
- 3、多线程
- 步骤概述
- 1. 添加依赖
- 2. 创建 MinioService 类
- 3. 创建控制器
- 4. 测试接口
- 注意事项
- 总结
- 注意:提示没有transferTo(zipOut)这个方法
- 解释
- 运用
SpringBoot+minio实现多文件下载
1、SpringBoot+minio实现多文件打成一个压缩包下载
要在 Spring Boot 中使用 MinIO 实现多文件打包成一个压缩文件并下载,主要分为以下几个步骤:
- 连接 MinIO:创建 MinIO 客户端,用于与 MinIO 进行通信。
- 文件读取:从 MinIO 中读取多个文件。
- 文件压缩:将文件压缩为 ZIP 格式。
- 文件下载:将生成的 ZIP 文件流返回给客户端。
1. 添加依赖
如果还没有添加 MinIO 依赖,可以手动下载 MinIO 客户端库,或者直接用 Maven 来管理依赖:
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.5</version>
</dependency>
2. 配置 MinIO 客户端
在 application.properties
中添加 MinIO 配置:
minio.url=http://localhost:9000
minio.accessKey=your-access-key
minio.secretKey=your-secret-key
minio.bucketName=your-bucket
然后在 @Configuration
类中配置 MinIO 客户端:
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 url;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}
3. 创建下载和压缩逻辑
在服务类中添加下载和压缩方法,以下代码会将指定的文件列表压缩成一个 ZIP 并返回给客户端。
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;@Service
public class MinioService {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucketName}")private String bucketName;public void downloadFilesAsZip(List<String> fileNames, HttpServletResponse response) {try {// 设置响应头,文件名为 download.zipresponse.setContentType("application/zip");response.setHeader("Content-Disposition", "attachment; filename=download.zip");// 创建 ZIP 输出流try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {for (String fileName : fileNames) {// 获取每个文件的输入流try (InputStream inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build())) {// 创建 ZIP 文件条目zipOut.putNextEntry(new ZipEntry(fileName));// 将文件数据写入 ZIPbyte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) >= 0) {zipOut.write(buffer, 0, length);}zipOut.closeEntry(); // 结束该条目的写入}}zipOut.finish(); // 完成 ZIP 文件}} catch (Exception e) {throw new RuntimeException("Error occurred while downloading files as zip", e);}}
}
4. 创建控制器方法来触发下载
在控制器中定义一个方法,接收前端的请求并调用服务类进行压缩与下载。
@RestController
public class FileDownloadController {@Autowiredprivate MinioService minioService;@GetMapping("/download-zip")public void downloadZip(@RequestParam List<String> fileNames, HttpServletResponse response) {minioService.downloadFilesAsZip(fileNames, response);}
}
5. 测试下载功能
现在可以通过 HTTP GET 请求测试该功能:
GET http://localhost:8080/download-zip?fileNames=file1.txt&fileNames=file2.jpg&fileNames=file3.pdf
注意事项
- 内存消耗:如果文件较多或较大,生成 ZIP 文件的过程可能会占用大量内存。可以优化为逐个文件流写入 ZIP,避免内存问题。
- 异常处理:可扩展异常处理,捕获 MinIO 连接失败、文件不存在等情况,并返回更详细的错误信息。
这个实现将从 MinIO 读取文件流,逐一压缩到 ZIP 中,并通过 HTTP 响应流返回给客户端。
2、在minio指定的桶名下面生产一个文件夹
SpringBoot+minio实现多文件下载时在minio指定的桶名下面生产一个文件夹,将需要下载放到这个文件夹中,并把这个文件夹打成一个压缩包后进行下载,下载成功后删除这个文件夹
在使用 Spring Boot 和 MinIO 实现上述功能时,可以按以下步骤操作:
- 创建 MinIO 文件夹:在 MinIO 指定的桶内创建一个文件夹。
- 上传文件到文件夹:将需要下载的文件复制到该文件夹。
- 打包文件夹为 ZIP 并下载:将文件夹内的文件打包为 ZIP 文件并返回给客户端。
- 清理文件夹:下载成功后,删除 MinIO 上的文件夹及其内容。
以下是实现的详细步骤和代码。
1. MinIO 配置
确保 MinIO 客户端配置正确。使用 application.properties
配置 MinIO 相关信息。
minio.url=http://localhost:9000
minio.accessKey=your-access-key
minio.secretKey=your-secret-key
minio.bucketName=your-bucket
并创建 MinIO 客户端配置类:
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 url;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}
2. 编写业务逻辑
在服务类中添加方法来实现各步骤。
文件夹操作和压缩下载
import io.minio.CopyObjectArgs;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import io.minio.GetObjectArgs;
import io.minio.ObjectWriteResponse;
import io.minio.UploadObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;@Service
public class MinioService {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucketName}")private String bucketName;// 将需要下载的文件放入临时文件夹并压缩下载public void downloadFolderAsZip(List<String> fileNames, HttpServletResponse response) {String tempFolderName = "temp-folder-" + UUID.randomUUID(); // 随机生成临时文件夹名称try {// 上传文件到临时文件夹for (String fileName : fileNames) {String objectName = tempFolderName + "/" + fileName;// 复制原始文件到临时文件夹minioClient.copyObject(CopyObjectArgs.builder().bucket(bucketName).object(objectName).source(bucketName + "/" + fileName).build());}// 设置响应头response.setContentType("application/zip");response.setHeader("Content-Disposition", "attachment; filename=download.zip");// 创建 ZIP 输出流try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {for (String fileName : fileNames) {String objectName = tempFolderName + "/" + fileName;// 获取临时文件夹中的每个文件流try (InputStream inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) {// 写入 ZIP 条目zipOut.putNextEntry(new ZipEntry(fileName));byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) >= 0) {zipOut.write(buffer, 0, length);}zipOut.closeEntry(); // 结束条目写入}}zipOut.finish(); // 完成 ZIP 文件}// 下载完成后删除临时文件夹deleteFolder(tempFolderName);} catch (Exception e) {throw new RuntimeException("Error occurred while downloading folder as zip", e);}}// 删除指定文件夹及其内容private void deleteFolder(String folderName) {try {Iterable<Result<Item>> items = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(folderName + "/").recursive(true).build());for (Result<Item> itemResult : items) {Item item = itemResult.get();minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(item.objectName()).build());}} catch (Exception e) {throw new RuntimeException("Error occurred while deleting folder", e);}}
}
3. 创建控制器
控制器方法用于接受文件名列表并调用服务中的方法进行下载。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.List;@RestController
public class FileDownloadController {@Autowiredprivate MinioService minioService;@GetMapping("/download-zip")public void downloadZip(@RequestParam List<String> fileNames, HttpServletResponse response) {minioService.downloadFolderAsZip(fileNames, response);}
}
4. 测试
可以通过以下 GET 请求测试功能:
GET http://localhost:8080/download-zip?fileNames=file1.txt&fileNames=file2.jpg&fileNames=file3.pdf
注意事项
- 异步清理:如果文件数量多或者体积大,删除文件夹可能会影响性能。可以考虑将删除操作异步处理。
- 异常处理:添加异常处理逻辑,确保在复制、压缩、删除等环节处理各种可能的错误。
3、在minio指定的桶名下面生产一个临时文件夹
SpringBoot+minio实现多文件下载时在minio指定的桶名下面生产一个文件夹,将需要下载放到这个文件夹中,并把这个文件夹打成一个压缩包后进行下载,下载成功后保留压缩包信息存放到数据库并且删除这个文件夹
要实现此功能,需要将多个文件上传到一个临时文件夹,并将该文件夹压缩为一个 ZIP 文件,供客户端下载。在下载成功后,将压缩包信息存储到数据库,并删除临时文件夹的所有文件。
以下是实现步骤和代码:
- 创建 MinIO 文件夹:在 MinIO 的指定桶下创建一个临时文件夹,并将文件复制到该文件夹中。
- 打包下载:将文件夹打包为 ZIP 文件返回给客户端。
- 保存记录:将 ZIP 文件信息存储到数据库中。
- 清理临时文件夹:下载完成后,删除临时文件夹中的所有文件,但保留 ZIP 文件。
1. 配置 MinIO 客户端
在 application.properties
中添加 MinIO 和数据库的配置:
# MinIO 配置
minio.url=http://localhost:9000
minio.accessKey=your-access-key
minio.secretKey=your-secret-key
minio.bucketName=your-bucket# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/yourdb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
2. 创建数据库实体类
创建一个实体类 ZipFileRecord
来保存压缩包信息:
import javax.persistence.*;
import java.time.LocalDateTime;@Entity
public class ZipFileRecord {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String fileName;private String filePath;private LocalDateTime createdTime;// Getters and Setters// ...
}
3. 创建存储库接口
创建一个 ZipFileRecordRepository
,用于保存压缩包信息:
import org.springframework.data.jpa.repository.JpaRepository;public interface ZipFileRecordRepository extends JpaRepository<ZipFileRecord, Long> {
}
4. MinIO 服务实现
编写服务类 MinioService
,完成文件夹创建、文件复制、打包下载、数据库保存和清理的逻辑。
import io.minio.*;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;@Service
public class MinioService {@Autowiredprivate MinioClient minioClient;@Autowiredprivate ZipFileRecordRepository zipFileRecordRepository;@Value("${minio.bucketName}")private String bucketName;public void downloadFolderAsZip(List<String> fileNames, HttpServletResponse response) {String tempFolderName = "temp-folder-" + UUID.randomUUID(); // 创建临时文件夹String zipFileName = "download-" + UUID.randomUUID() + ".zip";String zipFilePath = tempFolderName + "/" + zipFileName;try {// 复制文件到临时文件夹for (String fileName : fileNames) {String objectName = tempFolderName + "/" + fileName;minioClient.copyObject(CopyObjectArgs.builder().bucket(bucketName).object(objectName).source(bucketName + "/" + fileName).build());}// 设置响应头,下载压缩包response.setContentType("application/zip");response.setHeader("Content-Disposition", "attachment; filename=" + zipFileName);// 创建 ZIP 输出流try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {for (String fileName : fileNames) {String objectName = tempFolderName + "/" + fileName;// 获取每个文件的输入流try (InputStream inputStream = minioClient.getObject(GetObjectArgs.
相关文章:
SpringBoot+Minio实现多文件下载和批量下载
文章目录 SpringBoot+minio实现多文件下载1、SpringBoot+minio实现多文件打成一个压缩包下载1. 添加依赖2. 配置 MinIO 客户端3. 创建下载和压缩逻辑4. 创建控制器方法来触发下载5. 测试下载功能注意事项2、在minio指定的桶名下面生产一个文件夹1. MinIO 配置2. 编写业务逻辑文…...
3.swoole安装【Docker】
一、拉取最新 swoole 镜像 docker pull phpswoole/swoole二、第一次启动swoole容器 docker run --name swoole phpswoole/swoole 三、 拷贝配置文件 docker cp swoole:/var/www /docker/swoole四、 停止 swoole 容器 dcoker stop swoole五、 删除第一次启动的swoole容器 d…...

React 探秘(三): 时间切片
文章目录 背景时间切片原理requestIderCallback 方法setImmediateMessageChannelsetTimeout React 18 时间切片源码手撸时间切片问题拆解构建任务队列宏任务包装首次开启任务递归任务执行workLoop 开启工作循环demo 模拟 总结 背景 前文学习了 fiber 架构和双缓存技术ÿ…...
OSError: Can‘t load tokenizer for ‘bert-base-uncased‘.
一、具体报错: 报错如下: OSError: Cant load tokenizer for bert-base-uncased. If you were trying to load it from https://huggingface.co/models, make sure you dont have a local directory with the same name. Otherwise, make sure bert-bas…...

中国人寿财险青岛市分公司:专业团队,卓越服务
中国人寿财险青岛市分公司拥有一支专业的团队,为客户提供卓越的保险服务。 公司的保险从业人员都经过严格的专业培训和考核,具备扎实的保险知识和丰富的实践经验。他们以客户为中心,用心倾听客户需求,为客户提供个性化的保险方案…...
【SpringCloud】基础问题
文章目录 spring-cloud-dependencies和spring-cloud-alibaba-dependencies的区别<dependencyManagement>和<dependencies>的区别<dependencyManagement><dependencies> 为什么在主函数上加上SpringBootApplication注解就可以扫描到对象为什么bootstrap…...

牛客网刷题(1)(java之数据类型、数组的创建(静态/动态初始化)、static关键字与静态属性和方法、常用的servlet包、面向对象程序设计方法优点)
目录 一、Java变量的数据类型。 <1>Java中变量的数据类型。 <2>基本数据类型。 <3>引用数据类型。 二、Java中一维数组的初始化。(静态、动态初始化) <1>数组。 <2>动态初始化。 <3>静态初始化。 三、看清代码后&am…...

电磁干扰(EMI)与电磁兼容性(EMC)【小登培训】
电磁干扰(EMI)和电磁兼容性(EMC)是每个产品在3C ,CE认证过程中必不可少的测试项目: 一、电磁干扰(EMI) EMI(Electromagnetic Interference)是指电子设备在工作…...

保险行业的智能客服:企业AI助理与知识库的加速效应
在保险行业,客户服务是企业与客户之间建立信任与忠诚度的关键桥梁。随着人工智能技术的飞速发展,企业AI助理正逐步成为保险客服领域的重要革新力量。 一、AI助理:保险客服的新篇章 企业AI助理,以其强大的自然语言处理能力、数据分…...

PSINS工具箱函数介绍——inserrplot
关于工具箱 i n s e r r p l o t inserrplot in...

龙蟠科技业绩压力显著:资产负债率持续攀升,产能利用率也不乐观
《港湾商业观察》施子夫 黄懿 去年十月至今两度递表后,10月17日,江苏龙蟠科技股份有限公司(以下简称,龙蟠科技;603906.SH,02465.HK)通过港交所主板上市聆讯。 很快,龙蟠科技发布公告称,公司全…...
使用 Spring Cloud 有什么优势?
使用 Spring Cloud 有什么优势? 在当今的微服务架构时代,Spring Cloud 作为一个强大的开发框架,备受开发者青睐。那么,使用 Spring Cloud 究竟有哪些优势呢? 一、微服务架构简介 微服务架构是一种将单一应用程序拆分…...

MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
开心一刻 image 产品还没测试直接投入生产时,这尼玛... 背景问题 再讲 binlog 之前,我们先来回顾下主流关系型数据库的默认隔离级别,是默认隔离级别,不是事务有哪几种隔离级别,别会错题意了 1、Oracle、SQL Server 的默…...

SQL进阶技巧:Hive如何进行更新和删除操作?
目录 0 Hive支持更新和删除操作吗? 1 Hive删除操作如何实现? 2 Hive更新操作如何实现? 3 小结 0 Hive支持更新和删除操作吗? Hive在默认情况下不支持更新和删除操作,但可以通过特定方式如使用ORCFileformat和Acid…...
nginx安装详解含 自动化编译安装 Debian/Ubuntu/CentOS/RHEL/ROCKY
1. 准备工作 1.1 选择操作系统 推荐操作系统:Ubuntu、CentOS、Debian等Linux发行版。系统要求:确保服务器有足够的CPU、内存和磁盘空间。 1.2 更新系统 更新包列表: sudo apt update # 对于Debian/Ubuntu sudo yum update # 对于CentOS…...
Go编程语言介绍及项目案例
Go(又称 Golang)是一种开源的编程语言,具有高效、简洁、并发性能强等特点。 一、主要特点 简洁高效: Go 语言的语法简洁明了,代码风格清晰易读。它摒弃了一些传统编程语言中的复杂特性,如继承、泛型等,使得代码更加简洁高效。例如,在 Go 语言中,函数的定义非常简洁,…...
刷爆leetcode Day11 DFS
DFS 1. 汉诺塔(easy)2. 合并两个有序链表(easy)3. 反转链表(easy)4. 两两交换链表中的节点(medium)5. Pow(x,n)-快速幂(medium) 1. 汉诺塔&#x…...
虚拟机不同网络模式的区别
网络模式 NAT模式 (可以上网) 使用NAT模式的虚拟机都和物理机VMnet8处于同一个网段 桥接模式 (可以上网) 使用桥接模式的虚拟机都和物理机网卡处于同一网段 仅主机模式 (不能上网,完全隔离࿰…...
嵌入式软件 Bug 排查与调试技巧
目录 1、准备工作 2、打印调试 实现步骤 注意事项 3、断点调试 4、观察点调试 5、远程调试 6、内存分析 内存泄漏检测 栈溢出检测 7、异常处理 8、性能分析 9、逻辑分析仪 10、示波器 11、常见bug类型 12、调试策略 1、准备工作 硬件工具准备 调试器:例如 J - …...

阿里云环境下用docker搭建redis主从复制
redis主从复制可将主redis中的数据同步到从redis中,具有读写分离、容灾恢复、数据备份、支持高并发等特性。 本文演示在阿里云环境下,用 docker 搭建 redis 主从复制(一主二从)的操作过程。 一、环境准备 阿里云安装CentOS7.9 6…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...