Qt 将QHttpMultiPart与QHttpPart二进制和表单数据一起使用

Qt 将QHttpMultiPart与QHttpPart二进制和表单数据一起使用,qt,django-rest-framework,Qt,Django Rest Framework,我编写了一个方法,将图像和一些表单数据发送到Django Rest框架服务器。下面的方法很好,但我想知道是否有一种方法可以将表单字段一起发送到一个QHttpPart,而不是为每个字段创建一个 有更好的方法吗?也许用更少的代码 void MyNetwork::sendBinaryFile() { QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, SIGNAL(finishe

我编写了一个方法,将图像和一些表单数据发送到Django Rest框架服务器。下面的方法很好,但我想知道是否有一种方法可以将表单字段一起发送到一个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());
}
void MyNetwork::sendBinaryFile(){
QNetworkAccessManager*manager=新的QNetworkAccessManager(此);
连接(管理器,信号(完成(QNetworkReply*)),此,插槽(replyfinished(QNetworkReply*));
QHttpMultiPart*multiPart=新的QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart aluno,palavra_chave,纬度,纬度,经度,经度;
setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“aluno\”));
aluno.setBody(“一些有用的字符串”);
setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“palavra\u chave\”));
palavra_chave.setBody(“其他有用的字符串”);
latitude.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“latitude\”));
纬度。立根体(“0”);
setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“经度”);
经度(0);
latitude\u ref.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“latitude\u ref\”));
纬度(参考立根体(“N”);
经度参考setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;名称=\“经度参考\”));
经度(参考立根体(“E”);
多部分->附加(aluno);
多部分->附加(palavra_chave);
多部分->附加(纬度);
多部分->附加(纬度\u参考);
多部分->附加(经度);
多部分->附加(经度\u参考);
QHttpPart-imagePart;
setHeader(QNetworkRequest::ContentTypeHeader,QVariant(“image/png”));
setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(“表单数据;文件名=\”image.png\“名称=\”file\));
QFile*file=newQfile(“/path/image.png”);
文件->打开(QIODevice::ReadOnly);
imagePart.setBodyDevice(文件);
文件->设置父对象(多部分);
多部分->附加(imagePart);
QString sendPath=”http://localhost/api/images/";
QUrl url(发送路径);
QNetworkRequest请求(url);
QString concatenated=“用户名:密码”;
QByteArray data=“基本”;
data.append(concatenated.toLocal8Bit().toBase64());
请求.setRawHeader(“授权”,数据);
经理->发布(请求,多部分);
}
void MyNetwork::replyfinished(QNetworkReply*reply)
{
qDebug()由于的性质,发送的每个字段必须在不同的部分中发送。这是因为请求中的每个部分代表不同的字段,由字段名称标识,并包含应发送的正文(在您的情况下,主要是文本)


您可能会更幸运地为文本字段创建一个采用字段名及其内容的帮助器方法。该方法将能够创建一个具有正确标题(包含字段名)和正文(包含要发送的数据)的新部件,无需重复相同的行。

感谢您的回复。是的,一个方法可以简化代码!如果我将单个JSON字符串作为一个部分发送(更改部分内容类型),它可以工作吗?(我很快就会尝试)