Qt5.8用FTP实现文件上传和下载(带进度条)

来源:互联网 发布:淘宝晒单 编辑:程序博客网 时间:2024/05/14 08:33

Qt5.8用FTP实现文件上传和下载(带进度条)

本文基于Qt5.8利用FTP协议实现文件的上传和下载。 本人所使用的FTP服务器端的操作系统为Linux(Ubuntu),编写QT代码的客户端的操作系统为Windows.

重要声明: 由于QT5.4版本之前和之后所提供的的类的差别非常大,所以请参考本文的读者确保您自己的Qt版本>=5.4。我们主要使用的类QNetWorkAccessManager从5.4版本才开始有。

FTP服务器的详细配置可在本人原创的另一篇名为“ Ubuntu16.04系统中配置FTP”的博客中查看(http://blog.csdn.net/timothy93bp/article/details/77527531)。

我的FTP服务器的用户名为peng, 密码为123456,ip地址为192.168.1.166, FTP服务器的根目录为/home/peng

  • 1. UI界面
  • 2. 修改.pro文件
  • 3. 头文件代码
  • 4. 源文件代码(上传,下载,进度条)
  • 5. FTP缺点

1. UI界面

本程序的UI界面如下:

这里写图片描述

文本编辑框中输入的是上传到服务器或者下载到本地之后,文件所要保存的名字, 该控件的objectName为“lineEdit“。”FTP上传”的按钮的objectName为“uploadButton“, “FTP下载”的按钮的objectName为“downloadButton“。

2. 修改.pro文件

首先,为了使用关于网络的类,我们首先要在.pro文件中加入一行:QT += network

//FTP.pro的内容

#-------------------------------------------------## Project created by QtCreator 2017-08-25T14:00:00##-------------------------------------------------QT       += core guiQT       += networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = FTPTEMPLATE = app# The following define makes your compiler emit warnings if you use# any feature of Qt which as been marked as deprecated (the exact warnings# depend on your compiler). Please consult the documentation of the# deprecated API in order to know how to port your code away from it.DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.# In order to do so, uncomment the following line.# You can also select to disable deprecated APIs only up to a certain version of Qt.#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += main.cpp\        mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.ui

3. 头文件代码

//mainwindow.h的内容

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QString>#include <QNetworkAccessManager>#include <QNetworkRequest>#include <QNetworkReply>#include <QUrl>#include <QFile>#include <QDebug>#include <QMessageBox>#include <QProgressBar>#include <QMainWindow>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void on_uploadButton_clicked();    void on_downloadButton_clicked();    void readContent();    void replyFinished(QNetworkReply*);    void loadError(QNetworkReply::NetworkError);    void loadProgress(qint64 bytesSent,qint64 bytesTotal);private:    Ui::MainWindow *ui;    QNetworkReply *reply;    QProgressBar *progressBar;    QFile *file;};#endif // MAINWINDOW_H

4. 源文件代码

//mainwindow.cpp的内容

#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);}MainWindow::~MainWindow(){    delete ui;}void MainWindow::on_uploadButton_clicked()    //上传文件{    file = new QFile("C:/Users/Administrator/Desktop/test.jpg");    file->open(QIODevice::ReadOnly);    QByteArray byte_file = file->readAll();    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);    accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);    QUrl url("ftp://192.168.1.166/ftp/" + ui->lineEdit->text() + ".jpg");    url.setPort(21);    url.setUserName("peng");    url.setPassword("123456");    QNetworkRequest request(url);    reply = accessManager->put(request, byte_file);    progressBar = new QProgressBar();    progressBar->setValue(0);    progressBar->show();    connect(accessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(loadError(QNetworkReply::NetworkError)));    connect(reply, SIGNAL(uploadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));}void MainWindow::on_downloadButton_clicked()    //下载文件{    file = new QFile(QApplication::applicationDirPath() + "/" + ui->lineEdit->text() + ".jpg");    file->open(QIODevice::WriteOnly);    QNetworkAccessManager *accessManager = new QNetworkAccessManager(this);    accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);    QUrl url("ftp://192.168.1.166/ftp/test.jpg");    url.setPort(21);    url.setUserName("peng");    url.setPassword("123456");    QNetworkRequest request(url);    reply = accessManager->get(request);    progressBar = new QProgressBar();    progressBar->setValue(0);    progressBar->show();    connect((QObject *)reply, SIGNAL(readyRead()), this, SLOT(readContent()));    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(loadError(QNetworkReply::NetworkError)));    connect(reply, SIGNAL(downloadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));}void MainWindow::readContent()    //下载时向本地文件中写入数据{    file->write(reply->readAll());}void MainWindow::replyFinished(QNetworkReply*)    //删除指针,更新和关闭文件{    if(reply->error() == QNetworkReply::NoError)        {            reply->deleteLater();            file->flush();            file->close();        }        else        {            QMessageBox::critical(NULL, tr("Error"), "Failed!!!");        }}void MainWindow::loadProgress(qint64 bytesSent, qint64 bytesTotal)    //更新进度条{       qDebug() << "loaded" << bytesSent << "of" << bytesTotal;       progressBar->setMaximum(bytesTotal); //最大值       progressBar->setValue(bytesSent);  //当前值}void MainWindow::loadError(QNetworkReply::NetworkError)    //传输中的错误输出{     qDebug()<<"Error: "<<reply->error();}

以上代码为全部代码,可以直接在客户端的QT上创建个名为“FTP”的基于MainWindow的新项目,然后按上述步骤建立ui界面,修改.pro文件,再往.h和.cpp文件中完全复制以上的代码,点击运行即可。

5. FTP的缺点

FTP有两种连接方式,PORT(主动方式)和PASV(被动方式)。简单来说,PORT是客户端与服务器端建立连接后,客户端开放一个端口,FTP服务器端把数据送到客户端开放的这个端口(店家送外卖); PASV是客户端与服务器端建立连接后,FTP服务器端开放一个端口,客户端去FTP服务器端开放的这个端口取数据(自己去店里买)。

当连接了路由的客户端电脑发送请求给FTP服务器后,客户端的内网IP首先先被翻译成它的公网IP,FTP服务器收到的IP 地址就为这个公网IP。若使用主动模式,由于路由器下的所有电脑都共享同一个公网IP,那么当服务器端给客户端根据这个IP地址发送数据库的时候,就不知道究竟该哪台电脑接收了。

所以,当内网电脑访问外网IP时,需要使用被动模式。这种情况下最好改用HTTP进行上传和下载。

用HTTP上传和下载的代码可在本人原创的另一篇名为“Qt5.8用HTTP实现文件上传和下载(带进度条)”的博客中查看。(http://blog.csdn.net/timothy93bp/article/details/77580365)

阅读全文
0 0
原创粉丝点击