使用 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 中使用 QNetworkReply
、QNetworkAccessManager
、QNetworkRequest
等将文件发布到服务器。该服务器转换文件并将其吐回。我怎样才能得到那个吐回的文件?我是否需要以某种方式找到从标头返回的文件的 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();
您也可以通过将QNetworkAccessManager
的finished
信号连接到插槽并将文件写入其中来以异步方式执行此操作:
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