從Qt的版本進化中可以知道,在Qt4中的QFtp類到了Qt5中已經沒有了,雖然可以通過在Qt5中自己編譯出QFtp,但是Qt5中提供的QNetworkAccessManager在發送和請求網絡方面有更好的兼容性和擴展性,包括ftp請求和http請求。
這里提供一個Qt4中QFtp的源碼獲取方式:
git clone git://code.qt.io/qt/qtftp.git git clone http://code.qt.io/qt/qtftp.git git clone https://code.qt.io/qt/qtftp.git
下面的ftp上傳功實現了在有密碼和無密碼的情況下上傳:
#include <QtCore> #include <QtNetwork> #include <QDebug> class Uploader: public QObject { Q_OBJECT public: Uploader(QObject *p = 0): QObject(p){ } void start(const QString &file){ // no passwd // QUrl url("ftp://172.20.5.167/ftp.txt"); QUrl url; url.setScheme("ftp"); url.setHost("172.20.5.167"); // 這里是設置遠端主機上傳時的文件名,不設置則名稱為本地端上傳名稱 url.setPath("/ftp.txt"); url.setUserName("root"); url.setPort(21); // need passwd /* QUrl url("ftp://172.20.5.167/ftp.txt"); url.setScheme("ftp"); url.setUserName("root"); url.setPort(21); */ data = new QFile(file, this); if (data->open(QIODevice::ReadOnly)) { reply = nam.put(QNetworkRequest(url), data); connect(reply, SIGNAL(uploadProgress(qint64, qint64)), SLOT(uploadProgress(qint64, qint64))); connect(reply, SIGNAL(finished()), SLOT(uploadDone())); } else qDebug() << "Oops"; } public slots: void uploadProgress(qint64 bytesSent, qint64 bytesTotal) { qDebug() << "Uploaded" << bytesSent << "of" << bytesTotal; } void uploadDone() { qDebug() << "Finished" << reply->error(); data->deleteLater(); reply->deleteLater(); } private: QNetworkAccessManager nam; QFile *data; QNetworkReply *reply; }; int main(int argc, char **argv) { QCoreApplication app(argc, argv); // 去除ftp上傳時network.ssl警告 QLoggingCategory::setFilterRules("qt.network.ssl.warning=false"); Uploader u; u.start(QString("C:/Users/yicm/Qt/test.txt")); return app.exec(); } // 編譯時不要漏掉下面這句 #include "main.moc"
上面程序主要注意的地方是本地端上傳文件和主機端文件,理解QUrl(無密碼為ftp://root@172.20.5.167.com:21):

保證ftp地址的每一個部分都設置到位。
http://blog.csdn.net/freeape/article/details/52802163
