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)
- Qt5.8用FTP实现文件上传和下载(带进度条)
- Qt5.8用HTTP实现文件上传和下载(带进度条)
- FTP+SpringMVC+Uploadify实现带进度条多文件上传
- qt5集成libcurl实现tftp和ftp的方法之四:实现ftp文件上传和下载
- qt5集成libcurl实现tftp和ftp的方法之二:实现tftp文件上传和下载
- shell实现ftp上传和下载文件
- ftp实现文件上传和下载
- FTP上传和下载文件--C++实现
- ftp实现文件的上传和下载
- 用edtftpj实现ftp文件上传和下载
- android 文件上传与下载(带进度条)
- FtpClient 类来操作FTP的上传和下载,带进度条
- Android FTP 客户端 上传/下载 带进度条实战源码
- ftp实现文件上传(下载)
- FTP上传和下载文件
- FTP上传和下载文件
- ftp文件上传和下载
- ftp文件上传和下载
- Selenium常用方法1
- Thin plate splines 薄板样条插值个人理解
- Flume 入门与简单运用
- Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述
- 软件设计之——如何理解需求
- Qt5.8用FTP实现文件上传和下载(带进度条)
- 十大常用排序算法(java实现)(转)
- 学习总结:毕业项目-项目实训开题
- MySQL基础总结(入门级别)----大神请绕行
- 「翻译」Unity中的AssetBundle详解(一)
- DP——书的复制
- H5禁止手机自带键盘弹出 input获取焦点时禁止手机键盘弹出
- python3抓去豆瓣电影首页热映电影名以及照片
- 文件的上传和下载