解决QNetworkAccessManager实现ftp功能后,不能上传大于1G文件的问题

本文介绍了一种解决使用QNetworkAccessManager进行FTP大文件(如超过1GB)上传的方法。通过直接传递文件指针而非读取全部内容到内存中,有效避免了内存溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做一个ftp上传工具,用的是QNetworkAccessManager实现ftp工具,网上很多demo 实现ftp上传,但是有一个很严重的问题,当上传的文件足够大,比如大于1G, 也可能是2G ,具体根绝PC的内存大小。那么上传就不起作用了。网上的代码如下:

    QFile File(FIlePath);
    File.open(QIODevice::ReadOnly);
   qDebug()<<File.isOpen();
    QByteArray FileArray=File.readAll(); //这样做的弊端是  大有1G 的文件不上readall 导致不能上传
    File.close();
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QUrl ftpUrl(FtpUrl+"/"+DestFolder +"/"+NameFiles);

    
    // FtpUrl.setPath("");
    ftpUrl.setUserName(FTPUser);
    ftpUrl.setPassword(FTPPasw);
    
    QNetworkReply *putReply = manager->put(QNetworkRequest(ftpUrl), FileArray);
    connect(putReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
    connect(putReply, SIGNAL(finished()), this, SLOT(uploadFinished()));
    connect(putReply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError )));
 

网上的方法,不管多大的文件都直接使用QByteArrayFileArray=File.readAll()这样是不对的,当文件很大,根本读取不到的。


查了很多资料。终于搞明白怎么解决这个问题了。代码如下

     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    
    QUrl ftpUrl(FtpUrl+"/"+DestFolder +"/"+NameFiles);


    ftpUrl.setUserName(FTPUser);
    ftpUrl.setPassword(FTPPasw);


    
    QFile * data = new QFile(FIlePath,this); //这样直接把文件指针当成参数传递给put  解决大于1G文件不能上传的Bug
    if(data->open(QIODevice::ReadOnly))

    {
    QNetworkReply *putReply = manager->put(QNetworkRequest(ftpUrl), data);
    connect(putReply, SIGNAL(uploadProgress(qint64,qint64)),this,SLOT(uploadProgress(qint64,qint64)));
    connect(putReply, SIGNAL(finished()), this, SLOT(uploadFinished()));
    connect(putReply, SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(slotError(QNetworkReply::NetworkError )));
   }    else
   {
        qDebug()<< "file open  Failure";
       
    }
直接把文件指针 data  传递给put当做参数,QFile 根本上也继承于 QIODevice,这样就直接用指针操作指向文件,不管文件多大都不受影响。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值