c # — Как сделать http-запрос на публикацию, который загружает как почтовые запросы, так и amp; файл на сервер в C ++ Qt

У меня есть пример кода для этого в C #, Windows Phone 7, Silverlight, и я пытаюсь найти способ сделать аналог в C ++ Qt (я работаю в Blackberry 10 Beta 3 SDK). Могу ли я использовать QNetworkAccessManager? Или есть что-то лучшее для этого? Я был бы признателен за помощь в том, как это сделать, и за несколько примеров кода, если можете. Вот пример кода C #:

var request = new RestRequest(url, Method.POST);

request.AddParamater("example", "example");
request.AddParamater("example2", "example2");

request.AddFile("file", fileData, filename, "image/pjpeg");

RestSharp.RestClient restClient = new RestClient();
restClient.ExecuteAsync(request, (response) =>
{
if (response.StatusCode == HttpStatusCode.OK)
{
//upload successful
}
else
{
//error occured durring upload
}
});

Вот что я пробовал:

// postVars is a QByteArray that contains a query string of the arguments
// being passed in then I pass it in to my prepareFileUploadRequest file,
// which appends the data for   uploading a file.

void Utils::prepareFileUploadRequest(QMap<QString, QString> *d,
QNetworkRequest &request, QByteArray &postVars, QString path,
QString scriptName, QString filename,
QString stockNum)
{

request.setUrl(QUrl(Utils::ApiUrl));

postVars.append("Content-type: multipart/form-data, ");
postVars.append("boundary='---';\r\n\r\n");
postVars.append("---\r\n");
postVars.append("Content-Disposition: form-data; name='file' );
postVars.append("filename='examplePic.jpg'\r\n");
postVars.append("Content-Type: image/jpg\r\n");
postVars.append("Content-Transfer-Encoding: binary\r\n\r\n");

QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
return;
}

postVars.append(file.readAll() + "\r\n");
postVars.append('---');

request.
setRawHeader(QString("Content-Type").toAscii(),
QString("multipart/form-data; boundary='---'").toAscii());

request.
setRawHeader(QString("Content-Length").toAscii(),
QString::number(postVars.length()).toAscii());

QNetworkAccessManager *nam = new QNetworkAccessManager(this);
connect(nam, SIGNAL(finished(QNetworkReply *)),
this, SLOT(handleUpload(QNetworkReply *)));
nam->post(request, postVars);
}

Я вызываю эту функцию выше, а затем я получаю ответ в формате xml, в котором говорится, что у меня нет разрешения, и он не загружает никаких файлов, так что это, вероятно, проблема с используемым веб-сервисом php, но это усложняет задачу. для меня, чтобы сказать, если я выбрал правильный подход, или я делаю что-то не так.
}

0

Решение

QString body = "" ;

const QUrl url("http://someurl.to/make/the/post" );
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart textPartData;
body = "" ;
QTextStream(&body) << " this is your text to post with the file";
textPartData.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=utf-8");
textPartData.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"data\""));
textPartData.setBody(body.toAscii());

for(int i=0; i< number_of_files_to_send ; i++){
QHttpPart imagePart;
QString header_body = "";
QTextStream(&header_body) << "form-data; name=\"" << name_of_the_file << "\"; filename=\"" << name_of_the_file << ".jpg\"" ;
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(header_body));
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/jpeg"));

//prepare file for upload
QString filepath;
QTextStream(&filepath) << FunkyPigeonBlackberry::getInstance()->dataModelProductDetails()->custom_image(i).value("cut_image").toString();

// pack the new file
QFile *file = new QFile(filepath);
file->open(QIODevice::ReadOnly);
imagePart.setBodyDevice(file);
file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
multiPart->append(imagePart);
}

multiPart->append(textPartData);
multiPart->append(textPartProductDetails);
multiPart->append(textPartDataDelivery);QNetworkRequest request(url);

QNetworkReply* reply = m_networkAccessManager->post(request, multiPart);
connect(reply, SIGNAL(finished()), this, SLOT(onNetworkResponse()));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]