电话
400 9058 355
QNetworkAccessManager 不能直接上传XML文件,需先读取为QByteArray或用QFile流式提交;必须设置Content-Type为"application/xml",并检查QFile打开状态,否则上传静默失败。
它只负责发起 HTTP 请求,XML 文件本身得先读取为 QByteArray 或通过 QFile 流式提交。常见错误是试图把文件路径字符串直接塞进 post(),结果发出去的是路径文本而非文件内容。
QFile 打开 XML 文件,调用 readAll() 或使用 QFileDevice::map()(大文件慎用)获取原始字节
QDomDocument 生成),直接用 toString().toUtf8()
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/xml"),否则服务端可能拒收或解析失败核心是构造 QNetworkRequest + 把 XML 字节喂给 post()。以下示例假设 XML 已加载到 QByteArray xmlData:
QNetworkRequest request(QUrl("https://api.example.com/upload"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/xml");
request.setRawHeader("Accept", "application/json");
QNetworkReply* reply = manager->post(request, xmlData);
connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "Upload OK:" << reply->readAll();
} else {
qDebug() << "Upload failed:" << reply->errorString();
}
reply->deleteLater();
});
如果接口要求 Bearer Token、API Key 或额外表单字段(比如 filename、type),不能混在 XML 里——得走 multipart/form-data 或拼 query string / header。
request.setRawHeader("Authorization", "Bearer xxxxx")
QUrl("https://.../upload?project=abc&version=2")
QHttpMultiPart,此时 XML 是其中一部分,setContentType("application/xml") 要设在 QHttpPart 上,不是整个请求读取几百 MB 的 XML 到 QByteArray 容易触发 OOM;默认 30 秒超时也常不够。必须主动干预:
QFile 配合 QNetworkReply::uploadProgress() 做进度反馈,但注意:仅当传入的是打开的 QIODevice*(如 file 指针)才有效,QByteArray 不触发该信号request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true) 无效,真正起作用的是 manager->setTimeout(60000)(Qt 5.15+)或自己用 QTimer 主动 cancel
实际项目里最容易漏掉的是 Content-Type 头和 QFile::open() 的返回值检查——没打开成功却继续 readAll(),得到空字节数组,上传就静默失败。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...