当前位置:网站首页>Summary of FTP function implemented by qnetworkaccessmanager

Summary of FTP function implemented by qnetworkaccessmanager

2022-07-06 16:17:00 Larry_ Yanan

Because the project needs , First contact FTP Upload problem of , After consulting, the old QFtp, Adopt the new QNetworkAccessManager. Its use is also very convenient , Relatively mature interfaces and signals have been provided , So to summarize .

First , Create some variables and pointers in the header file

	QUrl url;
    QNetworkAccessManager *accessManager; // Initialize to nullptr
    QNetworkReply *reply;                 // Initialize to nullptr
    QFile *ftp_file;                          // Initialize to nullptr
    bool ftp_upload = false;  // Upload file ID 
    bool ftp_download = false;  // Upload file ID 

url It needs to be uploaded later FTP Server file path ;QNetworkAccessManager It is the so-called network access manager , It is mainly used to upload files ;QNetworkReply yes QNetworkAccessManager A reply object when uploading , You can get some returned information through it

then , yes cpp The formal code part of the document

	//url
    QUrl url(uploadUrl);// Set up a ftp route , for example ftp://xxx/xx/x
    url.setPort(ftp_upload_path_info.ftpport);// Port number 
    url.setUserName(ftp_upload_path_info.ftpaccount);// user name 
    url.setPassword(ftp_upload_path_info.ftppws);// password 
	
	// Add an instance to the pointer 
    accessManager = new QNetworkAccessManager();
    accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);// Set up network access 
    QNetworkRequest request(url);// take QUrl Set into the network request class QNetworkRequest  in 
	
	// The method of reading the file , stay 1G The above files will cause direct upload failure 
	//ftp_file = new QFile(filenamepath);
    //ftp_file->open(QIODevice::ReadOnly);
    //QByteArray byte_file = ftp_file->readAll();
 
    // Solve the uploading of large files 
    QFile *data = new QFile(filenamepath,this);
    if(data->open(QIODevice::ReadOnly))
    {
    

    }

    reply = accessManager->put(request, data/*byte_file*/);  // Send upload request 
    
    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(loadError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(uploadProgress(qint64 ,qint64)), this, SLOT(loadProgress(qint64 ,qint64)));

Not a lot of code , Step by step . First QUrl You need to set the path 、 Port number 、 User name and password , This is the FTP Server related ; Then there is the formal QNetworkAccessManager Upload , You need to put url Set in QNetworkRequest In the object , Then pass it in the form of parameters QNetworkAccessManager Of put In the method .put Actually, it means uploading , except QNetworkRequest Out of parameters , You also need a file pointer .

There are two ways , The mainstream online is to use QFile Of readAll() To read , But there is no way for large files readAll() Of , So it will fail directly . Here will be passed in QByteArray data , Change to direct transfer QIODevice Type a pointer (QFile Inherit ), So as to solve the problem of uploading large files . Personal test 2G That's OK , It's just that the larger the file, the slower the upload speed .
Reference resources : solve QNetworkAccessManager Realization ftp After function , Cannot upload more than 1G Problems with documents

The other is signal slot Correlation , Here I bound three . The first is QNetworkAccessManager Of itself finished The signal , Whether the upload is successful , Or upload failed , Network interruption timeout and other things will be returned , It's a result anyway , You need to go through QNetworkReply Parameter to distinguish the returned results .

void xxx::replyFinished(QNetworkReply *)
{
    
    qDebug()<<"reply->error()"<<reply->error();
    if (reply->error() == QNetworkReply::NoError)  // After each file is uploaded, it will be executed in Chengdu 
    {
    
        qDebug()<<" Upload successful ";
        ftp_file->close();// Remember to close the file operation 

        QMessageBox::about(NULL, " Tips ", " Upload successful !");

    }else if((reply->error() == QNetworkReply::OperationCanceledError))
    {
    
        // Error caused by manual cancellation 
    }
    else
    {
    
// QMessageBox::about(NULL, " Tips ", " Upload failed !");
    }
}

The second signal slot is also an error message , Similar to the first one , But the timing of reporting errors may be different

void xxx::loadError(QNetworkReply::NetworkError error)
{
    
    qDebug()<<"Transmitted error!!!";
    //QMessageBox::about(NULL, " Tips ", " Upload failed !");
}

The third signal slot is a little interesting , It is a feedback signal of the upload progress ,uploadProgress(qint64 ,qint64) The parameters of are the current uploaded size and total size , for example 250,1000 such .
The trigger frequency of this signal is moderate , You can use it to display a progress bar . For example QProgressBar Of void setRange(int minimum, int maximum); and void setValue(int value); To set the range and current value .

It is worth mentioning that , The parameters here are int type , In the case of large file uploading , Often uploadProgress(qint64 ,qint64) Of qint64 (long long) It is greater than int Of , If you don't judge and convert by yourself , The progress bar will have no effect or percentage value .

while(bytesTotal > 0x7fffffff)//int The maximum of 
{
    
    bytesTotal /= 10;
    bytesSent /= 10;

}
原网站

版权声明
本文为[Larry_ Yanan]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060920129200.html