在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成ZIP文件,然后上传。压缩功能的做法见另一篇博文
Qt将文件夹压缩成ZIP文件
.
由于经验所限,不太懂网络编程。根据例子,使用 QNetworkAccessManager 和 QNetworkRequest 上传文件内容,总是错误。最后在一些好友的帮助下,终于解决了问题,记下来备忘。也希望给遇到类似问题的同学一个帮助。由于没有弄懂真正的原理和机制,仅贴出代码,给有需要的同学参考。
接口文档说明:
上传实现函数:
把代码也粘上:
void UploadFile_API::sendRequest(const QString &userName, const QString &teacherSession, const QString &zipfile)
status = -1;
msg = QStringLiteral("连接超时,请检查您的网络设置。");
UnixTimeAPI unixTimeAPI;
if (!unixTimeAPI.isOK())
qWarning()<<Q_FUNC_INFO<<"Obtain UnixTime failed.";
return;
uint unixTime_s = unixTimeAPI.getUnixTime_s();
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart signaturePart;
signaturePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("signature")));
signaturePart.setBody(NetworkServerUtil::getSignature(unixTime_s).toLatin1());
QHttpPart utPart;
utPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("unix_time")));
utPart.setBody(QString::number(unixTime_s).toLatin1());
QHttpPart tiPart;
tiPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("teacher_id")));
tiPart.setBody(userName.toLatin1());
QHttpPart tsPart;
tsPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("teacher_session")));
tsPart.setBody(teacherSession.toLatin1());
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"; filename=\"%2\"").arg("zipfile").arg(QFileInfo(zipfile).fileName())));
QFile *file = new QFile(zipfile);
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart);
multiPart->append(signaturePart);
multiPart->append(utPart);
multiPart->append(tiPart);
multiPart->append(tsPart);
multiPart->append(imagePart);
QNetworkRequest networkRequest;
networkRequest.setUrl(QUrl(QString("http://%1/tsp/uploadfile").arg(NetworkServerUtil::getStableIP())));
QNetworkReply *networkReply = m_networkManager->post(networkRequest, multiPart);
multiPart->setParent(networkReply);
在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成ZIP文件,然后上传。压缩功能的做法见另一篇博文Qt将文件夹压缩成ZIP文件. 由于经验所限,不太懂网络编程。根据例子,使用 QNetworkAccessManager 和 QNetworkRequest 上传文件内容,总是错误。最后在一些好友的帮助下,终于解决了问题,记下来备忘。也希望给遇到类似问题的同学一个帮助。
原来使用json传过参数,还用过application/x-www-form-urlencoded类型进行post请求,但仅仅是使用而已,没有对http通信进行过较深的学习。这不,一个项目用到了http通信,且对方要求上传xml文件,而不是字符串,并且带有token做验证。其中,项目对于post请求的要求是:
先使用postman做http通信测试,在经过N次测试后,终于能正确返回xml数据了,开森~
最后,上qt代码实现:
QDomDocument uploadXmlFile(QString xmlPa
前言在项目过程中要做一个图片分享功能,将图片上传到服务器 然后服务器返回图片的存储位置,本地将路径生成二维码进行分享,这里要讲的是图片上传部分,我采用的是post方式上传,要用到Qt的QNetworkAccessManager类,其实实现很简单,可以拓展为上传键值对或者其他到服务器,原理都一样的。正文废话不多说,直接上代码#include <QObject>
#include <QNetworkAc
QUrl url;
url.setUrl(makeFullUrl(m_opt.submitdebateresult.url));
#if QT_VERSION >= 0x050000
QUrlQuery q;
addSessionIdQueryItem(&q);
q.addQueryItem(m_opt.submitdebateresult.query.m
Qt网络相关的三个主要类QNetworkAccessManager,QNetworkRequest,QNetworkReply。 一般的使用方法就是:QNetworkRequest添加头和地址等信息,QNetworkAccessManager发起请求,QNetworkReply对服务器回应的响应。
//1、一般的Post上传数据流程
class postTask;//可以进一步封装,抽离网络任务和返回结果为两部分,如post、get等继承自网络任务
postTask(const QString&
QNetworkAccessManager的post接口可以接收多种参数,一般使用QByteArray发送普通文本请求,如果要带文件内容做参数,就需要用到QHttpMultiPart类型的参数,封装formData
这里定义的是一个static成员函数
static void postWithFile(const QString url, QMap<QString, QString...
最近项目需要用QT上传文件给HTTP服务器。之前服务器接收的数据格式都是json,这次是form-data。
经查找资料,需要用到QHttpMultiPart和QHttpPart这两个类,看QT的实例教程可知
例程中给出了文本和图片的传输方式,本次主要记录下exce文件的代码
QString xlname = "text.xlsx";
QHttpMultiPart *mul...
要在Qt中进行HTTPS文件上传,您需要使用Qt网络模块中的QNetworkAccessManager类和QNetworkRequest类。
以下是一个简单的示例代码,用于使用QHttpMultiPart类进行HTTPS文件上传:
```cpp
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
// 添加文件
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"image\"; filename=\"test.png\""));
QFile *file = new QFile("/path/to/test.png");
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // 自动管理文件对象的生命周期
multiPart->append(imagePart);
// 添加其他表单字段
QHttpPart namePart;
namePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"name\""));
namePart.setBody("test");
multiPart->append(namePart);
QNetworkRequest request(QUrl("https://example.com/upload"));
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request, multiPart);
multiPart->setParent(reply); // 自动管理多部分对象的生命周期
connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "上传成功";
} else {
qDebug() << "上传失败:" << reply->errorString();
在这个示例中,我们首先创建一个QHttpMultiPart对象来表示整个HTTP请求。我们将文件添加为一个QHttpPart对象,并将其添加到QHttpMultiPart对象中。然后,我们添加了另一个QHttpPart对象,用于表示其他表单字段。最后,我们创建了一个QNetworkAccessManager对象并使用它来发送POST请求。
使用connect()函数连接QNetworkReply对象的finished信号,以在请求完成时获得结果。如果没有错误,我们会打印出“上传成功”,否则我们会打印出错误信息。
请注意,这只是一个简单的示例,您需要根据自己的实际情况进行修改。例如,您需要设置请求头、设置SSL配置等。