• 使用QFtp实现文件上传


    qt5使用QNetworkAccessManager实现ftp功能,但无法获取ftp服务器上的文件列表等信息,仅支持上传,下载,无法进行文件夹创建及删除,因此需要编译qt4的ftp组件,将其放入相应的include,lib及bin文件夹下。
    QFtp源码地址:https://github.com/qt/qtftp
    windows搭建ftp服务器参考:https://blog.csdn.net/qq_44402184/article/details/127046817
    使用QFtp实现上传获取列表等功能代码如下:
    //建立连接

     ftp = new QFtp(this);
     connect(ftp, &QFtp::commandFinished, this, &QFtpWidget::ftpCommandFinishedSlot);
    
    • 1
    • 2

    //通过slot解析具体内容

    void  QFtpWidget::ftpCommandFinishedSlot(int i, bool error) {
        if (ftp->currentCommand() == QFtp::ConnectToHost)
        {
            if (error) {
                ui.textBrowser->append("FTP连接失败-----");
                return;
            }
            else {
                ui.textBrowser->append("FTP连接成功-----");
                ui.selecFiletBtn->setEnabled(true);
              //  ui.filepathEt->setEnabled(true);
                ui.preBtn->setEnabled(true);
                connect(ftp, &QFtp::listInfo, this, &QFtpWidget::getListSlot);
                ftp->list();
            }
        }
        else if (ftp->currentCommand() == QFtp::List) {
            updateTableWgtData();
           // qDebug() << "yes list--------------------m_ftpFileList size: " << m_ftpFileList.size();;
        }
        else if (ftp->currentCommand() == QFtp::Put) {
            qDebug() << "i-----------------" << i;
            if (error) {
                ui.textBrowser->append("文件上传失败--------------------------");
            }
            else {
                ui.textBrowser->append("文件上传成功--------------------------");
                ftp->list();
                m_infoVec.clear();
            }
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    //通过文件信息解析

    void QFtpWidget::getListSlot(const QUrlInfo info) {
        FileInfo finfo;
        if (info.isFile()) {
            //qDebug() << "file-----------------------";
            finfo.type = FileType::File;
        }
        else if (info.isDir()) {
            finfo.type = FileType::Folder;
        }
        QString name = QString::fromLocal8Bit(info.name().toLatin1());
        finfo.filename = name;
        int size = info.size();
        QString fsize = "";
        if (size < KData) {
            fsize = QString::number(size).append("B");
        }
        else if (size > KData && size < MData) {
            double s = 1.0 * size / KData;
            s = round(s * 100) * 0.01;
            fsize = QString::number(s).append("KB");
        }
        else {
            double s = 1.0 * size / MData;
            s = round(s * 100) * 0.01;
            fsize = QString::number(s).append("MB");
        }
        finfo.size = fsize;
        QString time = info.lastModified().toString();
        finfo.time = time;
        m_infoVec.push_back(finfo);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    //将列表信息用tableWidget显示

    void QFtpWidget::updateTableWgtData() {
        //清空数据
        if (ui.tableWidget->rowCount() > 0) {
            while (ui.tableWidget->rowCount() > 0) {
                ui.tableWidget->removeRow(ui.tableWidget->rowCount() - 1);
            }
        }
        if (m_infoVec.empty()) {
            return;
        }
        ui.tableWidget->setRowCount(m_infoVec.size());
        int size = ui.tableWidget->rowCount();
        connect(ui.tableWidget, &QTableWidget::cellDoubleClicked, this, &QFtpWidget::cellDoubleClickedSlot);
        for (int i = 0; i < size; i++) {
            ui.tableWidget->setRowHeight(i, 30);
            QTableWidgetItem* btItem = new QTableWidgetItem();   //靶体  
            FileInfo finfo = m_infoVec[i];
            btItem->setTextAlignment(Qt::AlignLeft);    //文字居中
            btItem->setFlags(btItem->flags() & (~Qt::ItemIsEditable));
            if (finfo.type == FileType::File) {
                btItem->setIcon(QIcon("file.png"));
            }
            else {
                btItem->setIcon(QIcon("folder.png"));
            }
            btItem->setText(finfo.filename);
            ui.tableWidget->setItem(i, 0, btItem);
            QTableWidgetItem* btItem1 = new QTableWidgetItem();
            btItem1->setTextAlignment(Qt::AlignHCenter);    //文字居中
            btItem1->setText(finfo.size);
            ui.tableWidget->setItem(i, 1, btItem1);
            btItem1->setFlags(btItem1->flags() & (~Qt::ItemIsEditable));
            QTableWidgetItem* btItem2 = new QTableWidgetItem();
            btItem2->setTextAlignment(Qt::AlignHCenter);    //文字居中
            btItem2->setText(finfo.time);
            ui.tableWidget->setItem(i, 2, btItem2);
            btItem2->setFlags(btItem2->flags() & (~Qt::ItemIsEditable));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    动态显示如下:
    在这里插入图片描述

  • 相关阅读:
    LeetCode——Weekly Contest 315&317
    springboot集成mysql、mybatis-plus、shardingsphere-jdbc实现读写分离
    Vue3笔记_03(组合式API)toRef
    基于 Scriptable 从零开始美化iOS桌面(一)
    ORA-32771 cannot add file to bigfile tablespace
    设计模式必知必会系列终章
    什么是web3 | 区块链web3.0人才
    【开发】微服务整合Sentinel
    基于java+SpringBoot+HTML+Mysq在线选课系统设计与实现
    实现 easyExcel 导入导出自定义字典转换器
  • 原文地址:https://blog.csdn.net/weixin_41377572/article/details/127600540