使用QHttpMultiPart和QHttpPart二进制和表格数据

时间:2015-06-08 18:31:11

标签: qt django-rest-framework

我写了一个方法将图像和一些表单数据发送到 Django Rest Framework Server 。以下方法工作正常,但我想知道是否有办法将表单字段一起发送到一个 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());
}

1 个答案:

答案 0 :(得分:0)

由于multipart/form-data的性质,发送的每个字段必须在不同的部分发送。这是因为请求中的每个部分都代表一个不同的字段,并由字段名称标识,并包含应发送的正文(在您的情况下,主要是文本)。

您可以更好地为文本字段创建一个辅助方法,该方法接受字段名称及其内容。然后,该方法将能够使用正确的标题(包含字段名称)和正文(包含要发送的数据)创建新部件,而无需重复相同的行。