Qt网络编程上传:QNetworkAccessManager与multipart
干这行时间长了你会发现一个规律但凡Qt客户端要跟服务器打交道不管是登录、上报日志、同步配置还是交作业文件最后都会落到一个动作上——HTTP上传。这几乎是桌面应用和Web服务握手的基础操作。我这篇就把这套东西讲透从QNetworkAccessManager的选型到multipart/form-data的边界再到进度回调、超时控制、内存占用这些实战里必然踩的坑一次性讲明白。内容覆盖POST提交JSON和表单、单文件上传、文件加字段混合上传、上传进度显示、超时与取消、大文件内存优化、疑难杂症排查。适合刚接触Qt网络编程的新手也适合写过几个版本但总在某几个问题上翻车的开发者。1. 整体设计与思路拆解1.1 为什么首选QNetworkAccessManagerQt做HTTP这幅蓝图里其实不止一种选择。底层的QTcpSocket能自己拼HTTP报文灵活性高但工作量大QHttp旧模块早被淘汰了真正主流且官方推荐的就是QNetworkAccessManager——一个管理请求和应答的高层门面。QNetworkAccessManager本质上是一台“请求调度引擎”。你给它一个QNetworkRequest配好数据体它负责发出去、等待服务器应答、再用QNetworkReply封装返回结果。你完全不用关心HTTP连接是怎么keep-alive、怎么分块的连重定向、代理、SSL握手它都能帮你处理。你只需要关心业务请求要什么、数据怎么拼、应答怎么解析。我见过有人刻意绕过QNetworkAccessManager用原生socket手搓HTTP报文多半是为了追求“可控性”。但实际做下来手搓报文要处理长连接、chunked编码、Content-Length计算任何一个环节偏离标准都可能被服务器拒绝性价比极低。1.2 表单数据与文件上传的本质区别HTTP上传这里有个高频概念叫multipart/form-data。很多新手不理解为什么我POST一个JSON可以直接发传文件就得用这种格式关键在于数据类型不同。“字符串参数”用application/x-www-form-urlencoded就够了把键值对拼成key1value1key2value2再URL编码一下。这个格式简单但只适合小字段。文件是二进制流如果把它强行塞进URL编码格式字节转义成本高、服务器解析复杂、可读性也差。multipart/form-data的标准做法是把请求体切分成多个“部件”每个部件有自己的头信息文件部件通过Content-Disposition声明文件名和字段名二进制字节原样传输。也就是说HTTP协议里“文件”这个概念本质上就是带元信息的多段数据流。我在项目里一般这样定性业务接口参数多是JSON速度快、解析方便但只要涉及用户上传文件一律用multipart/form-data。两者看着都是POST背后的“行为契约”完全不同。2. 核心细节解析与实操要点2.1 Content-Type定生死这一步容易出问题。Content-Type是请求体的“身份证”服务器靠它决定怎么解析你发的数据。JSON要设application/json文件要设multipart/form-data表单要设application/x-www-form-urlencoded。设错了哪怕数据正确服务器也可能返回415或解析出空字段。特别是QHttpMultiPart这种多部件结构很多人以为设置了请求头的Content-Type就可以了。实际上QNetworkAccessManager在检测到request里带QHttpMultiPart对象时会自动把请求修正为multipart/form-data并补上boundary内容。手动去设Content-Type反而画蛇添足容易丢掉boundary。直接不设让它自己处理。2.2 QNetworkReply的生命周期管理QNetworkReply是这次上传的“成绩单”但很多人在这里踩到崩溃。上传完成后reply不会自己消失如果你在finished槽函数里没有deleteLater内存就积累了跑一整天业务内存缓缓爬升然后被运维质问。在Qt 5的lambda连接风格里我习惯在finished回调末尾推进reply-deleteLater()。这个deleteLater是安全的它不会马上释放而是等控制权回到事件循环再清理。如果你用旧式QObject::connect接类成员函数那个函数里同样要记得清理。注意一个细节如果你的QNetworkReply还关联着一个QHttpMultiPart那么这两者的释放顺序有讲究。应当等finished信号后再清理multiPart因为multiPart内部绑定的QFile设备必须在请求完成后才能安全关闭。2.3 超时控制得自己来做Qt的QNetworkAccessManager没有内置超时参数。你没看错它确实没有。遇到服务器黑洞、网络中断QNetworkReply会一直挂着既不成功也不失败。我曾在一个项目里靠加大全局请求超时来规避结果用户上传大文件时还是卡在99%不动。解决办法是借助QTimer做兜底QTimer *timer new QTimer(reply); timer-setSingleShot(true); connect(timer, QTimer::timeout, reply, QNetworkReply::abort); connect(reply, QNetworkReply::finished, timer, QTimer::stop); timer-start(30000);这是一个30秒的兜底逻辑到点还没完成就直接abort让finished走到错误分支。这里要保证timer归属在reply下也就是new QTimer(reply)这样reply释放的时候timer跟着一起被清理不会形成悬空指针。2.4 线程亲和性不能乱来QNetworkAccessManager设计上可以跨线程调度请求但有一个隐蔽的坑reply的信号到底在哪个线程里发永远取决于QNetworkAccessManager对象本身的线程亲和性。你在子线程创建一个manager又把它绑定的reply信号连接到主线程的槽函数这个连接能工作但如果你在处理槽函数里直接访问manager内部的某种状态就可能竞争。我的原则很简单全局只保留一个有固定线程亲和性的QNetworkAccessManager实例通常就是主线程这个所有上传请求都往这个实例上丢。跨线程需要发送的通过信号槽或队列连接收数据而不是在子线程直接持有reply。这个原则帮我挡住过无数次的野指针和偶发崩溃。3. 实操过程与核心环节实现3.1 用POST提交JSON或表单数据先写最基础的不带文件的普通POST请求。以下代码示意提交JSON// 初始化网络管理器通常作为类成员只初始化一次 m_manager new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(QUrl(https://api.example.com/v1/upload)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); request.setRawHeader(Authorization, Bearer token-here); QJsonObject obj; obj[scene] report; obj[size] 1024; obj[md5] d41d8cd98f00b204e9800998ecf8427e; QNetworkReply *reply m_manager-post(request, QJsonDocument(obj).toJson()); connect(reply, QNetworkReply::finished, this, [this, reply]() { if (reply-error() QNetworkReply::NoError) { qDebug() 上传成功服务器响应 reply-readAll(); } else { qDebug() 上传失败 reply-errorString(); } reply-deleteLater(); });没有文件的情况下别用multipartJSON或表单更合适。服务器端解析JSON通常比解析multipart可靠因为boundary一旦拼接出错整个请求体就废了。如果你的后端是传统表单接口把ContentTypeHeader改成application/x-www-form-urlencoded然后post一个已经编码好的字符串QString data scenereportsize1024; QNetworkReply *reply m_manager-post(request, data.toUtf8());注意对于表单数据字符编码统一走UTF-8不要使用系统默认编码否则一旦系统切换到GBK区域字段里的中文会变成乱码。3.2 单文件上传的完整实现这是最核心的场景。文件上传要用QHttpMultiPart它的作用是把请求体切块并自动生成boundary分隔线QHttpMultiPart *multiPart new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(form-data; name\file\; filename\report.pdf\)); QFile *file new QFile(/path/to/report.pdf); if (!file-open(QIODevice::ReadOnly)) { qDebug() 文件打开失败 file-errorString(); delete multiPart; return; } filePart.setBodyDevice(file); file-setParent(multiPart); // 关键文件设备归 multiPart 管理 multiPart-append(filePart); QNetworkRequest request; request.setUrl(QUrl(https://api.example.com/upload)); QNetworkReply *reply m_manager-post(request, multiPart); connect(reply, QNetworkReply::finished, this, [this, reply, multiPart]() { if (reply-error() QNetworkReply::NoError) { qDebug() 文件上传成功 reply-readAll(); } else { qDebug() 文件上传失败 reply-errorString(); } reply-deleteLater(); multiPart-deleteLater(); // 到这一步才能安全释放 });filePart.setBodyDevice(file)这行函数是分水岭。它要求文件必须已以QIODevice::ReadOnly方式打开否则上传会静默失败。另一个容易忽略的是file-setParent(multiPart)这保证multiPart析构时文件设备一起被销毁否则你还要手动管理file的释放时机。我回过一遍源码QHttpMultiPart在发送时会从绑定的QIODevice里循环读取数据它会自己处理打开与读取状态不需要你把整个文件一次性加载到内存这正是它适合传大文件的原因。3.3 文件与普通字段混合上传业务场景很少只传文件不带字段。常见需求是上传一个图片同时附带备注文字、用户ID、上传时间。这些都应当作为独立的QHttpPart一并塞进multiPart。写一个可以复用的上传函数void Uploader::uploadFileWithFields(const QString filePath, const QMapQString, QString fields, const QUrl url) { QHttpMultiPart *multiPart new QHttpMultiPart(QHttpMultiPart::FormDataType); // 1. 先挂普通字段 for (auto it fields.constBegin(); it ! fields.constEnd(); it) { QHttpPart fieldPart; fieldPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString(form-data; name\%1\).arg(it.key()))); fieldPart.setBody(it.value().toUtf8()); multiPart-append(fieldPart); } // 2. 再挂文件 QFile *file new QFile(filePath); if (!file-open(QIODevice::ReadOnly)) { qDebug() 文件打开失败; delete multiPart; return; } QHttpPart filePart; filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(form-data; name\file\; filename\ QFileInfo(filePath).fileName() \)); filePart.setBodyDevice(file); file-setParent(multiPart); multiPart-append(filePart); // 3. 发起请求 QNetworkRequest request(url); QNetworkReply *reply m_manager-post(request, multiPart); connect(reply, QNetworkReply::finished, this, [this, reply, multiPart]() { handleReplyFinished(reply); multiPart-deleteLater(); }); }字段顺序在multipart里其实不敏感但服务器端如果是老式框架可能会有“先读字段后读文件”的内部顺序约束。如果你发现服务器能收到文件但字段是空的尝试把字段的QHttpPart放在文件前面排查成本最低。3.4 上传进度显示上传进度是文件上传绕不开的体验指标。QNetworkReply提供了uploadProgress信号字节发送变化时触发connect(reply, QNetworkReply::uploadProgress, this, [](qint64 bytesSent, qint64 bytesTotal) { if (bytesTotal 0) { qDebug() 未知总大小已上传 bytesSent; return; } int percent qRound(bytesSent * 100.0 / bytesTotal); qDebug() 上传进度 percent %; });这里有个非常常见的坑bytesTotal可能为0。尤其当服务器没有通过Content-Length或响应头明确告知总大小的时候。如果你直接拿bytesTotal当除数就会除零崩溃。所以先判0再算百分比。进度条控件的更新频率不必跟信号完全一样。uploadProgress可能非常高频尤其是本地小文件几乎瞬间完成。我一般会加一个节流比如每1%刷新一次UI或者用QElapsedTimer控制最小间隔时间避免大量信号冲刷事件循环。3.5 大文件上传的内存优化我在某个项目里传过接近2GB的监控录像。那种情况下绝对不能把整个文件读进QByteArray再丢给网络层。正确的姿势就是上面展示的把QFile直接绑定到QHttpPart。QNetworkAccessManager在底层会按块读取这个文件设备读取一块发送一块内存占用稳定在几MB以内。但还有一个细节QFile这类顺序读取设备必须把seek(0)到文件开头再给setBodyDevice。如果你之前文件已经被读过比如做了MD5计算文件指针停在末尾上传内容就会是空的。发送前统一resetfile-seek(0); filePart.setBodyDevice(file);如果你要传的是内存中已存在的数据比如一张刚生成的截图直接用setBody塞QByteArray没问题QHttpPart会自己拷贝一份。但面对超大文件优先文件设备别做无谓的拷贝。4. 常见问题与排查技巧实录4.1 信号没触发接口却已在服务器上收到了请求这个现象很经典服务器日志显示请求进来了、也返回了响应但Qt这边finished就是没反应。我排查过多次根因基本都在一个地方——你把QNetworkAccessManager创建在了局部作用域且没有父对象函数执行完manager就被销毁了reply请求自然被撤销。void function() { QNetworkAccessManager manager; // 错局部对象马上销毁 QNetworkReply *reply manager.post(...); }QNetworkAccessManager必须活得比请求长。要么类成员、要么new出来挂到某个长期对象上。还有一个隐蔽情况manager所在线程没有启动事件循环。Qt网络信号依赖事件循环分发如果你的worker线程写了个死循环调度事件循环卡住信号永远到不了槽函数。4.2 上传中文文件名引发服务器解析失败很多同行的服务器代码是用各种Web框架写的对multipart头里的filename解析默认按Latin1或UTF-8做。Qt构造ContentDisposition头的时候如果你直接拼filename测试报告.pdf这串字符经过Qt内部编码转换后可能已经变成?????.pdf。正确做法是先对文件名做URL编码QString encodedName QUrl::toPercentEncoding(QFileInfo(filePath).fileName()); filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(form-data; name\file\; filename\ encodedName \));服务器端收到的是%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.pdf再decode一次拿到原始文件名。不是所有服务器都会自动解码最好提前和后端确认解的是百分号编码还是原始UTF-8。4.3 上传到一半网络断了reply直接挂死这个在前面聊超时的时候提过。真实网络环境里服务器网线被拔、中间路由器丢包TCP连接还处于半开状态Qt无法立即感知错误。我遇到过上传到98%后卡了3分钟的情况用户早就走了。超时兜底是必须做的。但超时时间不能一刀切。如果你传的是50MB文件给30秒可能不够传小文件16秒就行。我的建议是按文件大小动态算int timeoutMs 30000 static_castint(fileSizeInMB * 2000);基础时间保证握手和请求头的开销之后每MB追加2秒这样不同规模的传输都能有合理的等待窗口。4.4 上传成功但服务器端读到的文件不完整这类问题的典型行为response显示200文件大小比原文件小几KB。通常原因是服务器或中间代理在Content-Length和实际传输字节数不一致时的截断。在Qt侧我能做的排查手段就两步第一检查QNetworkReply的rawHeaderPairs里是否有Content-Length对比文件实际大小第二上传前自己算MD5让服务器返回校验结果。这属于带宽换可靠性的策略。另有一种“不完整”是逻辑层面的QFile指针没seek(0)文件末尾内容没被读到上面已经讲过这里再强调一次。4.5 代理和证书导致的环境性失败如果你在公司内网环境开发网络出问题的第一怀疑对象就是系统代理。Qt的网络请求会读系统代理设置而代理对multipart类型的流量有时会做缓冲或改动导致服务器识别异常。代码层面可以做一次确认QNetworkProxy proxy; proxy.setType(QNetworkProxy::NoProxy); m_manager-setProxy(proxy);需要注意的是如果公司内网真的需要代理才通外网把代理关掉会导致连接失败。这个设置只适合排查场景生产环境最好走配置而不是写死。HTTPS接口还会遇到自签名证书问题。内部测试环境经常用自建CAQNetworkRequest拒绝后回调会收到QNetworkReply::SslHandshakeFailedError。此时别急着在生产代码里去忽略证书校验错误只在开发调试阶段用connect(m_manager, QNetworkAccessManager::sslErrors, [](QNetworkReply *reply, const QListQSslError errors) { reply-ignoreSslErrors(errors); });这等于放弃了证书验证数据加密通道还在但中间人攻击的风险完全暴露上线前必须移除。4.6 上传速度慢的隐藏元凶QNetworkAccessManager的设置有些老项目会开启QNetworkAccessManager::setNetworkAccessible或设置了全局低速代理上传速度突然变得不正常。还有一种情况是DNS解析慢。排查时先做一个隔离测试套一个程序里没有业务逻辑的最小上传示例如果速度正常问题就在你的业务层如果也慢往环境、代理、防火墙层面查。我心里的调优基线是QNetworkAccessManager保持单例复用不要每次上传都new一个新的。因为每次new都会重建底层连接池建立TLS或TCP握手的开销非常大。单例让连接可以keep-alive二次上传能省掉大量握手时间。4.7 避免重复上传的幂等设计网络重试机制带来的副作用是重复提交。用户点一次上传Qt发了请求因为超时进入失败分支但服务器其实已经收到了并处理完毕用户再点一次数据就重复了。我的处理思路是每次上传请求带一个clientRequestIdUUID服务器端用这个字段做幂等。如果不方便改后端至少在前端加一个上传锁同一文件正在上传中就不允许再次提交。这个小但关键的细节在真实项目里往往比网络问题更容易被忽视。5. 一次上传流程的完整复盘把整个流程串起来梳理一份可执行的起点清单。请求前准备确认请求URL、确认请求方法POST还是PUT、确认文件路径可读、算好MD5如果有签名需求、设置超时时间。组装请求new QHttpMultiPart、创建文件QHttpPart、绑定QFile设备、设置ContentDisposition、按需添加字段QHttpPart。发起与监听使用单例QNetworkAccessManager调用post、监听uploadProgress更新界面、监听finished做成功失败分流、超时timer绑定abort。清理资源finished内reply-deleteLater()、multiPart-deleteLater()、QFile由multiPart父子关系自动回收。这套组合我在多个平台项目里跑得很稳。Qt 5.15和Qt 6.6的API在这块几乎没有差异代码可以直接跨版本迁移。最后分享一个小技巧排查一切上传问题时先怀疑数据、再怀疑代码、再怀疑网络。也就是先用抓包工具看发出的请求体长什么样比读十遍源码更有效。很多“诡异”问题抓包后一眼就能看出是Content-Disposition拼错或者Content-Type多了尾分号。HTTP是明文协议请求体包装对不对打开看一遍全明白了。

相关新闻

大数据采集架构设计与实践:从Redis调度到ES与HBASE双写

大数据采集架构设计与实践:从Redis调度到ES与HBASE双写

简介:《数据清洗与采集论文.docx》是一篇出自高校软件学院的大数据方向论文文档,围绕数据采集与清洗的核心知识点展开归纳,适合高校学生、数据分析初学者及希望快速了解采集架构的开发者参考。文档从数据采集的重要性讲起,点明其对…

2026/10/16 18:33:17 阅读更多 →
VL53L0X寄存器级驱动开发:从I²C初始化到温漂补偿的硬核实践

VL53L0X寄存器级驱动开发:从I²C初始化到温漂补偿的硬核实践

简介:本资源是面向嵌入式开发者与物联网项目实践者的VL53L0X激光测距传感器(GY-530模块)全栈开发资料包,聚焦ToF飞行时间测距技术的原理理解、硬件集成与多平台快速落地。资源涵盖原理详解、官方PDF规格书、硬件设计参考&#xff…

2026/10/16 18:33:17 阅读更多 →
Dynamics 365 CRM批量导入实战:Excel模板与字段映射核心指南

Dynamics 365 CRM批量导入实战:Excel模板与字段映射核心指南

1. 项目概述:为什么批量操作是Dynamics 365 CRM在线版的“生存刚需”在某高校信息中心承接的一个客户关系管理平台升级项目里,我第一次被业务方拉着开了个紧急站会——他们刚用Excel手工导入了2786条潜在客户数据,耗时4小时17分钟&#xff0c…

2026/10/16 18:47:25 阅读更多 →

最新新闻

自驾算法模型性能优化方法论:从数据闭环到训练策略

自驾算法模型性能优化方法论:从数据闭环到训练策略

做自驾算法这么多年,回头看这个标题,问的其实就是两个事:平时到底在折腾什么,以及模型性能上不去的时候都在干什么。很多人以为自驾算法工程师天天在写高大上的模型结构,实际上大部分时间都在跟数据、评测、bad case 打…

2026/10/17 3:10:45 阅读更多 →
ARM64架构下JDK 11.0.20部署与调优实战指南

ARM64架构下JDK 11.0.20部署与调优实战指南

简介:本资源为ARM64(aarch64)架构Linux系统专用的Java开发工具包JDK 11.0.20正式发行版,面向嵌入式开发者、边缘计算工程师及在树莓派、鲲鹏服务器等ARM平台部署Java应用的技术人员,解决主流x86 JDK无法在ARM Linux环境…

2026/10/17 3:10:45 阅读更多 →
Qt多线程从QThread到QtConcurrent:避开界面卡顿与崩溃的实用指南

Qt多线程从QThread到QtConcurrent:避开界面卡顿与崩溃的实用指南

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

2026/10/17 3:10:45 阅读更多 →
强化学习下的效率保障:FCA-RL出行调度框架解析

强化学习下的效率保障:FCA-RL出行调度框架解析

看到ECML-PKDD 25这个标题的时候,我第一反应是:出行行业的强化学习研究,终于开始把重心放在“效率保障”而不是单纯刷订单转化率了。以前聊出行调度,大家张嘴就是派单算法、路径规划、供需预测,但这些其实都是零散的单…

2026/10/17 3:10:45 阅读更多 →
Cortex-M与Cortex-A运行模式及寄存器对比:从异常机制到实战应用

Cortex-M与Cortex-A运行模式及寄存器对比:从异常机制到实战应用

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

2026/10/17 3:10:45 阅读更多 →
CK+数据集实战:从人脸表情序列到分类模型全流程解析

CK+数据集实战:从人脸表情序列到分类模型全流程解析

做表情识别的人,估计很少有人绕得开 CK 和 CK 这两个缩写。最早听到 CK,是在一次表情分类任务的需求评审里:那个人让我从网上找一个可复现的标准数据集,结果发现很多论文都拿它做基准。真正把数据下载下来之后,我才意识…

2026/10/17 3:09:45 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →