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

Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?

Spring MVC 处理文件上传主要依赖于 MultipartResolver 接口及其实现。最常用的实现是 CommonsMultipartResolver(基于 Apache Commons FileUpload)和 StandardServletMultipartResolver(基于 Servlet 3.0+ API)。

以下是如何配置和使用文件上传功能的步骤:

1. 依赖 (Dependencies)

需要添加相应的依赖到你pom.xml (Maven) 或 build.gradle (Gradle) 文件中。

a) 使用 Apache Commons FileUpload (推荐,功能更全面):
如果想使用 CommonsMultipartResolver,需要添加以下依赖:

<!-- pom.xml (Maven) -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version> <!-- 使用最新稳定版 -->
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version> <!-- commons-fileupload 可能需要,或者你直接用它 -->
</dependency>

b) 使用 Servlet 3.0+ API (无需额外依赖,如果你的 Servlet 容器支持 Servlet 3.0+):
如果你的 Servlet 容器 (如 Tomcat 7+, Jetty 8+) 支持 Servlet 3.0 API,你可以使用 StandardServletMultipartResolver。这种情况下,通常不需要显式添加额外的 commons-fileupload 依赖。Spring Boot 默认会优先使用 Servlet 3.0+ 的方式,如果 commons-fileupload 不在 classpath 中。

2. 配置 (Configuration)

你需要在 Spring 的配置文件中注册一个 MultipartResolver bean。

a) Java 配置 (推荐):

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver; // For Commons FileUpload
// import org.springframework.web.multipart.support.StandardServletMultipartResolver; // For Servlet 3.0+@Configuration
public class WebConfig { // 或者你的 Spring MVC 配置类// 使用 CommonsMultipartResolver@Bean(name = "multipartResolver") // bean 的名字必须是 "multipartResolver"public MultipartResolver multipartResolver() {CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();multipartResolver.setMaxUploadSize(10485760); // 10MB,设置总上传数据总大小multipartResolver.setMaxUploadSizePerFile(5242880); // 5MB,设置单个文件大小 (需要 Servlet 3.0+ 支持或自定义逻辑)multipartResolver.setMaxInMemorySize(1048576); // 1MB,超过该大小会写入临时文件multipartResolver.setDefaultEncoding("UTF-8");// multipartResolver.setUploadTempDir(new FileSystemResource("/tmp/uploads")); // 可选,设置临时文件目录return multipartResolver;}// 或者,使用 StandardServletMultipartResolver (需要 Servlet 3.0+ 环境)/*@Beanpublic StandardServletMultipartResolver multipartResolver() {return new StandardServletMultipartResolver();}*/
}

注意:

  • Bean 的名称必须是 multipartResolver
  • setMaxUploadSizePerFile 是 Spring 5.0 中为 CommonsMultipartResolver 添加的,底层依赖 Servlet 3.0 的 Part.getSize()。对于更早版本或更细致的控制,可能需要在控制器中检查。
  • 对于 StandardServletMultipartResolver,文件大小限制通常在 web.xml 或通过 Servlet 3.0 的 MultipartConfigElement 以编程方式配置(例如在 ServletContainerInitializer 或 Spring Boot 的 application.properties 中)。

Spring Boot 用户:
如果你使用 Spring Boot,它会自动配置 MultipartResolver

  • 如果 commons-fileupload 在 classpath 中,Boot 会自动配置 CommonsMultipartResolver
  • 否则,它会配置 StandardServletMultipartResolver (如果 Servlet 3.0+ 可用)。
    你可以在 application.propertiesapplication.yml 中配置相关属性:
# application.properties
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=5MB     # 单个文件最大值
spring.servlet.multipart.max-request-size=10MB # 请求总大小最大值
spring.servlet.multipart.file-size-threshold=1MB # 文件写入磁盘的阈值
# spring.servlet.multipart.location=/tmp/uploads # 临时文件存储位置

b) XML 配置 (传统方式):

<!-- spring-mvc-config.xml -->
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置上传文件的最大尺寸,单位为字节 --><property name="maxUploadSize" value="10485760"/> <!-- 10MB --><!-- 设置单个文件的最大尺寸,单位为字节 (Spring 5.0+ for CommonsMultipartResolver) --><property name="maxUploadSizePerFile" value="5242880"/> <!-- 5MB --><!-- 设置文件在内存中的最大大小,超过该大小会写入临时文件,单位为字节 --><property name="maxInMemorySize" value="1048576"/> <!-- 1MB --><!-- 设置默认编码 --><property name="defaultEncoding" value="UTF-8"/><!-- <property name="uploadTempDir" value="file:/tmp/uploads/"/> -->
</bean><!-- 或者,使用 StandardServletMultipartResolver -->
<!--
<bean id="multipartResolver"class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
-->

3. HTML 表单

在你的 JSP 或 HTML 页面中,确保表单的 methodPOST,并且 enctype 设置为 multipart/form-data

<!DOCTYPE html>
<html>
<head><title>File Upload</title>
</head>
<body><h2>Upload Single File:</h2><form method="POST" action="/your-app-context/uploadSingleFile" enctype="multipart/form-data">File: <input type="file" name="file" /> <br/><br/>Description: <input type="text" name="description" /> <br/><br/><input type="submit" value="Upload" /></form><h2>Upload Multiple Files:</h2><form method="POST" action="/your-app-context/uploadMultipleFiles" enctype="multipart/form-data">File 1: <input type="file" name="files" /> <br/><br/>File 2: <input type="file" name="files" /> <br/><br/>Description: <input type="text" name="description" /> <br/><br/><input type="submit" value="Upload" /></form>
</body>
</html>

注意:

  • name="file"name="files" 中的 name 属性值需要与 Controller 中 @RequestParam 的值匹配。
  • /your-app-context/ 是你的应用上下文路径,例如 /my-app/

4. Controller 中接收文件

在 Controller 中,你可以使用 @RequestParam 注解将上传的文件绑定到 MultipartFile 类型的参数。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;@Controller
public class FileUploadController {// 你可以从配置文件读取这个路径private static final String UPLOAD_DIR = "/path/to/your/upload/directory/"; // 请替换为实际路径@PostMapping("/uploadSingleFile")public String uploadSingleFile(@RequestParam("file") MultipartFile file,@RequestParam("description") String description,RedirectAttributes redirectAttributes) {if (file.isEmpty()) {redirectAttributes.addFlashAttribute("message", "Please select a file to upload.");return "redirect:/uploadStatus"; // 或返回上传页面}try {// 确保上传目录存在File uploadDir = new File(UPLOAD_DIR);if (!uploadDir.exists()) {uploadDir.mkdirs();}// 获取文件名和扩展名String originalFileName = file.getOriginalFilename();String fileExtension = "";if (originalFileName != null && originalFileName.lastIndexOf(".") != -1) {fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));}// 生成新的唯一文件名,防止覆盖String newFileName = UUID.randomUUID().toString() + fileExtension;// 构建文件保存路径Path path = Paths.get(UPLOAD_DIR + newFileName);// 保存文件// 方法1: 使用 MultipartFile.transferTo()file.transferTo(path.toFile());// 方法2: 使用 Java NIO Files.copy (更灵活)// Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);System.out.println("Description: " + description);System.out.println("Uploaded file: " + originalFileName + " as " + newFileName);redirectAttributes.addFlashAttribute("message","You successfully uploaded '" + originalFileName + "' as '" + newFileName + "'");} catch (IOException e) {e.printStackTrace();redirectAttributes.addFlashAttribute("message","Failed to upload '" + file.getOriginalFilename() + "': " + e.getMessage());} catch (IllegalStateException e) {// 通常是因为 transferTo 被调用多次,或文件已移动/删除e.printStackTrace();redirectAttributes.addFlashAttribute("message","Could not upload the file: " + e.getMessage());}return "redirect:/uploadStatus"; // 创建一个显示上传状态的页面}@PostMapping("/uploadMultipleFiles")public String uploadMultipleFiles(@RequestParam("files") MultipartFile[] files, // 或者 List<MultipartFile> files@RequestParam("description") String description,RedirectAttributes redirectAttributes) {if (files.length == 0 || Arrays.stream(files).allMatch(MultipartFile::isEmpty)) {redirectAttributes.addFlashAttribute("message", "Please select at least one file to upload.");return "redirect:/uploadStatus";}StringBuilder uploadedFileNames = new StringBuilder();for (MultipartFile file : files) {if (file.isEmpty()) {continue; // 跳过空文件}try {File uploadDir = new File(UPLOAD_DIR);if (!uploadDir.exists()) {uploadDir.mkdirs();}String originalFileName = file.getOriginalFilename();String fileExtension = "";if (originalFileName != null && originalFileName.lastIndexOf(".") != -1) {fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));}String newFileName = UUID.randomUUID().toString() + fileExtension;Path path = Paths.get(UPLOAD_DIR + newFileName);file.transferTo(path.toFile());uploadedFileNames.append(originalFileName).append(" (as ").append(newFileName).append("), ");System.out.println("Uploaded file: " + originalFileName + " as " + newFileName);} catch (IOException e) {e.printStackTrace();redirectAttributes.addFlashAttribute("message","Failed to upload one or more files: " + e.getMessage());return "redirect:/uploadStatus";}}System.out.println("Description: " + description);redirectAttributes.addFlashAttribute("message","Successfully uploaded files: " + uploadedFileNames.toString().replaceAll(", $", ""));return "redirect:/uploadStatus";}// 一个简单的页面来显示上传结果@org.springframework.web.bind.annotation.GetMapping("/uploadStatus")public String uploadStatus(Model model) {// model 会自动包含 flash attributesreturn "uploadStatus"; // uploadStatus.html 或 uploadStatus.jsp}
}

创建一个 uploadStatus.html (Thymeleaf 示例) 或 uploadStatus.jsp 来显示消息:

<!-- uploadStatus.html (Thymeleaf) -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>Upload Status</title>
</head>
<body><h2 th:if="${message}" th:text="${message}">Status Message</h2><a href="/your-app-context/">Back to Upload Form</a> <!-- 调整链接 -->
</body>
</html>

MultipartFile 接口常用方法:

  • String getName(): 获取表单中 name 属性的值。
  • String getOriginalFilename(): 获取上传文件的原始名称。注意:不要直接使用此名称保存文件,因为它可能包含路径字符或不安全字符。最好对其进行清理或生成新名称。
  • String getContentType(): 获取文件的 MIME 类型 (例如 image/jpeg)。
  • boolean isEmpty(): 判断文件是否为空 (用户未选择文件)。
  • long getSize(): 获取文件大小 (字节)。
  • byte[] getBytes(): 获取文件的字节数组。注意:对于大文件,这可能会消耗大量内存。
  • InputStream getInputStream(): 获取文件的输入流。
  • void transferTo(File dest): 将接收到的文件保存到目标文件。这是最常用的保存文件的方法。它通常会移动临时文件(如果文件大于 maxInMemorySize)或复制内存中的内容。

5. 错误处理

  • 文件大小超限: 如果上传的文件超过了 maxUploadSizemaxUploadSizePerFile (如果配置了),Spring 会抛出 MaxUploadSizeExceededException (更具体的可能是 SizeLimitExceededExceptionFileSizeLimitExceededException 来自 Commons FileUpload)。你可以通过 @ControllerAdvice 来全局处理这个异常。

    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.multipart.MaxUploadSizeExceededException;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;@ControllerAdvice
    public class GlobalExceptionHandler {@ExceptionHandler(MaxUploadSizeExceededException.class)public String handleMaxSizeException(MaxUploadSizeExceededException exc, RedirectAttributes redirectAttributes) {redirectAttributes.addFlashAttribute("message", "File is too large! Maximum size allowed is " + exc.getMaxUploadSize() + " bytes.");return "redirect:/uploadStatus"; // 或者你的上传页面}// 可以添加其他异常处理
    }
    
  • IO 异常: 在 file.transferTo() 或处理输入流时可能发生 IOException,需要 try-catch 处理。

总结

  1. 依赖: 添加 commons-fileuploadcommons-io (如果使用 CommonsMultipartResolver)。
  2. 配置: 在 Spring 配置中注册名为 multipartResolverMultipartResolver bean (通常是 CommonsMultipartResolverStandardServletMultipartResolver),并设置相关属性 (如大小限制)。Spring Boot 用户可以在 application.properties 中配置。
  3. HTML: 创建一个 method="POST"enctype="multipart/form-data" 的 HTML 表单,包含 <input type="file" name="yourFileName">
  4. Controller: 在 Controller 方法中使用 @RequestParam("yourFileName") MultipartFile file (或 MultipartFile[] files) 来接收上传的文件。使用 file.transferTo(destination) 保存文件。
  5. 安全:
    • 不要信任 getOriginalFilename() 的值来构建服务器上的文件路径;要清理它或生成唯一的文件名。
    • 验证文件类型 (MIME 和扩展名)。
    • 考虑将上传的文件存储在 Web 应用根目录之外的安全位置。
  6. 错误处理: 处理文件大小超限异常和 IO 异常。

相关文章:

Spring MVC 如何处理文件上传? 需要哪些配置和依赖?如何在 Controller 中接收上传的文件 (MultipartFile)?

Spring MVC 处理文件上传主要依赖于 MultipartResolver 接口及其实现。最常用的实现是 CommonsMultipartResolver&#xff08;基于 Apache Commons FileUpload&#xff09;和 StandardServletMultipartResolver&#xff08;基于 Servlet 3.0 API&#xff09;。 以下是如何配置…...

探索C++对象模型:(拷贝构造、运算符重载)成员函数的深度解读(中篇)

前引&#xff1a;在C的面向对象编程中&#xff0c;对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据&#xff0c;还是资源管理如何自动化&#xff0c;其底层机制均围绕两个关键概念展开&#xff1a;拷贝复制、取地址重载成员函数。它们如同对象的“隐形守护者”&…...

[逆向工程]C++实现DLL注入:原理、实现与防御全解析(二十五)

[逆向工程]C实现DLL注入&#xff1a;原理、实现与防御全解析&#xff08;二十五&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09;是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#x…...

gcc/g++常用参数

1.介绍 gcc用于编译c语言&#xff0c;g用于编译c 源代码生成可执行文件过程&#xff0c;预处理-编译-汇编-链接。https://zhuanlan.zhihu.com/p/476697014 2.常用参数说明 2.1编译过程控制 参数作用-oOutput&#xff0c;指定输出名字-cCompile&#xff0c;编译源文件生成对…...

51单片机课设基于GM65模块的二维码加条形码识别

系统组成 主控单元&#xff1a;51单片机&#xff08;如STC89C52&#xff09;作为核心控制器&#xff0c;协调各模块工作。 扫描模块&#xff1a;GM65条码扫描头&#xff0c;支持二维码/条形码识别&#xff0c;通过串口&#xff08;UART&#xff09;与单片机通信。 显示模块&a…...

物联网赋能7×24H无人值守共享自习室系统设计与实践!

随着"全民学习"浪潮的兴起&#xff0c;共享自习室市场也欣欣向荣&#xff0c;今天就带大家了解下在物联网的加持下&#xff0c;无人共享自习室系统的设计与实际方法。 一、物联网系统整体架构 1.1 系统分层设计 层级技术组成核心功能用户端微信小程序/H5预约选座、…...

基于多头自注意力机制(MHSA)增强的YOLOv11主干网络—面向高精度目标检测的结构创新与性能优化

深度学习在计算机视觉领域的快速发展推动了目标检测算法的持续进步。作为实时检测框架的典型代表&#xff0c;YOLO系列凭借其高效性与准确性备受关注。本文提出一种基于多头自注意力机制(Multi-Head Self-Attention, MHSA)增强的YOLOv11主干网络结构&#xff0c;旨在提升模型在…...

使用Spring Boot与Spring Security构建安全的RESTful API

使用Spring Boot与Spring Security构建安全的RESTful API 引言 在现代Web应用开发中&#xff0c;安全性是不可忽视的重要环节。Spring Boot和Spring Security作为Java生态中的主流框架&#xff0c;为开发者提供了强大的工具来构建安全的RESTful API。本文将详细介绍如何结合S…...

小刚说C语言刷题—1230蝴蝶结

1.题目描述 请输出 n 行的蝴蝶结的形状&#xff0c;n 一定是一个奇数&#xff01; 输入 一个整数 n &#xff0c;代表图形的行数&#xff01; 输出 n 行的图形。 样例 输入 9 输出 ***** **** *** ** * ** *** **** ***** 2.参考代码&#xff08;C语言版&#xff09…...

利用SenseGlove触觉手套开发XR手术训练体验

VirtualiSurg和VR触觉 作为领先的培训平台&#xff0c;VirtualiSurg自2017年以来一直利用扩展现实 (XR) 和触觉技术&#xff0c;为全球医疗保健行业提供个性化、数据驱动的学习解决方案。该平台赋能医疗专业人员进行协作式学习和培训&#xff0c;提升他们的技能&#xff0c;使…...

CT重建笔记(五)—2D平行束投影公式

写的又回去了&#xff0c;因为我发现我理解不够透彻&#xff0c;反正想到啥写啥&#xff0c;尽量保证内容质量好简洁易懂 2D平行束投影公式 p ( s , θ ) ∫ ∫ f ( x , y ) δ ( x c o s θ y s i n θ − s ) d x d y p(s,\theta)\int \int f(x,y)\delta(x cos\theta ysi…...

【Java】应对高并发的思路

在Java中应对高并发场景需要结合多方面的技术手段和设计模式&#xff0c;从线程管理、数据结构、同步机制到异步处理、IO优化等&#xff0c;都需要合理设计和配置。以下是Java在高并发场景下的主要应对策略和最佳实践&#xff1a; 1. 线程管理 1.1 线程池&#xff08;ThreadPo…...

从数据分析到数据可视化:揭开数据背后的故事

从数据分析到数据可视化:揭开数据背后的故事 大家好,今天咱们聊聊“从数据分析到数据可视化”的完整流程。说实话,数据分析和可视化这俩词听起来高大上,但咱们平时就是围绕这俩词打转——数据分析帮我们找故事,可视化则帮我们讲故事。没有它们,数据就是死的;有了它们,数…...

WPS JS宏实现去掉文档中的所有空行

WPS改造系列文章&#xff1a; 1.在WPS中通过JavaScript宏&#xff08;JSA&#xff09;调用本地DeepSeek API优化文档教程&#xff1a;在WPS中通过JavaScript宏&#xff08;JSA&#xff09;调用本地DeepSeek API优化文档教程_wps javascript-CSDN博客 2.在WPS中通过JavaScrip…...

【2025年软考中级】第一章1.6 安全性、可靠性、性能评价

文章目录 安全性、可靠性、性能评价计算机可靠性可靠性指标串并联系统可靠性并联系统可靠性N模元余系统 计算机系统性能评价信息安全加密技术对称&#xff08;私钥&#xff09;加密技术非对称加密技术&#xff08;公钥&#xff09;对称和非对称加密算法的区别数字信封原理数字签…...

MODBUS RTU通信协议详解与调试指南

一、MODBUS RTU简介 MODBUS RTU&#xff08;Remote Terminal Unit&#xff09;是一种基于串行通信&#xff08;RS-485/RS-232&#xff09;的工业标准协议&#xff0c;采用二进制数据格式&#xff0c;具有高效、可靠的特点&#xff0c;广泛应用于PLC、传感器、变频器等工业设备…...

【深度学习新浪潮】大模型时代,我们还需要学习传统机器学习么?

在大模型时代,AI 工程师仍需掌握传统机器学习知识,这不仅是技术互补的需求,更是应对复杂场景和职业发展的关键。以下从必要性和学习路径两方面展开分析: 一、传统机器学习在大模型时代的必要性 技术互补性 大模型(如GPT、BERT)擅长处理复杂语义和生成任务,但在数据量少…...

深入解析Spring Boot与Spring Security的集成实践

深入解析Spring Boot与Spring Security的集成实践 引言 在现代Web应用开发中&#xff0c;安全性是一个不可忽视的重要方面。Spring Security作为Spring生态中的安全框架&#xff0c;提供了强大的认证和授权功能。本文将结合Spring Boot&#xff0c;详细介绍如何集成Spring Se…...

嵌入式学习笔记 - STM32 使用一个外部触发同时启动两个定时器

一个定时器是同时可以设置成主模式跟从模式的&#xff0c; 下面例子中&#xff0c; 一 TM1首先被配置为主模式&#xff0c; 通过MMS001&#xff1a;使能 – 计数器使能信号CNT_EN被用于作为触发输出(TRGO)。见寄存器描述&#xff0c;此位默认为000&#xff0c;这时从模式状态…...

JWT令牌验证

一、JWT 验证方式详解 JWT&#xff08;JSON Web Token&#xff09;的验证核心是确保令牌未被篡改且符合业务规则&#xff0c;主要分为以下步骤&#xff1a; 1. 令牌解析与基础校验 收到客户端传递的 JWT 后&#xff0c;首先按 . 分割为三部分&#xff1a;Header、Payload、S…...

Go语言 GORM框架 使用指南

在 Go 语言社区中&#xff0c;数据库交互一直是开发者们关注的重点领域&#xff0c;不同开发者基于自身的需求和偏好&#xff0c;形成了两种主要的技术选型流派。一部分开发者钟情于像sqlx这类简洁的库&#xff0c;尽管其功能并非一应俱全&#xff0c;但它赋予开发者对 SQL 语句…...

c#车检车构客户管理系统软件车辆年审短信提醒软件

# CMS_VehicleInspection 车检车构客户管理系统软件车辆年审短信提醒软件 # 开发背景 软件是给泸州某公司开发的车检车构客户管理系统软件。用于在车检年审到期前一个月给客户发送车检短信提醒 # 功能描述 主要功能&#xff1a;车辆年审前一个月给客户发年审短信提醒&#xf…...

匿名函数与闭包(Anonymous Functions and Closures)-《Go语言实战指南》原创

Go 支持将函数当作值来使用&#xff0c;也允许定义匿名函数&#xff0c;并通过闭包实现对外部变量的捕获与持续访问。这一特性使函数式编程风格在 Go 中成为可能。 一、什么是匿名函数&#xff1f; 匿名函数是没有名字的函数&#xff0c;可以定义后立即调用&#xff0c;或赋值…...

兰亭妙微:用系统化思维重构智能座舱 UI 体验

兰亭妙微设计专注于以产品逻辑驱动的界面体验优化&#xff0c;服务领域覆盖AI交互、智能穿戴、IoT设备、智慧出行等多个技术密集型产业。我们倡导以“系统性设计”为方法论&#xff0c;在用户需求与技术边界之间找到最优解。 此次智能驾驶项目&#xff0c;我们为某车载平台提供…...

Flowbite 和 daisyUI 那个好用?

Flowbite 和 daisyUI 都是基于 Tailwind CSS 的组件库&#xff0c;它们各有特色&#xff0c;选哪个更好用&#xff0c;取决于你的项目需求和设计偏好。 简要结论 对比项daisyUIFlowbite上手难度简单&#xff0c;类名即组件略复杂&#xff08;多用 HTML 结构&#xff09;Vue 支…...

中间网络工程师知识点5

1.PKI证书主要用于确保主体公钥的合法性 2.VLAN帧的最小帧长是64字节,其中表示帧优先级的字是PRI 3.WIFI6是2.4GHZ和5GHZ频段的,理论吞吐量最高可达9.6Gbps,遵从协议802.11ax,支持完整版的MU-MIMO 4.在大型无线网络中,AP通过DHCP option43端口来获取AC的IP地址 5.项目…...

二、数据模型

二、数据模型 数据模型回顾 数据模型&#xff08;Data Model&#xff09; 是信息领域采用的模型将现实世界的各种事物以及事物之间的联系&#xff0c;表示为数据以及数据之间的联系是对现实世界数据特征的抽象和模拟用来描述数据、组织数据和操作数是数据库系统的核心和基础 …...

获取淘宝店铺所有商品信息接口数据指南

在电商运营和数据分析中&#xff0c;获取淘宝店铺的商品信息是常见的需求。淘宝开放平台提供了丰富的 API 接口&#xff0c;方便开发者获取商品的详细信息&#xff0c;包括商品列表、商品详情、销量等。本文将详细介绍如何从零开始获取淘宝店铺的所有商品信息&#xff0c;包括注…...

目标检测工作原理:从滑动窗口到Haar特征检测的完整实现

目标检测探索指南 &#x1f50d; 目标检测就像是一位细心的侦探&#xff01;我们需要在图像中寻找并定位特定的目标&#xff0c;就像侦探在现场搜寻线索一样。让我们一起来探索这个充满挑战的图像处理领域吧&#xff01; 目录 1. 什么是目标检测&#xff1f;2. 滑动窗口检测3.…...

【LUT技术专题】针对降噪优化的通道感知轻量级LUT算法:DnLUT

DnLUT&#xff1a;Ultra-Efficient Color Image Denoising via Channel-Aware Lookup&#xff08;2025 CVPR&#xff09; 专题介绍一、研究背景二、DnLUT方法2.1 Pairwise Channel Mixer2.2 Rotation Non-overlapping Kernel&#xff08;L型卷积&#xff09; 三、实验结果四、总…...

支持同步观看的媒体服务器GhostHub

简介 什么是 GhostHub &#xff1f; GhostHub 是一个基于滑动界面的媒体服务器&#xff0c;旨在实现实时同步、聊天和隧道分享。它允许用户快速共享和浏览媒体内容&#xff0c;无需复杂的配置或帐户。 主要特点 零配置: 即开即用&#xff0c;无需安装或创建帐户。滑动浏览: 提…...

告别 pip:使用 uv 加速你的 Python 包管理

使用 uv:更快的 Python 包管理工具 随着 Python 生态的演进,包管理工具也在不断升级迭代。uv 是 Astral(同样维护 ruff 的团队)推出的下一代 Python 包与项目管理器,主打 单一可执行文件、极致性能,可在多数场景下取代 pip、pip-tools、pipx 与 virtualenv 等传统工具,…...

使用glsl 来做视频矫正

描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…...

【VSCode】快捷键合集(持续更新~)

一、基础编辑操作 注释/取消注释 Ctrl /&#xff1a;快速注释或取消注释当前行或选中行。ctrlshift/&#xff1a;块注释 代码格式化 • Shift Alt F&#xff1a;格式化整个文档&#xff0c;统一代码风格。 行操作 • Alt ↑/↓&#xff1a;向上/向下移动当前行。 • Shi…...

MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题

使用 MATLAB 对城市雨季防洪排污问题进行建模与仿真&#xff0c;需要结合数学模型、工程经验和 MATLAB 的数值计算、数据可视化及优化工具。以下是详细的步骤指南&#xff0c;包含实际案例和代码示例&#xff1a; 一、问题分析与建模框架 1. 问题拆解 • 核心目标&#xff1a; …...

由浮点数x的位级表示求其整型值

由浮点数x的位级表示&#xff0c;得到浮点数的十进制表示&#xff0c;在超过32位整型数的表示范围时&#xff0c;返回0X80000000&#xff1b;在32位整型数的表示范围内时&#xff0c;返回强制转化为整型的值。舍入时采用向0舍入。 程序代码 typedef unsigned long int float_…...

【Qt】Qt常见控件的相关知识点

1.close退出槽函数 2.设置快捷键&#xff0c;QMenu 。 适用&字母就能设置快捷键&#xff0c;运行qt程序&#xff0c;最后就可以按Alt对应的字母进行快捷操作。 3.QMenuBar内存泄露问题 如果ui已经自动生成了menubar&#xff0c;我们再次生成一个新的菜单栏&#xff0c;而…...

数据结构*优先级队列(堆)

什么是优先级队列(堆) 优先级队列一般通过堆&#xff08;Heap&#xff09;这种数据结构来实现&#xff0c;堆是一种特殊的完全二叉树&#xff0c;其每个节点都满足堆的性质。如下图所示就是一个堆&#xff1a; 堆的存储方式 由于堆是一棵完全二叉树&#xff0c;所以也满足二…...

Windows本地化部署Dify完整指南

Windows本地化部署Dify完整指南 作者&#xff1a;朱元禄 版权声明&#xff1a;本文为朱元禄原创文章&#xff0c;转载请注明出处及作者信息 关键词&#xff1a;Dify部署,Windows安装Dify,Dify本地化,Dify教程,Dify配置,朱元禄 一、Docker Desktop安装与配置 1.1 下载Docker De…...

全局异常处理:如何优雅地统一管理业务异常

在软件开发中&#xff0c;异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性&#xff0c;还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...

AI517 AI本地部署 docker微调(失败)

本地部署AI 计划使用OLLAMA进行本地部署 修改DNS 访问github 刷新缓存 配置环境变量 OLLAMA安装成功 部署成功 计划使用docker进行微调 下载安装docker 虚拟化已开启 开启上面这些 准备下载ubuntu docker ragflow dify 用git去泡...

C++(初阶)(十八)——AVL树

AVL树 AVL树概念实现AVL树的结点插入插入方法 平衡因子更新更新停止条件旋转右单旋左单旋左右双旋右左双旋 遍历AVL平衡检测 完整代码 概念 1&#xff0c;AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c; 通过控制高度差去控制平衡。…...

2022河南CCPC(前四题)

签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…...

【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数

将 x 减到 0 的最小操作数 一、题目链接二、题目三、题目解析四、算法原理五、编写代码六、时空复杂度 一、题目链接 将 x 减到 0 的最小操作数 二、题目 三、题目解析 以示例1为例&#xff1a; 四、算法原理 像"题目解析"中正面删除并修改数组元素的操作太困难&…...

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…...

linux-软件的安装与部署、web应用部署到阿里云

一、软件安装方式概述 CentOS安装软件的方式主要包括&#xff1a; - 源码安装 - rpm安装&#xff08;二进制安装&#xff09; - yum安装&#xff08;在线安装&#xff09; 1.源码安装&#xff1a; 源码包是指C等语言所开发的源代码文件的一个压缩包&#xff0c;通常压缩为.…...

Qt Widgets模块功能详细说明,基本控件:QLabel(一)

一、基本控件&#xff08;Widgets&#xff09; Qt 提供了丰富的基本控件&#xff0c;如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QLabel 1.1、概述 (用途、继承关系) QLabel 是 Qt 框架中用于显示文本、图像或动画的控件&#xff0c;属…...

Ubuntu 安装 squid

1. 安装Squid及工具 Debian/Ubuntu sudo apt update sudo apt install squid apache2-utils CentOS/RHEL sudo yum install squid httpd-tools 2. 创建用户名密码文件 创建密码文件&#xff08;首次使用 -c 参数&#xff0c;后续添加用户省略&#xff09; sudo htpasswd…...

中药药效成分群的合成生物学研究进展-文献精读130

Advances in synthetic biology for producing potent pharmaceutical ingredients of traditional Chinese medicine 中药药效成分群的合成生物学研究进展 摘要 中药是中华民族的文化瑰宝&#xff0c;也是我国在新药创制领域的重要驱动力。许多中药材来源于稀缺物种&#xf…...

芯片生态链深度解析(三):芯片设计篇——数字文明的造物主战争

【开篇&#xff1a;设计——数字文明的“造物主战场”】 当英伟达的H100芯片以576TB/s显存带宽重构AI算力边界&#xff0c;当阿里平头哥倚天710以RISC-V架构实现性能对标ARM的突破&#xff0c;这场围绕芯片设计的全球竞赛早已超越技术本身&#xff0c;成为算法、架构与生态标准…...