使用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);

//通过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();
        }
     }
 }

//通过文件信息解析

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);
}

//将列表信息用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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值