在Qt5中以多部分表单数据上传文件

在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

我正在拼命地将一个文件以多部分的形式上传到服务器上。我的代码与Qt文档中的代码几乎相同,但是文件没有上传到服务器

以下是我调试中的内容:

---------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方法文档,很难回答。