QT通过url下载http地址下的文件(文件夹)

前言

之前只写过通过http协议通信,没有写过下载http地址中的文件或者文件夹,了解一下在QT下如何下载。

其实很简单,同使用协议通信相同的是,创建QNetworkAccessManager和QNetworkRequest,设置QNetworkRequest的url,通过get请求接收QNetworkReply中数据,利用downloadProgress信号接收每次下载下来的内容,直到下载完成。

代码如下:

 .pro

主要是加上network模块

#-------------------------------------------------
#
# Project created by QtCreator 2023-10-26T18:29:32
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = load_http_file
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has 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.0


SOURCES += \
        main.cpp \
        widget.cpp \

HEADERS += \
        widget.h \

FORMS += \
        widget.ui

界面:

 widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFile>
#include <QUrl>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QEventLoop>
#include <QTimer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

    bool downloadFile(QString url);
private slots:
    void on_load_zip_clicked();

private:
    Ui::Widget *ui;

private:
    bool flag_download = false;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QDir>
#include <QThread>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{

}

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

void Widget::on_load_zip_clicked()
{
    downloadFile(ui->lineEdit_url->text());
}

bool Widget::downloadFile(QString url)
{
    if(flag_download)
    {
        qDebug()<<"有正在下载中的文件,已停止当前下载。";
        return false;
    }
    int timeout = 1000 * 60; //* 3;
    QString path = "3D";
    QDir dir(path);
    if(!dir.exists())
    {
        if(!dir.mkdir(dir.absolutePath()))
        {
            qDebug()<<"创建3D文件夹失败!";
            return false;
        }
    }
    path = path + "/" + url.section('/',-1,-1);
    qDebug()<<"url:"<<url<<" path:"<<path;
    QFile file(path);
    if (!file.open(QIODevice::WriteOnly))
    {
        qDebug()<<"打开待下载文件失败!";
        return false;
    }

    flag_download = true;

    QNetworkAccessManager networkManager;
    QNetworkRequest request;
    request.setUrl(QUrl(url));
    QNetworkReply *reply = networkManager.get(request);

    QTimer timer;
    QEventLoop eventLoop;
    connect(reply, &QNetworkReply::downloadProgress, [=, &file, &timer](qint64 bytesReceived,qint64 bytesTotal){
        qDebug()<<"当前下载的文件大小:"<<bytesReceived<<"   总文件大小:"<<bytesTotal;
        if (timer.isActive())
            timer.start(timeout);
        file.write(reply->readAll());
    });
    connect(reply, &QNetworkReply::finished, &timer, &QTimer::stop);
    connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);

    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
    timer.start(timeout);

    eventLoop.exec();//QEventLoop::ExcludeUserInputEvents

    flag_download = false;

    if (reply->error() != QNetworkReply::NoError)
    {
        qDebug()<<"请求失败!失败原因:"<<reply->error();
        file.close();
        delete reply;
        return false;
    }
    if(timer.isActive())
    {
        qDebug()<<"请求超时!";
        timer.stop();
        file.close();
        delete reply;
        return false;
    }
    qDebug()<<"下载3D文件成功!";
    file.close();
    delete reply;
    return true;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,要实现FTP下载整个文件夹内容,可以使用QNetworkAccessManager类和QNetworkReply类来完成。 首先,需要使用QUrl来指定FTP服务器的地址文件夹路径。然后,创建一个QNetworkRequest对象,并使用setUrl()函数来设置请求的URL。 接下来,创建一个QNetworkAccessManager对象,使用它的get()函数发送GET请求,并将QNetworkRequest作为参数传入。 在发送请求后,QNetworkAccessManager会返回一个QNetworkReply对象,可以使用其readyRead()信号来读取下载的数据。利用这个信号,可以将数据写入本地文件夹。 为了下载整个文件夹内容,需要递归地遍历文件夹中的每个文件和子文件夹。可以使用QNetworkReply的finished()信号来切换到下一个文件文件夹下载。 具体的实现步骤如下: 1. 创建一个文件夹作为下载的目标文件夹。 2. 创建一个函数,用于递归地下载文件夹中的所有文件和子文件夹。传入的参数为FTP服务器的地址文件夹路径。 3. 在函数内部,使用QDir类的entryInfoList()函数获取文件夹中的所有文件文件夹。 4. 使用foreach循环遍历entryInfoList()返回的QFileInfoList,根据文件类型进行判断,如果是文件夹,则调用递归函数;如果是文件,则使用QNetworkAccessManager下载文件。 5. 在QNetworkReply的finished()信号触发时,判断当前是否是最后一个文件文件夹,如果不是,则继续下载一个文件文件夹。 6. 当所有文件文件夹下载完成后,整个文件夹内容的下载就完成了。 需要注意的是,在设置QNetworkRequest时,要将URL的协议改为FTP,例如"ftp://host/folder"。 以上就是使用Qt下载FTP整个文件夹内容的方法,通过使用QNetworkAccessManager和QNetworkReply来发送和接收FTP请求,以及使用QDir类来遍历文件夹中的内容,可以实现下载整个文件夹的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值