Qt FTP文件上传下载简单例子

一、简述

      记--Qt5 默认已经不支持QFtp了,需要自己编译。例子使用QNetworkAccessManager实现简单的ftp文件上传和下载。

      例子打包:外链:https://wwm.lanzouv.com/b0caushud 密码:1puy

二、效果

例子中在虚拟机Ubuntu16.04 搭建了ftp服务器,windwos主机跟Ubuntu虚拟机能ping通。

用户名密码可以使用Ubuntu的账号,也可以自己添加新用户。

三、工程结构

四、源文件 

mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QtNetwork/QNetworkAccessManager>
#include<QtNetwork/QNetworkRequest>
#include<QtNetwork/QNetworkReply>

#define FTP_PORT    21

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButtonDownload_clicked();
    void slot_NetworkAccessManagerUploadProcess(QNetworkReply*);
    void slot_NetworkAccessManagerDownloadProcess(QNetworkReply*);

    void on_pushButtonUploadFile_clicked();

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager mNetworkAccessManagerUpload;
    QNetworkAccessManager mNetworkAccessManagerDownload;
};

#endif // MAINWINDOW_H

main.cpp文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QFileDialog>
#include <QFile>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&mNetworkAccessManagerUpload, SIGNAL(finished(QNetworkReply*)), SLOT(slot_NetworkAccessManagerUploadProcess(QNetworkReply*)));
    connect(&mNetworkAccessManagerDownload, SIGNAL(finished(QNetworkReply*)), SLOT(slot_NetworkAccessManagerDownloadProcess(QNetworkReply*)));
    //mNetworkAccessManagerDownload.downloadProgress 进度
}

MainWindow::~MainWindow()
{
    delete ui;
}

//下载文件
void MainWindow::on_pushButtonDownload_clicked()
{
    QUrl url;
    url.setScheme("ftp");
    url.setHost(ui->lineEditHost->text());
    url.setPort(ui->lineEditPort->text().toInt());
    url.setUserName(ui->lineEditUserName->text());
    url.setPassword(ui->lineEditPwd->text());
    url.setPath(ui->lineEditDownloadUrl->text());
    mNetworkAccessManagerDownload.get((QNetworkRequest(url)));
}

//下载结果处理
void MainWindow::slot_NetworkAccessManagerDownloadProcess(QNetworkReply *reply)
{
    QNetworkReply::NetworkError error = reply->error();
    switch(error){
        case QNetworkReply::NoError:
            {
                QByteArray data = reply->readAll();//大文件可以使用QIODevice或reply->readData()
                QFileInfo fileInfo(ui->lineEditDownloadUrl->text());
                QFile file(fileInfo.fileName());
                if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
                    QMessageBox::critical(this,"错误", "保存失败!");
                } else {
                    //将内容写入文件
                    file.write(data);
                    file.close();
                    QMessageBox::information(this,"提示", "下载成功!已保存到" + file.fileName());
                }
            }
            break;
        case QNetworkReply::HostNotFoundError:
            QMessageBox::critical(this,"错误", "Host Not Found!");
            break;
        case QNetworkReply::AuthenticationRequiredError:
            QMessageBox::critical(this,"错误", "AuthenticationRequiredError!");
            break;
        default:
            QMessageBox::critical(this,"错误", "未知错误! error:" + error);
        break;
    }
}

//上传文件
void MainWindow::on_pushButtonUploadFile_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, "选择文件", ".", "文本文件(*.txt)");
    if (fileName.isEmpty()) {
        return;
    }

    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        QMessageBox::critical(this,"错误", "打开文件失败!");
        return;
    }

    QByteArray data = file.readAll();
    file.close();

    QUrl url;
    url.setScheme("ftp");
    url.setHost(ui->lineEditHost->text());
    url.setPort(ui->lineEditPort->text().toInt());
    url.setUserName(ui->lineEditUserName->text());
    url.setPassword(ui->lineEditPwd->text());
    QFileInfo fileInfo(fileName);
    url.setPath(ui->lineEditUploadUrl->text().append("/").append(fileInfo.fileName()));

    mNetworkAccessManagerUpload.put(QNetworkRequest(url), data);
}


//上传结果处理
void MainWindow::slot_NetworkAccessManagerUploadProcess(QNetworkReply *reply)
{
    QNetworkReply::NetworkError error = reply->error();
    switch(error){
        case QNetworkReply::NoError:
            QMessageBox::information(this,"提示", "上传成功!");
            break;
        case QNetworkReply::HostNotFoundError:
            QMessageBox::critical(this,"错误", "Host Not Found!");
            break;
        case QNetworkReply::AuthenticationRequiredError:
            QMessageBox::critical(this,"错误", "Authentication Required Error!");
            break;
        default:
            QMessageBox::critical(this,"错误", "未知错误!");
        break;
    }
}

五、附

例子中在虚拟机Ubuntu16.04 搭建了ftp服务器,windwos主机跟Ubuntu虚拟机能ping通。

5.1 确认能ping通:

5.2 确认ftp服务器已经启动

 5.3 Ubuntu16.04 安装ftp服务器

//在线安装,一般安装成功后ftp服务器就自动启动了,使用ps -ef | grep vsftpd确认
sudo apt-get install vsftpd

//编辑配置文件, 启用write_enable=YES 不然不能上传文件
sudo /etc/vsftpd.conf

修改配置后保存然后重启vsftpd,执行sudo /etc/init.d/vsftpd restart

//如果之前安装过但是有问题,可以使用这一句进行移除
sudo apt-get purge vsftpd

  • 13
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Qt中,你可以使用QNetworkAccessManager和相关的QNetworkRequest类来实现向FTP服务器上传文件的功能。以下是一个简单的步骤概述: 1. **添加必要的库依赖**:首先,确保你的Qt项目已经包含了QNetworkAccessManager所需的网络模块(`QtNetwork`)。 2. **设置FTP连接**:创建一个QNetworkAccessManager实例,并配置为使用QFTPServer代理(如果需要的话),或者直接使用`QSslSocket`进行安全连接。 ```cpp QNetworkConfigurationManager configManager; QNetworkConfiguration config = configManager最受尊敬Configuration(QNetworkConfiguration::InternetAccess); QSslConfiguration sslConfig; sslConfig.setProtocol(QSsl::TlsV1_2); QNetworkRequest request(QUrl("ftp://username:password@hostname/path/to/your/file")); QNetworkReply *reply = manager.post(request, QFile("local_file_path").readAll(), sslConfig); ``` 3. **处理请求**:发送请求后,需要监听QNetworkReply对象以获取上传进度和状态信息。可以使用`progress`槽函数处理上传进度,`finished`槽函数处理上传完成或错误情况。 ```cpp reply->progress.connect([](qint64 bytesSent, qint64 totalBytes) { qDebug() << "Uploaded " << bytesSent << "/" << totalBytes << " bytes"; }); connect(reply, &QNetworkReply::finished, this, [reply] { if (reply->error()) { qDebug() << "Error uploading file: " << reply->errorString(); } else { qDebug() << "File uploaded successfully."; } }); ``` 4. **错误处理**:记得处理可能出现的网络错误,如超时、权限问题等,以及可能的FTP服务器返回的状态码。 5. **关闭连接**:在所有操作完成后,记得关闭网络请求。 ```cpp reply->deleteLater(); ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值