2013-09-21 114 views
1

我目前一个Qt项目中使用QHttpMultiPart,但它似乎对我的最终的一些问题?QHttpMultiPart发送“1” POST请求的结果

我都跟着榜样,用下面的代码上来:

#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; 
} 

可悲的是,没有一个时隙被从信号触发。我也无法在本地以太网适配器上看到使用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请求。

这将是很好,如果有人能告诉我为什么信号不发射,更重要的是如何,我可以看到在我的C++应用程序我POST请求的最终版本在发送前。

非常感谢!我感谢任何帮助!

回答

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 

我离开这个听到万一有人正在寻找工作的例子。