SpringBoot文件与JSON参数同接口接收:@RequestPart方案详解
1. 项目概述当文件上传遇上结构化数据在开发后端接口时我们经常会遇到一个看似简单却暗藏玄机的需求一个接口既要能接收用户上传的文件比如图片、文档又要能同时接收一组结构化的业务参数比如订单信息、用户资料。用SpringBoot的术语来说就是如何在同一个Controller方法里优雅地同时处理MultipartFile和自定义的POJO对象参数。这个问题乍一看不就是把两个参数都写在方法签名里吗但实际动手时新手甚至一些有经验的开发者都可能掉进坑里。比如前端用FormData传了文件和JSON字符串后端却收不到结构体参数或者Swagger文档生成得乱七八糟测试起来极其不便。这背后涉及到HTTP请求体编码、Spring MVC的参数解析机制、以及前后端协作的约定任何一个环节理解不到位都会导致接口调不通。我自己在重构一个内容发布系统时就踩过这个坑。当时需要用户提交一篇带封面的文章封面是图片文件文章标题、内容、分类等信息是一个JSON对象。最初分开成两个接口体验割裂后来想合并却因为参数绑定问题调试了半天。今天我就把这个从踩坑到填坑的完整过程包括背后的原理、多种实现方案、Swagger集成、以及性能优化的思考系统地梳理出来。无论你是正在处理类似需求的开发者还是想深入理解SpringBoot请求处理机制这篇文章都能给你提供一份可直接“抄作业”的实操指南。2. 核心需求与方案选型背后的逻辑为什么这个需求如此普遍又容易出错我们需要先理解其核心矛盾。HTTP协议在传输复合数据时主要有两种编码方式application/x-www-form-urlencoded表单编码和multipart/form-data多部分表单。当需要上传文件时必须使用multipart/form-data因为它能将文件数据和文本数据分块传输。而我们的“结构体参数”通常是一个复杂的JSON对象它理想情况下应该放在请求体的一个“部分”Part里并以JSON格式解析。SpringBoot的RequestParam注解擅长处理简单的键值对RequestBody注解能完美处理整个请求体为JSON的情况但当一个请求体同时包含文件MultipartFile和JSON时单一的注解就力不从心了。Spring MVC提供了一个强大的MultipartHttpServletRequest对象来解析这种复杂请求但直接操作它比较原始。因此我们的目标就是找到一种更优雅、更符合Spring风格的方式来绑定这些参数。2.1 三种主流实现方案对比在实际项目中我主要评估和使用了以下三种方案它们各有优劣适用于不同场景。方案一使用RequestPart注解推荐这是Spring框架为处理multipart/form-data请求中的复杂部分而设计的“官方推荐”方式。RequestPart不仅会读取请求体的一部分还会根据Content-Type头信息如application/json使用配置好的HttpMessageConverter如MappingJackson2HttpMessageConverter来反序列化该部分内容到Java对象。这意味着前端可以直接将结构体参数序列化成JSON字符串作为一个独立的“part”发送后端能自动完成绑定。方案二混合使用RequestParam与字符串转换这种方法将结构体参数作为一个普通的表单字段application/json字符串发送后端用RequestParam String jsonParam接收然后在方法体内手动使用ObjectMapper进行反序列化。它的优点是实现简单对前端改动小缺点是污染了控制器逻辑且无法利用Spring的自动数据绑定和验证如Valid。方案三接收MultipartHttpServletRequest并手动解析这是最底层、最灵活的方式。直接接收MultipartHttpServletRequest对象然后从中获取文件部分和其他的参数部分进行手动处理。它通常用于非常特殊或复杂的场景但代码最繁琐不推荐在常规业务中使用。为了更直观地对比我将它们的核心区别整理如下特性维度方案一RequestPart方案二RequestParam 手动解析方案三MultipartHttpServletRequest优雅度⭐⭐⭐⭐⭐ (声明式最Spring风格)⭐⭐ (需手动解析侵入性强)⭐ (完全手动代码冗余)参数验证支持结合Valid不支持需在解析后手动验证不支持Swagger支持良好需正确配置较差类型显示为String无前端配合需构造FormData并正确设置Part简单当作普通字段复杂需了解请求结构适用场景绝大多数标准场景快速原型、简单参数需要直接操作请求的极端情况基于以上分析方案一RequestPart在可维护性、开发体验和框架契合度上全面胜出是我们本次重点详解的实现方式。方案二可以作为临时或兼容旧接口的备选方案了解。3. 基于RequestPart的完整实现与配置确定了方案我们来一步步实现。假设我们有一个“用户头像更新”接口需要接收一个图片文件和一个包含用户昵称和签名的JSON对象。3.1 定义数据结构与Controller首先定义接收结构体参数的数据模型。这里使用一个简单的POJO并加上数据验证注解。import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; Data public class UserProfileUpdateDTO { NotBlank(message 用户昵称不能为空) Size(max 20, message 昵称长度不能超过20个字符) private String nickname; Size(max 100, message 个人签名长度不能超过100个字符) private String bio; }接下来是Controller层的实现。这是最核心的部分。import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; RestController RequestMapping(/api/user/profile) public class UserProfileController { PostMapping(value /update-with-avatar, consumes MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntityString updateProfileWithAvatar( RequestPart(avatarFile) Valid MultipartFile avatarFile, RequestPart(profileData) Valid UserProfileUpdateDTO profileData) { // 1. 基本参数校验 (Spring Validation已通过Valid完成) if (avatarFile.isEmpty()) { return ResponseEntity.badRequest().body(头像文件不能为空); } // 2. 业务逻辑处理例如保存文件、更新数据库 // String filePath fileStorageService.save(avatarFile); // userService.updateProfile(profileData, filePath); // 3. 返回结果 return ResponseEntity.ok(头像和资料更新成功); } }关键点解析PostMapping的consumes属性明确声明此接口只消费multipart/form-data类型的请求。这是一个好习惯能让API意图更清晰Swagger等工具也能据此生成正确的文档。RequestPart注解这是灵魂所在。value属性这里简写为avatarFile和profileData必须与前端FormData中对应字段的键名完全一致。Valid注解它被用在UserProfileUpdateDTO参数前Spring MVC会在参数绑定后自动执行JSR-303验证。如果验证失败会抛出MethodArgumentNotValidException通常由全局异常处理器处理。注意Valid也可以用在MultipartFile参数前但通常文件本身的校验如非空、类型、大小在方法体内进行更灵活。MultipartFileSpring提供的文件上传抽象接口可以轻松获取文件名、内容类型、输入流和字节数据。3.2 前端请求构造示例后端接口定义好了前端如何调用呢这里以JavaScript的Fetch API为例。// 假设有一个文件输入框 input typefile idavatarInput // 和表单输入框 input typetext idnicknameInput 等 const avatarFile document.getElementById(avatarInput).files[0]; const profileData { nickname: document.getElementById(nicknameInput).value, bio: document.getElementById(bioInput).value }; const formData new FormData(); // 关键步骤1添加文件字段名“avatarFile”必须与RequestPart(avatarFile)匹配 formData.append(avatarFile, avatarFile); // 关键步骤2将JSON对象序列化成字符串并设置正确的Content-Type // 许多坑都是因为这一步没做对 const profileDataBlob new Blob( [JSON.stringify(profileData)], { type: application/json } // 明确指定Content-Type为JSON ); formData.append(profileData, profileDataBlob); // 发送请求 fetch(/api/user/profile/update-with-avatar, { method: POST, body: formData // headers不要手动设置Content-Type浏览器会根据FormData自动设置为multipart/form-data并带上boundary。 }).then(response response.json()) .then(data console.log(data));前端注意事项不要设置Content-Type头使用FormData对象作为请求体时浏览器会自动设置合适的Content-Type例如multipart/form-data; boundary----WebKitFormBoundaryxxxxx。手动设置会覆盖这个正确的值导致后端解析失败。结构体参数必须作为Blob添加直接将JavaScript对象formData.append(profileData, profileData)是不行的这样后端收到的只是一个[object Object]字符串。必须将其序列化为JSON字符串并包装成Blob同时指定type: application/json。这样这个Part的请求头里就会包含Content-Type: application/jsonSpring的MappingJackson2HttpMessageConverter才能识别并转换它。字段名必须匹配formData.append的第一个参数必须与后端RequestPart注解中指定的名称严格一致。3.3 SpringBoot配置要点通常SpringBoot的默认配置足以支持文件上传。但了解以下配置项能帮你应对更多场景。1. 配置文件上传大小限制 (application.yml)spring: servlet: multipart: max-file-size: 10MB # 单个文件最大大小 max-request-size: 20MB # 整个请求最大大小 enabled: true # 启用multipart支持如果上传的文件超过限制Spring会抛出MaxUploadSizeExceededException同样需要在全局异常处理器中捕获并返回友好提示。2. 确保Jackson消息转换器就绪RequestPart依赖HttpMessageConverter来解析非文件部分。SpringBoot的Web starter默认已经引入了Jackson并配置了MappingJackson2HttpMessageConverter。只要你添加了相关的JSON依赖如spring-boot-starter-json这部分通常无需额外配置。一个常见的坑是如果你在项目中通过WebMvcConfigurer自定义了消息转换器列表务必不要覆盖掉默认的列表或者确保将MappingJackson2HttpMessageConverter添加进去。4. 集成Swagger/OpenAPI生成正确文档在前后端分离开发中接口文档至关重要。使用springdoc-openapiSwagger UI v3可以很好地为这种复杂接口生成文档。1. 添加依赖 (Maven)dependency groupIdorg.springdoc/groupId artifactIdspringdoc-openapi-starter-webmvc-ui/artifactId version2.3.0/version !-- 请使用最新版本 -- /dependency2. 使用Operation和Parameter注解描述接口直接使用之前的ControllerSwagger基本能识别但为了文档更清晰可以添加注解import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; Tag(name 用户资料管理, description 用户头像和基础信息管理相关接口) RestController RequestMapping(/api/user/profile) public class UserProfileController { Operation(summary 更新头像和资料, description 同时上传头像图片和更新个人资料JSON) PostMapping(value /update-with-avatar, consumes MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntityString updateProfileWithAvatar( Parameter(description 用户头像图片文件, required true) RequestPart(avatarFile) MultipartFile avatarFile, Parameter(description 用户资料JSON对象, required true, schema Schema(implementation UserProfileUpdateDTO.class)) RequestPart(profileData) Valid UserProfileUpdateDTO profileData) { // ... 方法实现 } }3. 生成的文档效果与测试启动应用后访问http://localhost:8080/swagger-ui.html你会看到接口文档中avatarFile参数类型是file而profileData参数类型会显示为一个可展开的JSON Schema模型对应UserProfileUpdateDTO的结构。你甚至可以直接在Swagger UI界面上传文件和填写JSON进行测试非常方便。注意早期版本的springfoxSwagger 2对multipart/form-data和RequestPart的支持有诸多问题比如无法正确显示JSON模型。强烈建议迁移到springdoc-openapi它对现代SpringBoot的支持更好文档生成也更准确。5. 进阶话题参数验证、异常处理与性能考量实现基本功能后我们还需要关注鲁棒性和性能。5.1 精细化参数验证文件校验除了非空校验我们通常还需要校验文件类型和大小。// 在Controller方法内 private static final ListString ALLOWED_IMAGE_TYPES Arrays.asList(image/jpeg, image/png, image/gif); private static final long MAX_FILE_SIZE 5 * 1024 * 1024; // 5MB if (!ALLOWED_IMAGE_TYPES.contains(avatarFile.getContentType())) { throw new IllegalArgumentException(仅支持JPEG, PNG, GIF格式的图片); } if (avatarFile.getSize() MAX_FILE_SIZE) { throw new IllegalArgumentException(文件大小不能超过5MB); }更优雅的做法是自定义一个注解如ValidFile结合Validator进行校验。DTO嵌套验证如果UserProfileUpdateDTO里还嵌套了其他对象可以在字段上使用Valid来触发级联验证。Data public class UserProfileUpdateDTO { NotBlank private String nickname; Valid // 触发AddressDTO内部的验证规则 private AddressDTO address; }5.2 全局异常处理为了让前端收到统一、友好的错误响应必须处理参数绑定和验证抛出的异常。RestControllerAdvice public class GlobalExceptionHandler { // 处理JSR-303参数验证失败异常 ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntityMapString, Object handleValidationException(MethodArgumentNotValidException ex) { MapString, Object body new LinkedHashMap(); body.put(timestamp, LocalDateTime.now()); body.put(status, HttpStatus.BAD_REQUEST.value()); body.put(error, 参数验证失败); ListString errors ex.getBindingResult() .getFieldErrors() .stream() .map(error - error.getField() : error.getDefaultMessage()) .collect(Collectors.toList()); body.put(message, errors); return new ResponseEntity(body, HttpStatus.BAD_REQUEST); } // 处理文件大小超限异常 ExceptionHandler(MaxUploadSizeExceededException.class) public ResponseEntityString handleMaxSizeException(MaxUploadSizeExceededException exc) { return ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE) .body(上传的文件大小超过系统限制); } // 处理请求内容类型不支持等异常 ExceptionHandler(HttpMediaTypeNotSupportedException.class) public ResponseEntityString handleMediaTypeNotSupported() { return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE) .body(请求的Content-Type不支持请使用multipart/form-data); } }5.3 性能与大数据量处理当上传的文件很大或者结构体参数非常复杂时需要考虑性能。文件存储异步化保存文件到本地磁盘或云存储如OSS、S3可能是I/O密集型操作可以考虑使用Async异步处理或提交到消息队列让接口快速返回。Async public CompletableFutureString saveFileAsync(MultipartFile file) { // 保存文件逻辑 return CompletableFuture.completedFuture(filePath); }避免大文件内存驻留默认情况下Spring会将上传的文件先存储在内存中超过阈值spring.servlet.multipart.file-size-threshold再写入临时文件。对于超大文件建议直接配置为写入临时文件并使用流式处理避免内存溢出OOM。spring: servlet: multipart: file-size-threshold: 0B # 设置为0所有文件都直接写入临时磁盘文件在处理时使用multipartFile.getInputStream()进行流式读取而不是multipartFile.getBytes()一次性加载到内存。DTO结构优化如果结构体参数字段极多但每次请求只更新其中几个可以考虑设计多个精简的DTO或者使用JsonNodeJackson库进行动态解析只提取需要的字段而不是反序列化整个大对象。6. 常见问题排查与调试技巧在实际开发联调中你可能会遇到以下问题。这里是我的排查清单。问题1后端收不到profileData对象属性全部为null。可能原因A前端未正确设置Part的Content-Type。这是最常见的原因。如前文所述必须将JSON字符串包装成Blob并设置type: application/json。可以通过浏览器开发者工具的“网络”选项卡查看该Part的请求头是否包含Content-Type: application/json。可能原因B字段名不匹配。检查前端formData.append的字段名与后端RequestPart(“字段名”)是否完全一致包括大小写。可能原因CJSON格式错误。确保序列化后的JSON字符串是有效的。可以在后端方法入口处打印原始请求信息进行调试。问题2Swagger文档中profileData参数显示为字符串类型而不是JSON模型。解决方案这通常是springfox的bug或配置问题。切换到springdoc-openapi几乎能解决所有问题。如果必须用springfox可以尝试使用ApiParam(dataType “YourDTOClassName”)来显式指定类型但效果不稳定。问题3报错Content type ‘multipart/form-databoundary...’ not supported可能原因Controller方法上的PostMapping缺失了consumes MediaType.MULTIPART_FORM_DATA_VALUE属性或者全局的HttpMessageConverter配置有误导致Spring不知道用哪个解析器来处理这个请求。解决方案首先确保添加了consumes属性。其次检查是否在自定义Web配置中移除了默认的FormHttpMessageConverter或Multipart相关的Resolver。问题4文件上传速度慢。排查方向网络检查客户端到服务器的网络状况。服务器配置检查max-file-size和max-request-size是否设置过小导致Spring在接收完整请求前就中断。磁盘I/O如果文件保存到服务器本地检查磁盘性能。考虑使用异步或队列处理。临时目录Spring使用的临时目录如/tmp如果磁盘空间不足或I/O慢也会影响性能。可以通过spring.servlet.multipart.location自定义临时目录。调试利器在开发阶段可以添加一个拦截器或AOP打印出MultipartHttpServletRequest中的所有Part信息这对于理解前端发送的数据结构非常有帮助。PostMapping(...) public ResponseEntity? upload(RequestPart MultipartFile file, RequestPart String jsonData, HttpServletRequest request) { if (request instanceof MultipartHttpServletRequest) { MultipartHttpServletRequest multipartRequest (MultipartHttpServletRequest) request; multipartRequest.getFileMap().forEach((k, v) - log.info(File part: {} - {}, k, v.getOriginalFilename())); multipartRequest.getMultiFileMap().forEach((k, v) - log.info(File list part: {} - {}, k, v.size())); multipartRequest.getParameterMap().forEach((k, v) - log.info(Param part: {} - {}, k, Arrays.toString(v))); } // ... 业务逻辑 }掌握这些排查技巧能让你在遇到问题时快速定位而不是盲目地搜索和尝试。

相关新闻

二维正态分布等高线形态与协方差矩阵解析

二维正态分布等高线形态与协方差矩阵解析

1. 正态分布等高线的基本形态解析当我们谈论二维正态分布的等高线时,实际上是在讨论概率密度函数的等值线。对于均值为μ、协方差矩阵为Σ的二维正态分布,其概率密度函数可以表示为:f(x) (1/(2π|Σ|^(1/2))) * exp(-1/2 (x-μ)^T Σ^(-1) (…

2026/10/9 5:20:52 阅读更多 →
XIAO EE02电子纸开发指南:从入门到物联网天气站实战

XIAO EE02电子纸开发指南:从入门到物联网天气站实战

1. 项目概述:为什么选择XIAO EE02?如果你和我一样,对物联网设备、桌面摆件或者低功耗信息展示屏感兴趣,那么一块好用的电子纸(E-Paper)显示板绝对是“神器”。最近上手了Seeed Studio推出的XIAO ESP32S3 Se…

2026/10/12 12:12:48 阅读更多 →
BoolHybridArray 高效布尔混合数组实战效果展示Python布隆过滤器替代方案:亿级数据去重的位图混合存储实践

BoolHybridArray 高效布尔混合数组实战效果展示Python布隆过滤器替代方案:亿级数据去重的位图混合存储实践

在处理大规模布尔数据时,很多开发者会陷入一个两难境地:使用原生列表虽然操作灵活,但内存占用惊人,尤其是在百万级数据量下,大量 True 或 False 的重复存储造成了极大的资源浪费;而转向 numpy 或位运算压缩…

2026/10/8 9:30:59 阅读更多 →

最新新闻

Visio中MathType公式变形怎么办?一份稳定排版流程与排错指南

Visio中MathType公式变形怎么办?一份稳定排版流程与排错指南

干这行的人,十有八九都被同一个问题折磨过:明明在Word里排得整整齐齐的MathType公式,往Visio里一粘就变形。分式缩成一团,上标下标全挤在一起,字体忽大忽小,严重的直接变成灰色方块。我最早踩这个坑是在画某…

2026/10/12 21:32:25 阅读更多 →
软件测试类型全解析:从分类维度到工程实践

软件测试类型全解析:从分类维度到工程实践

做测试这行,最怕的不是Bug多,而是盘不清自己到底在测什么。项目一启动,评审会上一聊“这一轮我们测哪些类型”,如果大家脑子里只有“功能、性能、兼容性”这三个词,后面就等着扯皮吧。测试类型这个事,看起来…

2026/10/12 21:32:25 阅读更多 →
2025工程审计大模型应用指南:DeepSeek落地合同比对与合规初筛

2025工程审计大模型应用指南:DeepSeek落地合同比对与合规初筛

简介:这份《2025面向工程审计行业的DeepSeek大模型应用指南》由南京审计大学工程审计学院相关团队编写,面向工程审计从业者、高校研究者及希望将大模型引入审计场景的技术人员,旨在回应传统审计依赖人工抽样、难以融合分析海量工程数据与非结…

2026/10/12 21:32:25 阅读更多 →
中草药YOLO目标检测数据集:开箱即用的标准化药材图像数据

中草药YOLO目标检测数据集:开箱即用的标准化药材图像数据

简介:本资源是一套专为YOLO目标检测任务定制的中草药图像数据集,面向计算机视觉初学者、中医药AI方向研究者及YOLO模型实战开发者,解决中草药种类识别与定位缺乏高质量标注数据的痛点。数据集严格遵循YOLOv5目录结构组织,含训练集…

2026/10/12 21:32:25 阅读更多 →
电磁兼容第一道防线:结构设计中的缝隙、开孔与搭接控制

电磁兼容第一道防线:结构设计中的缝隙、开孔与搭接控制

1. 为什么“结构”才是电磁兼容的第一道防线?很多人一听到电磁兼容(EMC),第一反应是滤波、屏蔽、接地——然后立刻打开电路设计软件,调出共模电感参数,翻出PCB叠层手册查参考平面完整性,再对着地…

2026/10/12 21:32:24 阅读更多 →
VUE集成UEditor完整指南:从组件封装到图片上传与问题排查

VUE集成UEditor完整指南:从组件封装到图片上传与问题排查

把VUE集成UEditor这事儿,你在搜索引擎里能翻出一百篇帖子,但真正能一次跑通的,估计不到三成。写帖子的人大多是贴了个组件就完事,没告诉你UEditor那套偏老旧的纯前端架构,跟现在VUE工程化构建之间隔了多少条沟。你照着…

2026/10/12 21:31:18 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →