Понадобилось загрузить файл из 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 добавлен, чтобы совсем правильно было