生活随笔
收集整理的這篇文章主要介紹了
Qt ftp 文件上传工具开发
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、需求:
1.簡單的配置ftp參數(shù)界面
2.tcp 客戶端端,接收服務(wù)器下發(fā)的參數(shù)信息
3.用戶上傳操作界面
在這里插入代碼片
二、源碼`#-------------------------------------------------
#
-------------------------------------------------
#
# Project created by QtCreator 2021-06-24T15:49:34
#
#
-------------------------------------------------QT
+= core gui network
greaterThan(QT_MAJOR_VERSION
, 4): QT
+= widgetsTARGET
= FtpFileShareTool
TEMPLATE
= appSOURCES
+= main
.cpp\FtpFileTool
.cpp \DialogFTPSetting
.cppHEADERS
+= FtpFileTool
.h \DialogFTPSetting
.hFORMS
+= FtpFileTool
.ui \DialogFTPSetting
.ui
#ifndef FTPFILETOOL_H
#define FTPFILETOOL_H#include <QWidget>
#include <QString>
#include <QUrl>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkAccessManager>
#include "DialogFTPSetting.h"namespace Ui
{
class FtpFileTool;
}class FtpFileTool : public QWidget
{Q_OBJECT
public:explicit FtpFileTool(QWidget
*parent
= 0);~FtpFileTool();void put(const QString
&fileName
, const QString
&path
);private slots
:void slot_put();void slot_applyNewConfig();void slot_uploadProgress(qint64 bytesSent
, qint64 bytesTotal
); void slot_error(QNetworkReply
::NetworkError code
);void slot_replyFinished(QNetworkReply
*);private:Ui
::FtpFileTool
*ui
;DialogFTPSetting m_dlgFtpSetting
;QUrl m_pUrl
; QFile m_file
;QNetworkAccessManager
*m_manager
;QNetworkReply
*m_pReply
;QFile
*m_pFile
;
};#endif
#include "FtpFileTool.h"
#include "ui_FtpFileTool.h"
#include <QMessageBox>FtpFileTool
::FtpFileTool(QWidget
*parent
) :QWidget(parent
),ui(new Ui
::FtpFileTool
)
{ui
->setupUi(this);connect(ui
->pushButtonFTPSetting
, &QPushButton
::clicked
, &m_dlgFtpSetting
, &DialogFTPSetting
::exec
);m_pUrl
.setScheme("ftp");m_manager
= new QNetworkAccessManager(this);connect(&m_dlgFtpSetting
, &DialogFTPSetting
::sig_ftpConfigChanged
, this, &FtpFileTool
::slot_applyNewConfig
);connect(ui
->pushButtonPut
, &QPushButton
::clicked
, this, &FtpFileTool
::slot_put
);connect(ui
->lineEditRemotePath
, &QLineEdit
::textChanged
, &m_dlgFtpSetting
, &DialogFTPSetting
::slot_setNewRemoteConfig
);connect(m_manager
,SIGNAL(finished(QNetworkReply
*)),this,SLOT(slot_replyFinished(QNetworkReply
*)));
}FtpFileTool
::~FtpFileTool()
{delete ui
;
}void FtpFileTool
::slot_put()
{m_pFile
= new QFile(ui
->lineEditLocalPath
->text());qDebug() <<"src file : "<< ui
->lineEditLocalPath
->text().toLatin1();if(false == m_pFile
->open(QIODevice
::ReadOnly
)){QMessageBox
messageBox(this);messageBox
.setWindowTitle("erro");messageBox
.setText("open file error");messageBox
.exec();}else{QByteArray data
= m_pFile
->readAll();m_pUrl
.setPath(ui
->lineEditRemotePath
->text());m_manager
->setNetworkAccessible(QNetworkAccessManager
::Accessible
);m_pReply
= m_manager
->put(QNetworkRequest(m_pUrl
), data
);qDebug() << "文件內(nèi)容:" << data
;connect(m_pReply
, &QNetworkReply
::uploadProgress
, this, &FtpFileTool
::slot_uploadProgress
);connect(m_pReply
, SIGNAL(error(QNetworkReply
::NetworkError
)), this, SLOT(slot_error(QNetworkReply
::NetworkError
)));if (m_pReply
->error() != QNetworkReply
::NoError
){qDebug() << "Error: " << m_pReply
->errorString();}m_pFile
->close();}
}void FtpFileTool
::slot_applyNewConfig()
{ m_pUrl
.setHost(m_dlgFtpSetting
.getRemoteIP());m_pUrl
.setPort(21);m_pUrl
.setUserName(m_dlgFtpSetting
.getUserName());m_pUrl
.setPassword(m_dlgFtpSetting
.getPassword());if (m_dlgFtpSetting
.getRemotePathSetting()!= "" ){m_pUrl
.setPath(m_dlgFtpSetting
.getRemotePathSetting().toLatin1());qDebug() <<"ftp 文件設(shè)置 " <<m_dlgFtpSetting
.getRemotePathSetting().toLatin1();ui
->lineEditRemotePath
->setText(m_dlgFtpSetting
.getRemotePathSetting());}qDebug() << m_pUrl
.host() << m_pUrl
.port() << m_pUrl
.userName() << m_pUrl
.password();if (!m_pUrl
.isValid()){QMessageBox
::critical(NULL, tr("Error"), "URL地址不合法!" );}else if (m_pUrl
.scheme() != "ftp"){QMessageBox
::critical(NULL, tr("Error"), "URL地址必須以ftp開頭!");}
}
void FtpFileTool
::slot_uploadProgress(qint64 bytesSent
, qint64 bytesTotal
)
{ui
->progressBarUpload
->setMaximum(bytesTotal
);ui
->progressBarUpload
->setValue(bytesSent
);
}void FtpFileTool
::slot_error(QNetworkReply
::NetworkError code
)
{QMessageBox
messageBox(this);messageBox
.setWindowTitle("erro");messageBox
.setText("upload error, "+QString
::number(code
).toLatin1());messageBox
.exec();
}
void FtpFileTool
::slot_replyFinished(QNetworkReply
*)
{if (m_pReply
->error() == QNetworkReply
::NoError
){m_pReply
->deleteLater();m_pFile
->flush();m_pFile
->close();}else{QMessageBox
::critical(NULL, tr("Error"), "錯(cuò)誤!!!");}
}
#ifndef DIALOGFTPSETTING_H
#define DIALOGFTPSETTING_H#include <QDialog>
#include <QTcpSocket>namespace Ui
{
class DialogFTPSetting;
}class DialogFTPSetting : public QDialog
{Q_OBJECT
public:explicit DialogFTPSetting(QWidget
*parent
= 0);~DialogFTPSetting();QString
getRemotePathSetting();QString
getRemoteIP();QString
getRemotePort();QString
getUserName();QString
getPassword();public slots
:void slot_setNewRemoteConfig(const QString strPath
);signals
:void sig_ftpConfigChanged(); private slots
:void slot_getRemoteConfig(); void slot_connectOrDisconnect(); void slot_updateAsDisconnected(); void slot_sureConfig();private:Ui
::DialogFTPSetting
*ui
;QTcpSocket m_clientSocket
;
};#endif ```cpp
#include "DialogFTPSetting.h"
#include "ui_DialogFTPSetting.h"
#include <QHostAddress>
DialogFTPSetting
::DialogFTPSetting(QWidget
*parent
) :QDialog(parent
),ui(new Ui
::DialogFTPSetting
)
{ui
->setupUi(this);connect(ui
->pushButtonConnect
, &QPushButton
::clicked
, this, &DialogFTPSetting
::slot_connectOrDisconnect
);connect(&m_clientSocket
, &QTcpSocket
::disconnected
, this, &DialogFTPSetting
::slot_updateAsDisconnected
);connect(ui
->buttonBox
, &QDialogButtonBox
::accepted
, this, &DialogFTPSetting
::slot_sureConfig
);
}DialogFTPSetting
::~DialogFTPSetting()
{delete ui
;
}QString DialogFTPSetting
::getRemotePathSetting()
{return ui
->lineEdit_RecvMsg
->text().toLatin1();
}QString DialogFTPSetting
::getRemoteIP()
{return ui
->lineEditIP
->text();
}QString DialogFTPSetting
::getRemotePort()
{return ui
->lineEditPort
->text();
}QString DialogFTPSetting
::getUserName()
{return ui
->lineEditUserName
->text();
}QString DialogFTPSetting
::getPassword()
{return ui
->lineEditPassword
->text();
}void DialogFTPSetting
::slot_getRemoteConfig()
{QByteArray recvByts
= m_clientSocket
.readAll();QString strRecv
= QString(recvByts
);ui
->lineEdit_RecvMsg
->setText(strRecv
.toLatin1());
}void DialogFTPSetting
::slot_setNewRemoteConfig(const QString strPath
)
{ui
->lineEdit_RecvMsg
->setText(strPath
);
}void DialogFTPSetting
::slot_connectOrDisconnect()
{if(ui
->pushButtonConnect
->text() == tr("斷開")){m_clientSocket
.disconnectFromHost();ui
->lineEditIP
->setEnabled(true);ui
->lineEditPassword
->setEnabled(true);ui
->lineEditPort
->setEnabled(true);ui
->lineEditUserName
->setEnabled(true);ui
->pushButtonConnect
->setText("連接");}else{quint16 port
= ui
->lineEditPort
->text().toUInt();QHostAddress
ip(ui
->lineEditIP
->text());m_clientSocket
.connectToHost(ip
, port
);connect(&m_clientSocket
, &QIODevice
::readyRead
, this, &DialogFTPSetting
::slot_getRemoteConfig
);if(m_clientSocket
.isOpen()){ui
->lineEditIP
->setEnabled(false);ui
->lineEditPassword
->setEnabled(false);ui
->lineEditPort
->setEnabled(false);ui
->lineEditUserName
->setEnabled(false);ui
->pushButtonConnect
->setText("斷開");}}
}void DialogFTPSetting
::slot_updateAsDisconnected()
{ui
->lineEditIP
->setEnabled(true);ui
->lineEditPassword
->setEnabled(true);ui
->lineEditPort
->setEnabled(true);ui
->lineEditUserName
->setEnabled(true);ui
->pushButtonConnect
->setText("連接");
}void DialogFTPSetting
::slot_sureConfig()
{emit
sig_ftpConfigChanged();
}
三、坑
1.遠(yuǎn)程路徑, 使用QUrl 的setPath() 函數(shù)來設(shè)定遠(yuǎn)程文件時(shí)候,文件路徑不包含ftp://ip// , 這個(gè)部分應(yīng)該是在 設(shè)置ftp ip 時(shí)候已經(jīng)默認(rèn)了,用戶在setpath 只要告訴 下圖 path 這部分,否則會(huì)有 網(wǎng)絡(luò)錯(cuò)誤碼201
總結(jié)
以上是生活随笔為你收集整理的Qt ftp 文件上传工具开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。