在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成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); // we cannot delete the file now, so delete it with the 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); // delete the multiPart with the reply
                    在项目中需要将本地的一个文件夹上传到服务器,于是想到先将起压缩成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配置等。