2015-06-08 16 views
0

我寫了一個方法發送圖像和一些表單數據到一個Django Rest框架服務器。以下方法工作正常,但我想知道是否有辦法將表單字段一起發送到一個QHttpPart,而不是爲每個字段創建一個?QHttpMultiPart與QHttpPart二進制和表單數據使用

有沒有更好的方法來做到這一點?也許用更少的代碼?

void MyNetwork::sendBinaryFile() { 

    QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyfinished(QNetworkReply*))); 
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); 

    QHttpPart aluno, palavra_chave, latitude, latitude_ref, longitude, longitude_ref; 

    aluno.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"aluno\"")); 
    aluno.setBody("some useful string"); 

    palavra_chave.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"palavra_chave\"")); 
    palavra_chave.setBody("some other useful string"); 

    latitude.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"latitude\"")); 
    latitude.setBody("0"); 

    longitude.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"longitude\"")); 
    longitude.setBody("0"); 

    latitude_ref.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"latitude_ref\"")); 
    latitude_ref.setBody("N"); 

    longitude_ref.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant("form-data; name=\"longitude_ref\"")); 
    longitude_ref.setBody("E"); 

    multiPart->append(aluno); 
    multiPart->append(palavra_chave); 
    multiPart->append(latitude); 
    multiPart->append(latitude_ref); 
    multiPart->append(longitude); 
    multiPart->append(longitude_ref); 

    QHttpPart imagePart; 
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png")); 
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; filename=\"image.png\"; name=\"file\"")); 
    QFile *file = new QFile("/path/image.png"); 
    file->open(QIODevice::ReadOnly); 
    imagePart.setBodyDevice(file); 
    file->setParent(multiPart); 
    multiPart->append(imagePart); 

    QString sendPath = "http://localhost/api/images/"; 
    QUrl url(sendPath); 
    QNetworkRequest request(url); 
    QString concatenated = "username:password"; 
    QByteArray data = "Basic "; 
    data.append(concatenated.toLocal8Bit().toBase64()); 
    request.setRawHeader("Authorization", data); 

    manager->post(request,multiPart); 
} 

void MyNetwork::replyfinished(QNetworkReply* reply) 
{ 
    qDebug() << "C++ - replyUpdateJsonFinished"; 
    qDebug() << QString(reply->readAll()); 
    qDebug() << QString(reply->errorString()); 
} 

回答

0

由於multipart/form-data的性質,每個發送的字段必須在不同的部分發送。這是因爲請求中的每個部分都表示不同的字段,並且由字段名稱標識幷包含應發送的正文(在您的情況下,大部分是文本)。

您可能有更好的運氣,爲需要字段名稱和內容的文本字段創建一個輔助方法。然後,該方法將能夠使用正確的標題(包含字段名稱)和正文(包含要發送的數據)創建新的部分,而不需要重複相同的行。

+0

謝謝你的回覆。是的,一種方法可以簡化代碼!如果我將單個JSON字符串作爲一個零件發送(更改零件內容類型),它可以工作嗎? (我會盡快嘗試) – Gabriel