当前位置:网站首页>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;
}
边栏推荐
- Opencv learning log 26 -- detect circular holes and mark them
- Specify the format time, and fill in zero before the month and days
- Candy delivery (Mathematics)
- MySQL grants the user the operation permission of the specified content
- Flag framework configures loguru logstore
- Codeforces Round #801 (Div. 2)A~C
- The concept of C language array
- 分享一个在树莓派运行dash应用的实例。
- 7-1 understand everything (20 points)
- Luogu P1102 A-B number pair (dichotomy, map, double pointer)
猜你喜欢
随机推荐
Opencv learning log 24 -- Hough transform 2 (maximum interval and minimum length can be limited)
F - birthday cake (Shandong race)
409. Longest palindrome
[exercise-5] (UVA 839) not so mobile (balance)
Nodejs crawler
Alice and Bob (2021 Niuke summer multi school training camp 1)
Codeforces Round #801 (Div. 2)A~C
双向链表—全部操作
New to redis
树莓派4B安装opencv3.4.0
Basic Q & A of introductory C language
875. 爱吃香蕉的珂珂 - 力扣(LeetCode)
Shell Scripting
1605. Sum the feasible matrix for a given row and column
It is forbidden to trigger onchange in antd upload beforeupload
Borg maze (bfs+ minimum spanning tree) (problem solving report)
input 只能输入数字,限定输入
MariaDB的安装与配置
Acwing: Game 58 of the week
Acwing: the 56th weekly match