I'm trying to get the download example application to work in my application to download a file from a web site. As you can see, I've made only slight modifications to get it to work without errors, but when it returns to my main class, there is no file.
#ifndef GETHTFILE_H
#define GETHTFILE_H
#include <QCoreApplication>
#include <QFile>
#include <QFileInfo>
#include <QList>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QStringList>
#include <QTimer>
#include <QUrl>
#include <stdio.h>
{
Q_OBJECT
QNetworkAccessManager manager;
QList<QNetworkReply *> currentDownloads;
public:
gethtfile();
void doDownload
(const QUrl &url
);
public slots:
void execute();
void downloadFinished(QNetworkReply *reply);
};
#endif // GETHTFILE_H
#ifndef GETHTFILE_H
#define GETHTFILE_H
#include <QCoreApplication>
#include <QFile>
#include <QFileInfo>
#include <QList>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QStringList>
#include <QTimer>
#include <QUrl>
#include <stdio.h>
class gethtfile: public QObject
{
Q_OBJECT
QNetworkAccessManager manager;
QList<QNetworkReply *> currentDownloads;
public:
gethtfile();
void doDownload(const QUrl &url);
QString saveFileName(const QUrl &url);
bool saveToDisk(const QString &filename, QIODevice *data);
public slots:
void execute();
void downloadFinished(QNetworkReply *reply);
};
#endif // GETHTFILE_H
To copy to clipboard, switch view to plain text mode
#include "gethtfile.h"
#include <stdio.h>
gethtfile::gethtfile()
{
connect(&manager, SIGNAL(finished(QNetworkReply*)),
SLOT(downloadFinished(QNetworkReply*)));
execute();
}
void gethtfile
::doDownload(const QUrl &url
) {
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
currentDownloads.append(reply);
}
{
if (basename.isEmpty())
basename = "download";
if (QFile::exists(basename
)) { // already exists, don't overwrite
int i = 0;
basename += '.';
++i;
}
return basename;
}
{
fprintf(stderr, "Could not open %s for writing: %s\n",
qPrintable(filename),
qPrintable(file.errorString()));
return false;
}
file.write(data->readAll());
file.close();
return true;
}
void gethtfile::execute()
{
url.setUrl("http://www.google.com/robots.txt");
doDownload(url);
}
void gethtfile::downloadFinished(QNetworkReply *reply)
{
if (reply->error()) {
fprintf(stderr, "Download of %s failed: %s\n",
url.toEncoded().constData(),
qPrintable(reply->errorString()));
} else {
QString filename
= saveFileName
(url
);
if (saveToDisk(filename, reply))
printf("Download of %s succeded (saved to %s)\n",
url.toEncoded().constData(), qPrintable(filename));
}
currentDownloads.removeAll(reply);
reply->deleteLater();
if (currentDownloads.isEmpty())
// all downloads finished
}
#include "gethtfile.h"
#include <stdio.h>
gethtfile::gethtfile()
{
connect(&manager, SIGNAL(finished(QNetworkReply*)),
SLOT(downloadFinished(QNetworkReply*)));
execute();
}
void gethtfile::doDownload(const QUrl &url)
{
QString tst = url.path();
QNetworkRequest request(url);
QNetworkReply *reply = manager.get(request);
currentDownloads.append(reply);
}
QString gethtfile::saveFileName(const QUrl &url)
{
QString path = url.path();
QString basename = QFileInfo(path).fileName();
if (basename.isEmpty())
basename = "download";
if (QFile::exists(basename)) {
// already exists, don't overwrite
int i = 0;
basename += '.';
while (QFile::exists(basename + QString::number(i)))
++i;
basename += QString::number(i);
}
return basename;
}
bool gethtfile::saveToDisk(const QString &filename, QIODevice *data)
{
QFile file(filename);
if (!file.open(QIODevice::WriteOnly)) {
fprintf(stderr, "Could not open %s for writing: %s\n",
qPrintable(filename),
qPrintable(file.errorString()));
return false;
}
file.write(data->readAll());
file.close();
return true;
}
void gethtfile::execute()
{
QUrl url;
url.setUrl("http://www.google.com/robots.txt");
doDownload(url);
}
void gethtfile::downloadFinished(QNetworkReply *reply)
{
QUrl url = reply->url();
if (reply->error()) {
fprintf(stderr, "Download of %s failed: %s\n",
url.toEncoded().constData(),
qPrintable(reply->errorString()));
} else {
QString filename = saveFileName(url);
if (saveToDisk(filename, reply))
printf("Download of %s succeded (saved to %s)\n",
url.toEncoded().constData(), qPrintable(filename));
}
currentDownloads.removeAll(reply);
reply->deleteLater();
if (currentDownloads.isEmpty())
// all downloads finished
QCoreApplication::instance()->quit();
}
To copy to clipboard, switch view to plain text mode
I've been tearing my hair out for three days trying to use QT to get the file. Why is it so hard to use QHTTP and/or QNetworkAccessManager? All I need is a simple way to get a small text file from a web site. I can easily do it with libcurl, but I don't want to add an external library when QT can (or should) be able to do it.
Bookmarks