Я пытаюсь отчаянно загружать файл на сервер в 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();
}
Прежде всего, перестать писать в индийском стиле, проверить все, что вы делаете. Например, не нормально открывать файлы, не проверяя успех. Тогда, о вашем вопросе, в коде все правильно. Если вам нужна помощь, вы должны предоставить документацию по API. – UndeadDragon
Спасибо @UndeadDragon за ответ. Это сообщение об ошибке, которое я получаю от serveur: запрос с несколькими частями содержит данные параметров (исключая загруженные файлы), которые превышают лимит для maxPostSize, установленный на соответствующем соединителе. Я фактически установил размер до 10 Мб (что очень велико). И мой API простой, запрашивая только имя и файл. Я тестировал с расширением PostMan Chrome, и он отлично работает! – Chakib
Это определенно не ошибка Qt, а что-то плохое с вашим запросом. Трудно ответить без документации API. – UndeadDragon