首页 > 其他分享 >关于Qt **QNetworkAccessManager**、**QNetworkReply**、**QNetworkRequest**实现ftp下载时,**QNetworkReply**::**do

关于Qt **QNetworkAccessManager**、**QNetworkReply**、**QNetworkRequest**实现ftp下载时,**QNetworkReply**::**do

时间:2023-06-13 21:45:27浏览次数:32  
标签:ftp QNetworkRequest help text startIndex QNetworkReply true Qt

实现的ftp下载需要反馈下载进度,但是代码得到的bytesTotal始终为-1,直到下载完成那一刻,才变成文件大小。于是分析qt5base的network部分代码:

network/access/qnetworkaccessftpbackend.cpp文件中,有如下片段:

void QNetworkAccessFtpBackend::ftpRawCommandReply(int code, const QString &text)
{
    //qDebug() << "FTP reply:" << code << text;
    int id = ftp->currentId();

    if ((id == helpId) && ((code == 200) || (code == 214))) {     // supported commands
        // the "FEAT" ftp command would be nice here, but it is not part of the
        // initial FTP RFC 959, neither ar "SIZE" nor "MDTM" (they are all specified
        // in RFC 3659)
        if (text.contains(QLatin1String("SIZE"), Qt::CaseSensitive))
            supportsSize = true;
        if (text.contains(QLatin1String("MDTM"), Qt::CaseSensitive))
            supportsMdtm = true;
        if (text.contains(QLatin1String("PWD"), Qt::CaseSensitive))
            supportsPwd = true;
    } else if (id == pwdId && code == 257) {
        QString pwdPath;
        int startIndex = text.indexOf('"');
        int stopIndex = text.lastIndexOf('"');
        if (stopIndex - startIndex) {
            // The working directory is a substring between \" symbols.
            startIndex++; // skip the first \" symbol
            pwdPath = text.mid(startIndex, stopIndex - startIndex);
        } else {
            // If there is no or only one \" symbol, use all the characters of
            // text.
            pwdPath = text;
        }

此处它通过SITE help命令查询ftp server支持的命令,我这边ftp server是pureftpd,实际在终端用ftp命令连接上后,site help查询得到的结果确实没有SIZE的支持,尝试通过配置文件看能否打开此命令的支持,但是每查到,于是阅读pureftpd源码,src/ftp_parser.c中可知,site help得到的返回永远是固定的,

else if (!strcasecmp(arg, "help")) {
                    help_site:

                    addreply_noformat(214, MSG_SITE_HELP CRLF
# ifdef WITH_DIRALIASES
                                      " ALIAS" CRLF
# endif
                                      " CHMOD" CRLF " IDLE" CRLF " UTIME");
                    addreply_noformat(214, "Pure-FTPd - http://pureftpd.org/");
                }

于是只好暴力修改Qt源码,QNetworkAccessFtpBackend构造的初始化列表将

QNetworkAccessFtpBackend::QNetworkAccessFtpBackend()
    : ftp(nullptr), uploadDevice(nullptr), totalBytes(0), helpId(-1), sizeId(-1), mdtmId(-1), pwdId(-1),
    supportsSize(true), supportsMdtm(false), supportsPwd(false), state(Idle)
{
}

supportsSize(false) 改为true.问题解决,不过对应的ftp server那端必须要支持size命令,好在ftp server大多一般都支持size。解决方案不优雅,但是可行。

标签:ftp,QNetworkRequest,help,text,startIndex,QNetworkReply,true,Qt
From: https://www.cnblogs.com/thammer/p/17478789.html

相关文章

  • FTP配置文件文件详解
    设置匿名用户访问FTPanonymous_enable=YES//设置是否允许匿名用户登录FTP服务器,默认为YES。  write_enable=YES//是否对登录用户开启写权限,属全局性设置,默认NO。local_enable=YES//是否允许本地用户登录FTP服务器,默认为NO。ftp_userna......
  • java 获取ftp文件列表以及模糊查询,并对结果进行分页
    /***获取ftp文件列表*".*\\.txt":匹配所有以".txt"结尾的文件名。其中,星号(*)表示任意字符序列,反斜杠(\)用于转义点号(.)字符。*".*"+"任意字符"+".*\\.txt":匹配所有包含"表示匹配任意多个任意字符"和以".txt"结尾的文件名。其中,星号(*)表示任意字......
  • 通过ftp & sftp 进行minio 管理
    minio4.20发布的版本支持基于ftp以及sftp进行minio管理了,对于一些业务需要使用ftp以及sftp的就比较方便了我们同时可以使用多协议模式进行minio访问了参考使用docker-compose version:'3'services:app:image:minio/minio:RELEASE.2023-06-02T23-17-26Z.fipscommand:......
  • 【Ubuntu22.04】配置静态IP地址和FTP服务
    ##一、配置静态IP1.使用命令`ipa`查看当前网卡名称,Ubuntu22.04默认网卡为ens33:![](https://img2023.cnblogs.com/blog/3081210/202306/3081210-20230610143107393-250043837.png)2.使用命令`tree/etc/netplan`查看默认网卡配置文件:![](https://img2023.cnblogs.com/blog/......
  • mysql管理多服务器ftp虚拟用户
    前言1.FTP虚拟用户:FTP虚拟用户由ftp服务器提供,依赖于一个服务器本地账号,可以同时设置多个虚拟账号。vsftpd分辨虚拟用户,由可插入认证模块(PAM)认证,该模块的账号信息可用文件或者数据库存储。FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户账号可以提供集中管理的FTP根目录,方便......
  • 2023春秋杯春季赛 easy_LzhiFTP
    分析保护机制$checksec--file=easy_LzhiFTPRELROSTACKCANARYNXPIERPATHRUNPATH Symbols FORTIFY Fortified Fortifiable FILEPartialRELROCanaryfoundNXenabledPIEenabledNoRPATHNoRUNPATH......
  • 通过ftp & sftp 进行minio 管理
    minio4.20发布的版本支持基于ftp以及sftp进行minio管理了,对于一些业务需要使用ftp以及sftp的就比较方便了我们同时可以使用多协议模式进行minio访问了参考使用docker-compose version:'3'services:app:image:minio/minio:RELEASE.2......
  • Xshell/Xftp/Xlpd Plus 7:官方免破全功能无限制版(2023更新)
    XshellPlus7是一款集成了Xshell7(SSH客户端)和Xftp7(SFTP客户端)的软件套餐,可以让您在访问远程终端的同时,进行多窗口的文件传输和编辑,大大提高您的工作效率。XshellPlus7支持多种协议,如SSH,SFTP,TELNET,RLOGIN,SERIAL等,还具有强大的安全性和可定制性。本文将为您详细介绍XshellPlus......
  • 读取FTP文件,并打包成压缩包下载
    importjava.io.*;importjava.net.SocketException;importjava.net.URLEncoder;importjava.util.List;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;importorg.apache.commons.net.ftp.FTPClient;importorg.apache.commons.net.ftp.FTPF......
  • ChunJun FTP Connector 功能扩展解读
    本文将从FTPConnector的功能详解,自定义文件切割及自定义FileFormat三个方面为大家带来ChunJunFTPConnector的功能扩展分享。FTPConnector详解FTP是用于在网络上进行文件传输的一套标准协议,它工作在OSI模型的第七层,TCP模型的第四层,即应用层,提供一种在服务器和客户......