使用Git服务器当做文件下载服务器(做软件自动升级)

举报
DS小龙哥 发表于 2022/02/28 09:41:37 2022/02/28
【摘要】 在做客户端软件开发的时候,为了持续迭代更新,一般都会增加一个软件更新功能;用户每次打开软件或者点击软件里检查更新按钮,程序连接服务器检查是否有新版本,判断是否下载。这篇文章介绍: 如何免费搭建服务器。

一、功能需求与实现思路

在做客户端软件开发的时候,为了持续迭代更新,一般都会增加一个软件更新功能;用户每次打开软件或者点击软件里检查更新按钮,程序连接服务器检查是否有新版本,如果有新版本就下载下来安装。

要完成软件自动升级这个功能模块,正常都需要搭建一个HTTP服务器,没有服务器就需要自己去购买一个,百度、阿里、腾讯之类的。 一般正常公司的商业软件、官网都是部署在云服务器上的。

如果自己作为兴趣开发的开源软件、小工具软件,访问量不大的软件可以不用去自己花钱买服务器,搭建环境,这样增加成本;可以将软件放在码云、GitHub、codechina 这种git托管平台上,自己软件每次检查更新从Git托管平台去下载检查新版本就行了。

具体实现思路: 可以在仓库放两个文件:

首先,先找一个免费的Git服务器,新建一个新的仓库。

  1. 新建一个 verison.txt 这个文本文件里可以放版本号,每次本地客户端软件检查更新的时候,就将托管平台的这个verison.txt 文件下载下来,检查里面的版本号是否与本地软件的版本号相等,不相等或者大于就表示有新版本了。

  2. xxxx.exe 这个就是新版本软件的本体了。在第1步里,如果检查到有新版本软件,就直接下载下来即可。

**如何获取仓库里需要下载的文件链接? **

这里以码云为例。

  1. 打开仓库,找到自己要下载的文件,点击进去。

image.png

  1. 选择页面右上角的 “原始数据” 或者 “raw” 选项。
    image.png

  2. 在浏览器的地址栏里就可以得到该文件的下载地址了。

image.png

二、使用QT设计一个文件下载器

文件下载使用 QNetworkAccessManager 实现。

这里写个了下载文件的简单demo,功能比较简单,在地址栏里输入下载地址,点击下载即可。

2.1 软件运行效果

image.png

image.png

image.png

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服务器,实名认证后都可以免费使用。

  1. 腾讯的对象存储BOS服务器: https://cloud.tencent.com/document/product/436/30740

image.png

image.png

image.png

image.png

最终与上面第一章使用Git服务器实现的思路一样。

  1. 百度的对象存储BOS服务器:
    https://console.bce.baidu.com/bos

  2. 七牛云: https://www.qiniu.com/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200