Qt Http Post и File

Понадобилось загрузить файл из Qt, и хорошо бы чтобы он опознавался со стороны сервера как файл ($_FILES в php или Request.FILES в django)
По Qtшному экземплу не взлетел: все передается, но файл файлом не опознался, так и остался торчать в заголовках POST.
Проблема оказывается действительно есть, решения страшные, вроде ручной сборки заголовков

А чем отличаются? Ну да, в заголовке Content-Disposition надо указать имя файла,
пробуем

QHttpMultiPart * data = new QHttpMultiPart();
 
QHttpPart part;
part.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
part.setHeader(QNetworkRequest::ContentDispositionHeader,  QVariant("form-data; name=\"text\""));
part.setBody("Hello there!");
 
data->append(part);
QHttpPart imagePart;
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("multipart/form-data; name=\"image\"; filename=\"1.jpg\""));
imagePart.setRawHeader("Content-Transfer-Encoding","binary");
 
QFile *file = new QFile("1.jpg");
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
data->append(imagePart);
 
 
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)),
    this, SLOT(replyFinished(QNetworkReply*)));
 
manager->post(QNetworkRequest(QUrl("http://localhost:8000/upload/")),data);

Заработало =)
Собсно от кутишного экземпла отличается только наличием filename= параметра в заголовке:

imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("multipart/form-data; name=\"image\"; filename=\"1.jpg\""));

Ну и Content-Transfer-Encoding добавлен, чтобы совсем правильно было

Добавить комментарий