日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt ftp 文件上传工具开发

發(fā)布時(shí)間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 networkgreaterThan(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_OBJECTpublic: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); // 更新上傳進(jìn)度void slot_error(QNetworkReply::NetworkError code);void slot_replyFinished(QNetworkReply*);private:Ui::FtpFileTool *ui;DialogFTPSetting m_dlgFtpSetting;QUrl m_pUrl; // 遠(yuǎn)程 ftp url 地址QFile m_file;QNetworkAccessManager *m_manager;QNetworkReply *m_pReply;QFile *m_pFile; };#endif // FTPFILETOOL_H #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();//檢測URL地址是否合法if (!m_pUrl.isValid()){QMessageBox::critical(NULL, tr("Error"), "URL地址不合法!" );}else if (m_pUrl.scheme() != "ftp"){QMessageBox::critical(NULL, tr("Error"), "URL地址必須以ftp開頭!");} }// 更新上傳進(jìn)度 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(); }// 刪除指針,更新和關(guān)閉文件 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ò)誤!!!");} } // 參數(shù)配置界面和參數(shù)接收 #ifndef DIALOGFTPSETTING_H #define DIALOGFTPSETTING_H#include <QDialog> #include <QTcpSocket>namespace Ui { class DialogFTPSetting; }class DialogFTPSetting : public QDialog {Q_OBJECTpublic: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(); // 參數(shù)配置改變的時(shí)候發(fā)出信號(hào)private slots:void slot_getRemoteConfig(); // 接受遠(yuǎn)程參數(shù)配置數(shù)據(jù)void slot_connectOrDisconnect(); // 確認(rèn)參數(shù),并建立鏈接, 接受遠(yuǎn)程參數(shù)設(shè)置void slot_updateAsDisconnected(); // 被動(dòng)斷開界面刷新void slot_sureConfig();private:Ui::DialogFTPSetting *ui;QTcpSocket m_clientSocket; };#endif // DIALOGFTPSETTING_H```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());// m_remoteConfig = 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);// 監(jiān)聽接受配置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ò),歡迎將生活随笔推薦給好友。