2

私は現在QHttpMultiPartQt プロジェクトで使用していますが、私の側に問題があるようです。

例に従って、次のコードを思いつきました。

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

残念なことに、SIGNALS からトリガーされる SLOTS はありません。また、ローカル イーサネット アダプタで 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 でいくつかのスレッドを見つけました。メジャー 5.0.0 アップデートで修正されましたが、QHttpMultiPart クラスにバグがあったようです。

tl;dr:

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 リクエストの最終バージョンを確認する方法を教えていただければ幸いです。

どうもありがとうございました!どんな助けにも感謝します!

4

1 に答える 1