Как с помощью QNetworkReply я могу опубликовать файл, а затем получить преобразованный файл обратно с сервера?

Я могу отправить файл в Qt, используя QNetworkReply, QNetworkAccessManager, QNetworkRequest и т.д. на сервер. Этот сервер конвертирует файл и возвращает его обратно. Как мне получить этот возвращенный файл? Нужно ли мне каким-то образом найти URL-адрес файла, возвращающегося из заголовков, а затем QNetworkAccessManager сделать для него запрос на получение? Или можно как-то получить из существующихQNetworkReply сигналов и записать в файл?


person Dave    schedule 04.08.2014    source источник


Ответы (1)


Если сервер возвращает файл в ответ на запрос, вы можете прочитать файл непосредственно из возвращенного ответа:

QNetworkAccessManager nam;

QUrl url(QString("http://www.example.com"));
url.addQueryItem("parameter", "value");

QNetworkRequest request(url);

QNetworkReply *reply = nam.get(request);

QEventLoop eventloop;
connect(reply,SIGNAL(finished()),&eventloop,SLOT(quit()));
eventloop.exec();

if (reply->error() == QNetworkReply::NoError)
{
    QByteArray bts = reply->readAll();

    QFile file("path/to/file");
    file.open(QIODevice::WriteOnly);
    file.write(bts);
    file.close();
}

Вы также можете сделать это асинхронным способом, подключив сигнал finished QNetworkAccessManager к слоту и записав туда файл:

connect(&nam,SIGNAL(finished(QNetworkReply*)),this,SLOT(onFinished(QNetworkReply*)));

void onFinished(QNetworkReply* reply)
{

   if (reply->error() == QNetworkReply::NoError)
   {
       QByteArray bts = reply->readAll();

       QFile file("path/to/file");
       file.open(QIODevice::WriteOnly);
       file.write(bts);
       file.close();
   }
}
person Nejat    schedule 04.08.2014
comment
Спасибо, QByteArray-to-file действительно был в слоте завершенного сигнала QNetworkReply. - person Dave; 05.08.2014