QT实现上传服务器功能

代码如下所示:


void UploadZipFileToServer(const QString& strPath)
{
    m_pFile = new QFile(strPath);
    // 创建HTTP多部份请求
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QHttpPart keyPart;
    keyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("id")));
    keyPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    keyPart.setBody(m_strModelID.toUtf8());
    multiPart->append(keyPart);

    QString strMdlName = QFileInfo(strPath).fileName();
    QHttpPart modelNamePart;
    modelNamePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("name")));
    modelNamePart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    modelNamePart.setBody(strMdlName.toUtf8());
    multiPart->append(modelNamePart);

    QHttpPart filePart;
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"; filename=\"%2\"").arg("file").arg(m_pFile->fileName())));
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    m_pFile->open(QIODevice::ReadOnly);
    filePart.setBodyDevice(m_pFile);
    m_pFile->setParent(multiPart);
    multiPart->append(filePart);

    QHttpPart tokenPart;
    tokenPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("level")));
    tokenPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    tokenPart.setBody(m_strClassification.toUtf8());
    multiPart->append(tokenPart);

    QHttpPart authorizationPart;
    authorizationPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("model")));
    authorizationPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    authorizationPart.setBody(m_strType.toUtf8());
    multiPart->append(authorizationPart);

    QHttpPart metafiled;
    metafiled.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg("zone")));
    metafiled.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
    metafiled.setBody(m_strCooperationZone.toUtf8());
    multiPart->append(metafiled);

    //QUrl url("http://192.168.2.59:9090/fileservice/fileupload.do");
    QUrl url(m_strIp);
    // 请求URL
    QNetworkRequest request(url);
    QNetworkAccessManager *manager = new QNetworkAccessManager();
    m_pReply = manager->post(request, multiPart);
    multiPart->setParent(m_pReply);
    connect(m_pReply, SIGNAL(finished()), this, SLOT(httpUploadFinished()));
    connect(m_pReply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64)));
    QEventLoop eventLoop;
    connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
    eventLoop.exec();
}

void httpUploadFinished()
{
    // 测试代码
    //QString jsonString = u8R"({  
    //"code":"1001",
    //"Data": "打完为Joi",  
    //"Message": "测试测试",  
    //"Title": "返回报错信息"
    //})";
    //QByteArray byteResonse = jsonString.toUtf8();

    // 服务器采用UTF-8编码返回数据
    QByteArray byteResonse = m_pReply->readAll();
    // 将服务器返回的数据写入Log文件便于观察
    QString responseString = QString::fromUtf8(byteResonse);
    {
        QFile file("ServerResLog.txt");
        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
            return;
        }
        QTextStream out(&file);
        out.setCodec("UTF-8");
        out << responseString;
        file.close();
    }
    // 处理服务器返回的数据
    QJsonParseError error;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(byteResonse, &error);
    if (!jsonDoc.isNull()) 
    {
        QJsonObject jsonObj = jsonDoc.object();
        QString strCode = jsonObj["code"].toString(); // 获取 code 字段的值
        if ("1000" == strCode)
        {
            QMessageBox::information(nullptr, QStringLiteral("上传成功"), QStringLiteral("上传成功!"));
            return;
        }
        else if ("1001" == strCode)
        {
            QString dataValue = jsonObj["Data"].toString(); // 获取 Data 字段的值
            QString message = jsonObj["Message"].toString().toUtf8(); // 获取 Message 字段的值
            QString title = jsonObj["Title"].toString().toUtf8(); // 获取 Title 字段的值
            QMap<QString, QString> mapTemp;
            mapTemp.insert("code", strCode);
            mapTemp.insert("Data", dataValue);
            mapTemp.insert("Message", message);
            mapTemp.insert("Title", title);
            ReplyMessageShow dlg(mapTemp);
            if (dlg.exec() == QDialog::Accepted) {}
        }
        else
        {
            QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("解析返回json数据失败!"));
            return;
        }
    }
    else
    {
        QMessageBox::information(nullptr, QStringLiteral("提示"), QStringLiteral("未连接到正确服务器或服务器返回json数据为空!"));
        return;
    }

    // 测试JSON解析代码
    //QString jsonString = u8R"({  
    //"code":1001,
    //"Data": null,  
    //"Message": "Error!",  
    //"Title": "返回报错信息"
    //})";
    //QByteArray byteResonse = jsonString.toUtf8();
    //QString strTemp = QString::fromUtf8(byteResonse);
    //QJsonParseError error;
    //QJsonDocument jsonDoc = QJsonDocument::fromJson(utf8Data, &error);
     获取 JSON 对象
    //QJsonObject jsonObj = jsonDoc.object();
     从 JSON 对象中提取数据
    //int code = jsonObj["code"].toInt();
    //QString data = jsonObj["Data"].toString();
    //QString message = jsonObj["Message"].toString().toUtf8();
    //QString title = jsonObj["Title"].toString().toUtf8();
    //QMap<QString, QString> mapTemp;
    //mapTemp.insert("code", QString::number(code));
    //mapTemp.insert("Data", data);
    //mapTemp.insert("Message", message);
    //mapTemp.insert("Title", title);
    //ReplyMessageShow dlg(mapTemp);
    //if (dlg.exec() == QDialog::Accepted) {}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 是一个强大的跨平台应用程序开发框架,它提供了丰富的图形用户界面工具和网络通信功能,包括与 TFTP(Trivial File Transfer Protocol)服务器的交互。要在 Qt 应用中实现向 TFTP 服务器上传文件,你需要遵循以下步骤: 1. 引入所需库:首先,确保你的项目包含了 Qt 的网络模块(QtNetwork),因为 TFTP 通信是在这个模块中处理的。 ```cpp #include <QObject> #include <QHostAddress> #include <QUdpSocket> #include <QNetworkAccessManager> #include <QNetworkRequest> ``` 2. 创建 UDP 会话:使用 `QUdpSocket` 类创建一个 UDP 套接字来发送数据到 TFTP 服务器。 ```cpp QUdpSocket *udpSocket = new QUdpSocket(this); if (!udpSocket->bind(0)) { // 处理绑定失败 } ``` 3. 发起 TFTP 请求:使用 `QNetworkAccessManager` 实现 TFTP 的 GET 或 PUT 请求。对于上传文件,通常会使用 PUT 方法。 ```cpp QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkRequest request(QUrl(QStringLiteral("tftp://<server_ip>/<file_path>"))); request.setRawHeader("Method", "PUT"); // 设置请求方法为 PUT connect(manager, &QNetworkAccessManager::finished, this, &YourClass::handleTftpResponse); manager->put(request, QByteArray()); ``` 4. 处理响应:在 `handleTftpResponse` 函数中检查上传状态并处理返回的数据。 ```cpp void YourClass::handleTftpResponse(QNetworkReply *reply) { if (reply->error()) { // 处理错误 } else { QByteArray data = reply->readAll(); // 检查数据确认上传完成或处理错误 } reply->deleteLater(); } ``` 5. 数据分块传输:由于 TFTP 是基于文本协议的,如果文件较大,可能需要分块传输。你可以使用循环或生成器函数来逐块读取并发送数据。 6. 关闭连接:上传完成后,记得关闭 UDP 套接字和网络访问管理器。 ```cpp udpSocket->close(); delete udpSocket; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值