最近做一个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,这样就直接用指针操作指向文件,不管文件多大都不受影响。