2016-07-04 2 views
0

Я пытаюсь отчаянно загружать файл на сервер в Multipart. У меня почти такой же код, как в документах Qt, но файл не загружается на сервер.Загрузка файла в данные формы Multipart в Qt5

Вот что у меня в Debug:

---------Uploaded-------------- 3672 of 3672 

---------Uploaded-------------- 3672 of 3672 

---------Uploaded-------------- 3672 of 3672 

---------Uploaded-------------- 0 of 0 

----------Finished-------------- 

"Error transferring http://MyUrlHere.com/uploadFile - server replied: Bad Request" 400 QNetworkReplyHttpImpl(0x17589ff0) 

Проблема не приходит с сервера, потому что, когда я пытаюсь загрузить файл на него в многоголосных с расширением Chrome или Firefox это на самом деле работает !

Вот мой код:

 QUrl testUrl("http://MyUrlHere.com/uploadFile "); 
    QNetworkRequest request(testUrl); 
    QNetworkProxy proxy; 

    proxy.setType(QNetworkProxy::HttpProxy); 
    proxy.setHostName("proxy"); 
    proxy.setPort(8080); 
    QNetworkProxy::setApplicationProxy(proxy); 

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

    QString preview_path = "C:/Users/Desktop/image.jpg"; 
    QHttpPart previewPathPart; 
    previewPathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_path\"")); 
    previewPathPart.setBody(preview_path.toLatin1()); 

    QString preview_name = "image.jpg"; 

    QHttpPart previewFilePart; 
    previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg")); 
    previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ preview_name + "\"")); 
    QFile *file = new QFile(preview_path); 

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

    multiPart->append(previewPathPart); 
    multiPart->append(previewFilePart); 

    QNetworkAccessManager *networkManager= new QNetworkAccessManager; 
    reply = networkManager->post(request, multiPart); 
    multiPart->setParent(reply); // delete the multiPart with the reply 

    connect(reply, SIGNAL(finished()), 
       this, SLOT (uploadDone())); 

    connect(reply, SIGNAL(uploadProgress(qint64, qint64)), 
       this, SLOT (uploadProgress(qint64, qint64))); 

} 


void ApkDialog::uploadProgress(qint64 bytesSent, qint64 bytesTotal) { 
    qDebug() << "---------Uploaded--------------" << bytesSent<< "of" <<bytesTotal; 
} 

void ApkDialog::uploadDone() { 
    qDebug() << "----------Finished--------------" << reply->errorString() <<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 
    qDebug()<<reply; 

    // reply->deleteLater(); 

} 
+0

Прежде всего, перестать писать в индийском стиле, проверить все, что вы делаете. Например, не нормально открывать файлы, не проверяя успех. Тогда, о вашем вопросе, в коде все правильно. Если вам нужна помощь, вы должны предоставить документацию по API. – UndeadDragon

+0

Спасибо @UndeadDragon за ответ. Это сообщение об ошибке, которое я получаю от serveur: запрос с несколькими частями содержит данные параметров (исключая загруженные файлы), которые превышают лимит для maxPostSize, установленный на соответствующем соединителе. Я фактически установил размер до 10 Мб (что очень велико). И мой API простой, запрашивая только имя и файл. Я тестировал с расширением PostMan Chrome, и он отлично работает! – Chakib

+1

Это определенно не ошибка Qt, а что-то плохое с вашим запросом. Трудно ответить без документации API. – UndeadDragon

ответ

3

Я нашел ошибку. Это была ошибка запроса. в документах Qt мало чего недостает.

Вот мой код, который работает:

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); 
    QHttpPart imagePart; 
    //imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain")); 
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"version.txt\""));/* version.tkt is the name on my Disk of the file that I want to upload */ 

    QHttpPart textPart; 
    textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"name\"")); 
    textPart.setBody("toto");/* toto is the name I give to my file in the server */ 

    QString apkLocation = apktextEdit->text(); 
    QFile *file = new QFile(apkLocation); 
    file->open(QIODevice::ReadOnly); 
    imagePart.setBodyDevice(file); 
    file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart 

    multiPart->append(textPart); 
    multiPart->append(imagePart); 

    QUrl url("http://MyUrl.com"); 
    QNetworkRequest request(url); 

    QNetworkAccessManager *networkManager= new QNetworkAccessManager; 
    reply = networkManager->post(request, multiPart); 
    multiPart->setParent(reply); // delete the multiPart with the reply 

    connect(reply, SIGNAL(finished()), 
       this, SLOT (uploadDone())); 

    connect(reply, SIGNAL(uploadProgress(qint64, qint64)), 
       this, SLOT (uploadProgress(qint64, qint64))); 
}