【问题标题】:QHttpMultiPart send post request results in "1"QHttpMultiPart 发送 post 请求结果为“1”
【发布时间】:2013-09-21 03:19:38
【问题描述】:

我目前在 Qt 项目中使用QHttpMultiPart,但它似乎有一些问题?

我已经按照示例提出了以下代码:

#include "uploader.h"

#include <QFileInfo>
#include <QMimeDatabase>
#include <QHttpMultiPart>
#include <QNetworkReply>

#include <QDebug>
/**
 * @brief Uploader::Uploader
 * @param parent
 */
Uploader::Uploader(QObject *parent) :
    QObject(parent)
{
    uploadInProgress = false;
}

/**
 * @brief Uploader::upload
 * @param absoluteFilePath
 */
void Uploader::upload(QString absoluteFilePath)
{
    qDebug() << "Upload Starting";
    QFileInfo fileInfo(absoluteFilePath);

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    //action part
    QHttpPart textPart;
    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"cmd\""));
    textPart.setBody(QString("wFile").toLatin1());

    //File Path
    QHttpPart filePathPart;
    filePathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file_path\""));
    filePathPart.setBody(absoluteFilePath.toLatin1());

    //filepart
    QHttpPart filePart;
    QMimeDatabase db;
    QMimeType mime = db.mimeTypeForFile(absoluteFilePath);
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(mime.name()));
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ fileInfo.baseName() + "\""));

    QFile *file = new QFile(absoluteFilePath);
    if ( !file->exists() )
    {
        qDebug() << "File Does not exist";
    }

    file->open(QIODevice::ReadOnly);
    filePart.setBodyDevice(file);
    file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart

    multiPart->append(textPart);
    multiPart->append(filePathPart);
    multiPart->append(filePart);

    QUrl url("http://project.dbz.dev/index.php?controller=wapi&action=handle");
    QNetworkRequest request(url);


    pManager = new QNetworkAccessManager();

    pReply = pManager->post(request, multiPart);
    multiPart->setParent(pReply);

    connect(pReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
    connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
    connect(pReply, SIGNAL(finished()),this, SLOT(uploadFinished()));

    // here connect signals etc.
    uploadInProgress = true;
}

/**
 * @brief Uploader::uploadFinished
 */
void Uploader::uploadFinished()
{
    QString data = (QString) pReply->readAll();
    qDebug() << data;
    qDebug() << "Upload finished";

    uploadInProgress = false;
    if ( pReply->error() > 0 )
    {
        qDebug() << "Error occured: " << pReply->error() << " : " << pReply->errorString();
    }
    else
    {
        qDebug() << "Upload success";
    }
    delete pReply;
}

void Uploader::uploadProgress(qint64 a, qint64 b)
{
    qDebug() << " SOME PROGRESS!";
    qDebug() << a  << "/" << b;
}

void Uploader::onError(QNetworkReply::NetworkError err)
{
    qDebug() << " SOME ERROR!";
    qDebug() << err;
}

遗憾的是,没有一个 SLOTS 是由 SIGNALS 触发的。我也看不到在本地以太网适配器上使用wireshark 发送的包。 但是,我的 Apache 确实收到了请求:

192.168.178.21 - - [21/Sep/2013:05:10:41 +0200] "POST /index.php?controller=wapi&action=handle HTTP/1.1" 200 166 "-" "Mozilla/5.0"

在我的 PHP 应用程序中,我得到以下结果:

Application_Controller_WapiController::handleAction: Command: wFile
Application_Controller_WapiController::wFile: POST Request: 1

这基本上意味着,它识别参数“cmd”和值“wFile”,打开相应的 PHP 操作,然后执行 print_r($_POST),这向我显示的只是一个简单的 1。

我不知道该怎么做。我在互联网上到处寻找,似乎无法弄清楚。我遵循了官方纪录片中的所有示例和描述,并在 SO 上找到了几个线程。 QHttpMultiPart 类似乎有一个错误,尽管它已在 5.0.0 的主要更新中得到修复。

tl;博士:

connect(pReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
    connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
    connect(pReply, SIGNAL(finished()),this, SLOT(uploadFinished()));

这些信号没有被触发,PHP print_r 显示为 1,我无法在我的机器上跟踪 POST 请求。

如果有人能告诉我为什么没有发出 SIGNALS 以及更重要的是如何在发送之前在我的 C++ 应用程序中看到我的 POST 请求的最终版本,那就太好了。

非常感谢!感谢您的帮助!

【问题讨论】:

    标签: c++ qt post network-programming


    【解决方案1】:

    我已经通过添加解决了这个问题:

    pELoop = new QEventLoop();
    pELoop->exec();
    

    结果如下: #include "uploader.h"

    #include <QFileInfo>
    #include <QMimeDatabase>
    #include <QHttpMultiPart>
    #include <QNetworkReply>
    
    #include <QDebug>
    /**
     * @brief Uploader::Uploader
     * @param parent
     */
    Uploader::Uploader(QObject *parent) :
        QObject(parent)
    {
        uploadInProgress = false;
    }
    
    /**
     * @brief Uploader::upload
     * @param absoluteFilePath
     */
    void Uploader::upload(QString absoluteFilePath)
    {
        qDebug() << "Upload Starting";
        QFileInfo fileInfo(absoluteFilePath);
    
        QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    
        //action part
        QHttpPart textPart;
        textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"cmd\""));
        textPart.setBody(QString("wFile").toLatin1());
    
        //File Path
        QHttpPart filePathPart;
        filePathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file_path\""));
        filePathPart.setBody(absoluteFilePath.toLatin1());
    
        //filepart
        QHttpPart filePart;
        QMimeDatabase db;
        QMimeType mime = db.mimeTypeForFile(absoluteFilePath);
        filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(mime.name()));
        filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ fileInfo.baseName() + "\""));
    
        QFile *file = new QFile(absoluteFilePath);
        if ( !file->exists() )
        {
            qDebug() << "File Does not exist";
        }
    
        file->open(QIODevice::ReadOnly);
        filePart.setBodyDevice(file);
        file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
    
        multiPart->append(textPart);
        multiPart->append(filePathPart);
        multiPart->append(filePart);
    
        QUrl url("http://encryptor.dbz.dev/index.php?controller=wapi&action=handle");
        QNetworkRequest request(url);
    
    
        pManager = new QNetworkAccessManager();
    
        pReply = pManager->post(request, multiPart);
        multiPart->setParent(pReply);
    
        pELoop = new QEventLoop();
        connect(pReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
        connect(pReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
        connect(pReply, SIGNAL(finished()),this, SLOT(uploadFinished()));
    
        pELoop->exec();
        // here connect signals etc.
        uploadInProgress = true;
    }
    
    /**
     * @brief Uploader::uploadFinished
     */
    void Uploader::uploadFinished()
    {
        QString data = (QString) pReply->readAll();
        qDebug() << data;
        qDebug() << "Upload finished";
    
        uploadInProgress = false;
        if ( pReply->error() > 0 )
        {
            qDebug() << "Error occured: " << pReply->error() << " : " << pReply->errorString();
        }
        else
        {
            qDebug() << "Upload success";
        }
        pReply->deleteLater();
        pELoop->exit();
    }
    
    void Uploader::uploadProgress(qint64 a, qint64 b)
    {
        qDebug() << " SOME PROGRESS!";
        qDebug() << a  << "/" << b;
    }
    
    void Uploader::onError(QNetworkReply::NetworkError err)
    {
        qDebug() << " SOME ERROR!";
        qDebug() << err;
    }
    

    请求按预期执行,信号也正常工作。 我得到以下输出:

    Upload Starting 
     SOME PROGRESS! 
    16384 / 483753 
     SOME PROGRESS! 
    483753 / 483753 
     SOME PROGRESS! 
    0 / 0 
    "Array
    (
        [controller] => wapi
        [action] => handle
        [cmd] => wFile
        [file_path] => D:/Downloads/putty.exe
    )
    {"cmd":"","status":"","message":"","params":[]}" 
    Upload finished 
    Upload success
    

    如果有人正在寻找一个可行的例子,我会留下这个消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 2017-07-13
      • 2010-10-12
      • 2016-03-24
      • 2015-06-10
      相关资源
      最近更新 更多