使用 QNetworkReply 如何发布文件,然后从服务器接收转换后的文件?

Posted

技术标签:

【中文标题】使用 QNetworkReply 如何发布文件,然后从服务器接收转换后的文件?【英文标题】:With QNetworkReply how can I post a file and then receive a converted file back from the server? 【发布时间】:2014-08-04 04:34:37 【问题描述】:

我可以在 Qt 中使用 QNetworkReplyQNetworkAccessManagerQNetworkRequest 等将文件发布到服务器。该服务器转换文件并将其吐回。我怎样才能得到那个吐回的文件?我是否需要以某种方式找到从标头返回的文件的 url,然后让QNetworkAccessManager 为它发出获取请求?或者我可以从现有的QNetworkReply 信号中获取它并将其写入文件吗?

【问题讨论】:

【参考方案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();

您也可以通过将QNetworkAccessManagerfinished 信号连接到插槽并将文件写入其中来以异步方式执行此操作:

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();
   

【讨论】:

谢谢,QByteArray-to-file 确实在 QNetworkReply 完成信号的槽中。

以上是关于使用 QNetworkReply 如何发布文件,然后从服务器接收转换后的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何增加 QNetworkReply::downloadProgress 信号频率?

QNetworkReply:在 QWebView 中禁用了网络访问

使用 QNetworkAccessManager 从 Web 检索数据:文件已下载但 QNetworkReply::readAll 返回 null

错误:QNetworkReply:没有这样的文件或目录

如何在 QNetWorkReply 类型的变量中读取从服务器发送的数据?

连接丢失时未检测到 QNetworkReply 错误信号