使用Git服务器当做文件下载服务器(做软件自动升级)
一、功能需求与实现思路
在做客户端软件开发的时候,为了持续迭代更新,一般都会增加一个软件更新功能;用户每次打开软件或者点击软件里检查更新按钮,程序连接服务器检查是否有新版本,如果有新版本就下载下来安装。
要完成软件自动升级这个功能模块,正常都需要搭建一个HTTP服务器,没有服务器就需要自己去购买一个,百度、阿里、腾讯之类的。 一般正常公司的商业软件、官网都是部署在云服务器上的。
如果自己作为兴趣开发的开源软件、小工具软件,访问量不大的软件可以不用去自己花钱买服务器,搭建环境,这样增加成本;可以将软件放在码云、GitHub、codechina
这种git托管平台上,自己软件每次检查更新从Git托管平台去下载检查新版本就行了。
具体实现思路: 可以在仓库放两个文件:
首先,先找一个免费的Git服务器,新建一个新的仓库。
-
新建一个 verison.txt 这个文本文件里可以放版本号,每次本地客户端软件检查更新的时候,就将托管平台的这个verison.txt 文件下载下来,检查里面的版本号是否与本地软件的版本号相等,不相等或者大于就表示有新版本了。
-
xxxx.exe 这个就是新版本软件的本体了。在第1步里,如果检查到有新版本软件,就直接下载下来即可。
**如何获取仓库里需要下载的文件链接? **
这里以码云
为例。
- 打开仓库,找到自己要下载的文件,点击进去。
-
选择页面右上角的 “原始数据” 或者 “raw” 选项。
-
在浏览器的地址栏里就可以得到该文件的下载地址了。
二、使用QT设计一个文件下载器
文件下载使用 QNetworkAccessManager 实现。
这里写个了下载文件的简单demo,功能比较简单,在地址栏里输入下载地址,点击下载即可。
2.1 软件运行效果
2.2 widget.cpp 源码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
/*1. 实例化QNetworkAccessManager*/
Manager = new QNetworkAccessManager(this);
ui->progressBar->setValue(0);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_Get_clicked()
{
if(ui->lineEdit->text().isEmpty())
{
QMessageBox::warning(this,tr("错误提示"),tr("下载地址为空!"),QMessageBox::Ok);
return;
}
QUrl url=ui->lineEdit->text();
/*3. 创建文件*/
QFileInfo FileInfo(url.path());
QString fileName = QFileDialog::getSaveFileName(this, tr("创建文件"),FileInfo.fileName());
NewFile =new QFile(fileName);
if(!NewFile->open(QIODevice::WriteOnly))
{
QString str=fileName+"创建失败";
QMessageBox::warning(this,tr("错误提示"),str,QMessageBox::Ok);
return;
}
/*4. 获取网页数据*/
Reply=Manager->get(QNetworkRequest(QUrl(url)));
/*5. 关联downloadProgress和finished信号*/
connect(Reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(ReplydownloadProgress(qint64,qint64)));
connect(Reply, SIGNAL(finished()),this, SLOT(ReplyFinished()));
connect(Reply, SIGNAL(readyRead()),this, SLOT(ReplyReadyRead()));
}
//下载请求完成
void Widget::ReplyFinished()
{
NewFile->flush();//刷新缓冲区
NewFile->close();//关闭文件
delete NewFile; //释放NewFile对象。
Reply->deleteLater();//释放Reply
}
//更新下载进度
void Widget::ReplydownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
ui->progressBar->setMaximum(bytesTotal);
ui->progressBar->setValue(bytesReceived);
}
void Widget::ReplyReadyRead()
{
//读取网络数据,写入文件
if(NewFile)
{
NewFile->write(Reply->readAll());
}
}
2.3 widget.h 源码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QFile>
#include <QFileInfo>
#include <QFileDialog>
#include <QMessageBox>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
QNetworkAccessManager *Manager;
QNetworkReply *Reply;
QFile *NewFile;
public slots:
void ReplyFinished();
void ReplydownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
void ReplyReadyRead();
private slots:
void on_pushButton_Get_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
2.4 xxx.pro 工程文件源码
#-------------------------------------------------
#
# Project created by QtCreator 2016-12-05T21:39:48
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Web
TEMPLATE = app
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
FORMS += widget.ui
三、其他方案推荐
有些Git服务器上,设置了没有登录用户的文件下载大小,大文件需要登录了才能正常下载。这对客户端使用来讲不友好。
如果是大文件,几百兆这种,可以使用一些厂商的对象存储BOS服务器,实名认证后都可以免费使用。
- 腾讯的对象存储BOS服务器: https://cloud.tencent.com/document/product/436/30740
最终与上面第一章使用Git服务器实现的思路一样。
-
百度的对象存储BOS服务器:
https://console.bce.baidu.com/bos
- 点赞
- 收藏
- 关注作者
评论(0)