在Qt5中以多部分表单数据上传文件
我正在拼命地将一个文件以多部分的形式上传到服务器上。我的代码与Qt文档中的代码几乎相同,但是文件没有上传到服务器 以下是我调试中的内容:在Qt5中以多部分表单数据上传文件,qt,file-upload,multipartform-data,Qt,File Upload,Multipartform Data,我正在拼命地将一个文件以多部分的形式上传到服务器上。我的代码与Qt文档中的代码几乎相同,但是文件没有上传到服务器 以下是我调试中的内容: ---------Uploaded-------------- 3672 of 3672 ---------Uploaded-------------- 3672 of 3672 ---------Uploaded-------------- 3672 of 3672 ---------Uploaded-------------- 0 of 0
---------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();
}
QUrl测试URL(“http://MyUrlHere.com/uploadFile ");
QNetworkRequest请求(testUrl);
QNetworkProxy代理;
setType(QNetworkProxy::HttpProxy);
proxy.setHostName(“代理”);
代理设置端口(8080);
QNetworkProxy::setApplicationProxy(代理);
QHttpMultiPart*multiPart=新的QHttpMultiPart(QHttpMultiPart::FormDataType);
QString preview_path=“C:/Users/Desktop/image.jpg”;
QHttpPart预览路径部分;
previewPathPart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“预览\路径\”));
previewPathPart.setBody(preview_path.toLatin1());
QString preview_name=“image.jpg”;
QHttpPart预览文件部分;
setHeader(QNetworkRequest::ContentTypeHeader,QVariant(“图像/jpeg”);
previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\”预览文件\“;文件名=\”+预览名称+”));
QFile*文件=新QFile(预览路径);
文件->打开(QIODevice::ReadOnly);
previewFilePart.setBodyDevice(文件);
文件->设置父对象(多部分);//我们现在无法删除该文件,因此请使用多部分删除它
多部分->附加(预览路径部分);
多部分->附加(预览文件部分);
QNetworkAccessManager*networkManager=新的QNetworkAccessManager;
回复=networkManager->post(请求,多部分);
多部分->设置父项(回复);//删除带有回复的多部分
连接(应答,信号(完成()),
这个,SLOT(uploadDone());
连接(应答、信号(上传进度(qint64、qint64)),
这个,SLOT(上传进度(qint64,qint64));
}
void ApkDialog::uploadProgress(qint64 bytesSent,qint64 bytesTotal){
qDebug()我发现了错误。这是一个请求错误。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)));
}
这里不需要filename=\“version.txt\”
:
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name=\"file\"; filename=\"version.txt\""));
您可以在此处设置文件名:
QString apkLocation = apktextEdit->text();
它可以很好地工作,只需使用以下行:
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name=\"file\""));
无论如何,非常感谢,这真的很好!首先,停止用印度风格写作,检查你所做的一切。例如,不检查成功就打开文件是不正常的。那么,关于你的问题,在代码中一切都是正确的。如果你需要帮助,你必须提供API方法文档。感谢@UndeadDragon为你提供答案。这s是我从服务器收到的错误消息:多部分请求包含的参数数据(不包括上载的文件)超过了相关连接器上设置的maxPostSize限制。我实际上已将大小固定为10Mb(非常大)。我的API是一个简单的API,只要求一个名称和一个文件。我已经用Chrome的PostMan扩展名进行了测试,它工作得很好!这绝对不是Qt错误,而是您的请求有问题。如果没有API方法文档,很难回答。