У меня есть существующий C++/Qt
исходный код для обновления прошивки. HTTP-клиент используется для загрузки файла.
Этот кусок кода работает нормально, если я предоставлю http://<path to file>
Но клиент http не смог загрузить с ftp://<path to down load>
. Показывает загруженный файл нулевого размера с ftp.
Согласно StackOverflow, он должен работать для обоих. Я пытаюсь использовать setScheme("ftp")
и другие небольшие изменения. Но не работает.
void HttpClient::onDownloadProgress(qint64 bytesReceived,
qint64 bytesTotal)
{
emit downloadUpdateProgress(
static_cast<int>((bytesReceived * 1.0f / bytesTotal * 1.0f) * 100));
}
void HttpClient::onReadyRead()
{
auto reply = qobject_cast<QNetworkReply *>(QObject::sender());
if (reply) {
QNetworkRequest request(reply->request());
auto device = qobject_cast<QIODevice *>(request.originatingObject());
if (device) {
device->write(reply->readAll());
}
}
}
bool HttpClient::post(const QUrl &url, const QByteArray &data,
QIODevice *device)
{
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader,
"application/x-www-form-urlencoded");
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
request.setSslConfiguration(getSslConfig());
request.setOriginatingObject(device);
QNetworkReply *reply = _networkAccessManager->post(request, data);
connect(reply, &QNetworkReply::readyRead, this, &HttpClientImpl::onReadyRead);
bool result = waitForFinished(reply, 30 * 1000);
return result;
}
bool HttpClientImpl::get(const QUrl &url, QIODevice *device)
{
QNetworkRequest request(url);
request.setSslConfiguration(getSslConfig());
request.setOriginatingObject(device);
QNetworkReply *reply = _networkAccessManager->get(request);
connect(reply, &QNetworkReply::downloadProgress, this,
&HttpClientImpl::onDownloadProgress);
connect(reply, &QNetworkReply::readyRead, this, &HttpClientImpl::onReadyRead);
bool result = waitForFinished(reply);
return result;
}
Следует загрузить файл правильного размера.