2023-04-14 19:30:30 +08:00
|
|
|
|
#include "ftpclient.h"
|
|
|
|
|
|
#include <QEventLoop>
|
|
|
|
|
|
#include "NetMgr.h"
|
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
|
#include <QJsonObject>
|
|
|
|
|
|
#include "global.h"
|
|
|
|
|
|
|
2023-10-19 14:15:31 +08:00
|
|
|
|
|
2023-04-14 19:30:30 +08:00
|
|
|
|
FtpClient *g_FtpClient = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
FtpClient::FtpClient(QWidget *parent)
|
|
|
|
|
|
: QWidget(parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_ftpManager = new QNetworkAccessManager(this);
|
|
|
|
|
|
|
|
|
|
|
|
m_inputFile = NULL;
|
|
|
|
|
|
m_fileName = "";
|
2023-04-27 19:48:15 +08:00
|
|
|
|
m_Type = -1;
|
2023-10-19 14:15:31 +08:00
|
|
|
|
//connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
connect(g_NetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&)));
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FtpClient::~FtpClient()
|
|
|
|
|
|
{
|
|
|
|
|
|
delete m_ftpManager;
|
|
|
|
|
|
delete m_ftpUrl;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FtpClient::SetUserInfo(const QString userAccount, const QString pwd)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_ftpUrl->setUserName(userAccount);
|
|
|
|
|
|
m_ftpUrl->setPassword(pwd);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FtpClient::SetServerInfo(const QString fileAddr, int Port/* =21 */)
|
|
|
|
|
|
{
|
2023-04-17 17:40:26 +08:00
|
|
|
|
m_ftpManager->disconnect(SIGNAL(finished(QNetworkReply*)));
|
|
|
|
|
|
connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*)));
|
2023-04-27 19:48:15 +08:00
|
|
|
|
//connect(m_ftpManager, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
m_ftpUrl = new QUrl(fileAddr);
|
|
|
|
|
|
|
|
|
|
|
|
m_ftpUrl->setPort(Port);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2023-10-19 14:15:31 +08:00
|
|
|
|
|
2023-04-14 19:30:30 +08:00
|
|
|
|
void FtpClient::slotNetMgr(QString sAddr, const QVariant &msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonObject objec = msg.value<QJsonObject>();
|
|
|
|
|
|
if(objec.contains("cmd"))
|
|
|
|
|
|
{
|
|
|
|
|
|
QJsonValue arrays_value = objec.take("cmd");
|
2023-04-17 17:40:26 +08:00
|
|
|
|
qDebug()<<"cmd ="<<arrays_value.toString();
|
2023-04-14 19:30:30 +08:00
|
|
|
|
if(arrays_value.toString() == "90" || arrays_value.toString() == "46" )
|
|
|
|
|
|
{
|
|
|
|
|
|
bool Status = objec.take("success").toBool();
|
|
|
|
|
|
QString strMessage = objec.take("message").toString();
|
|
|
|
|
|
if(Status){
|
2023-04-27 19:48:15 +08:00
|
|
|
|
sigReplyStatus(1);
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
|
|
|
|
|
|
}else{
|
|
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), strMessage);
|
2023-04-27 19:48:15 +08:00
|
|
|
|
sigReplyStatus(0);
|
2023-04-14 19:30:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FtpClient::finished(QNetworkReply* reply)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2023-04-27 19:48:15 +08:00
|
|
|
|
QNetworkReply::NetworkError error = reply->error();
|
|
|
|
|
|
qDebug() << "finished" << error <<endl;
|
2024-09-11 16:37:00 +08:00
|
|
|
|
delete m_ftpUrl;
|
|
|
|
|
|
m_ftpUrl = NULL;
|
2023-04-14 19:30:30 +08:00
|
|
|
|
if(m_fileName != ""){
|
2023-04-17 17:40:26 +08:00
|
|
|
|
//QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QJsonObject allObj,cmdBody,temp;
|
|
|
|
|
|
QJsonArray tempArray;
|
2023-04-27 19:48:15 +08:00
|
|
|
|
if(m_fileName.contains(".json")){
|
2023-04-14 19:30:30 +08:00
|
|
|
|
allObj.insert("cmd", "90");
|
|
|
|
|
|
temp["fileName"] = m_fileName;
|
2023-04-27 19:48:15 +08:00
|
|
|
|
if(m_Type >= 0)
|
|
|
|
|
|
temp["content"] = m_Type;
|
2023-04-14 19:30:30 +08:00
|
|
|
|
tempArray.append(temp);
|
|
|
|
|
|
allObj.insert("cmdBody",tempArray);
|
2023-04-27 19:48:15 +08:00
|
|
|
|
}else{
|
|
|
|
|
|
allObj.insert("cmd", "46");
|
|
|
|
|
|
allObj.insert("type", m_Type);
|
|
|
|
|
|
temp["fileName"] = m_fileName;
|
|
|
|
|
|
allObj.insert("cmdBody",temp);
|
2023-04-14 19:30:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
qDebug() << allObj << endl;
|
|
|
|
|
|
QNetworkRequest req;
|
|
|
|
|
|
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
|
|
|
|
|
|
|
|
|
|
|
|
req.setUrl(sUrl);
|
|
|
|
|
|
g_NetMgr->PostJson(req,allObj);
|
|
|
|
|
|
m_fileName = "";
|
2023-04-27 19:48:15 +08:00
|
|
|
|
m_Type = -1;
|
2023-04-14 19:30:30 +08:00
|
|
|
|
//QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if(m_inputFile != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
2023-10-19 14:15:31 +08:00
|
|
|
|
emit sigDownloadStatus();
|
2023-04-14 19:30:30 +08:00
|
|
|
|
m_inputFile->flush();
|
|
|
|
|
|
m_inputFile->close();
|
|
|
|
|
|
delete m_inputFile;
|
|
|
|
|
|
m_inputFile = NULL;
|
2023-10-19 14:15:31 +08:00
|
|
|
|
downloadReply->deleteLater();
|
2023-04-14 19:30:30 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
reply->deleteLater();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FtpClient::CheckReplyStatus(QNetworkReply::NetworkError inputError)
|
|
|
|
|
|
{
|
|
|
|
|
|
qDebug() << "inputError" << inputError << endl;
|
|
|
|
|
|
switch(inputError)
|
|
|
|
|
|
{
|
|
|
|
|
|
case QNetworkReply::NoError:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("文件上传成功"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case QNetworkReply::HostNotFoundError:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("服务器名称不合理"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case QNetworkReply::ConnectionRefusedError:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("服务器拒绝连接"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
case QNetworkReply::RemoteHostClosedError:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("服务器已关闭"));
|
|
|
|
|
|
break;
|
2023-10-19 14:15:31 +08:00
|
|
|
|
case QNetworkReply::ContentNotFoundError:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("文件不存在!"));
|
|
|
|
|
|
break;
|
2023-04-14 19:30:30 +08:00
|
|
|
|
default:
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("异常错误"));
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-04-27 19:48:15 +08:00
|
|
|
|
void FtpClient::UpLoadFile(const QString fileSource, const QString fileName,int type)
|
2023-04-14 19:30:30 +08:00
|
|
|
|
{
|
|
|
|
|
|
if(fileSource.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
m_fileName = fileName;
|
2023-04-27 19:48:15 +08:00
|
|
|
|
m_Type = type;
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QFile file(fileSource);
|
|
|
|
|
|
if(!file.exists())
|
|
|
|
|
|
{
|
|
|
|
|
|
QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("上传的文件不存在"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2024-04-02 19:25:44 +08:00
|
|
|
|
customLogMessageHandler(QtDebugMsg,fileName);
|
2023-04-14 19:30:30 +08:00
|
|
|
|
file.open(QIODevice::ReadOnly);
|
|
|
|
|
|
QByteArray data = file.readAll(); //转化编码
|
|
|
|
|
|
//QString result = QString::fromLatin1(fileDest.toStdString().c_str());
|
|
|
|
|
|
//m_ftpUrl->setPath(result);
|
|
|
|
|
|
QNetworkReply* reply = m_ftpManager->put(QNetworkRequest(*m_ftpUrl), data);
|
2023-10-19 14:15:31 +08:00
|
|
|
|
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QEventLoop loop;
|
2023-10-19 14:15:31 +08:00
|
|
|
|
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
loop.exec();
|
|
|
|
|
|
reply->deleteLater();
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void FtpClient::DownLoad(const QString fileSource, const QString fileDest)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(fileSource.isEmpty() || fileDest.isEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-10-19 14:15:31 +08:00
|
|
|
|
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QFileInfo info;
|
|
|
|
|
|
info.setFile(fileDest);
|
|
|
|
|
|
m_inputFile = new QFile(info.filePath());
|
|
|
|
|
|
m_inputFile->open(QIODevice::WriteOnly | QIODevice::Truncate);
|
|
|
|
|
|
QString result = QString::fromLatin1(fileSource.toStdString().c_str());//转化编码
|
|
|
|
|
|
m_ftpUrl->setPath(result);
|
2023-10-19 14:15:31 +08:00
|
|
|
|
downloadReply = m_ftpManager->get(QNetworkRequest(*m_ftpUrl));
|
|
|
|
|
|
connect(downloadReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError)));
|
|
|
|
|
|
connect(downloadReply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(downloadProgress(qint64,qint64)));
|
|
|
|
|
|
|
2023-04-14 19:30:30 +08:00
|
|
|
|
QEventLoop loop;
|
2023-10-19 14:15:31 +08:00
|
|
|
|
connect(downloadReply, SIGNAL(finished()), &loop, SLOT(quit()));
|
2023-04-14 19:30:30 +08:00
|
|
|
|
loop.exec();
|
|
|
|
|
|
}
|
2023-10-19 14:15:31 +08:00
|
|
|
|
|
|
|
|
|
|
void FtpClient::downloadProgress(qint64 byteSend, qint64 byteTotal)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
m_inputFile->write(downloadReply->read(byteSend));
|
|
|
|
|
|
qDebug() << byteSend << byteTotal << endl;
|
|
|
|
|
|
emit sigDownloadProcess(byteSend,byteTotal);
|
|
|
|
|
|
}
|
2024-09-11 16:37:00 +08:00
|
|
|
|
|
|
|
|
|
|
void FtpClient::uploadFile(const QString fileUrl, const QString filePath,const QString fileName,int type)
|
|
|
|
|
|
{
|
|
|
|
|
|
QNetworkAccessManager manager;
|
|
|
|
|
|
//QUrl url;
|
|
|
|
|
|
QUrl url(fileUrl);
|
|
|
|
|
|
/* 设置通讯协议 */
|
|
|
|
|
|
url.setScheme("ftp");
|
|
|
|
|
|
/* 设置用户名 */
|
|
|
|
|
|
url.setUserName("root");
|
|
|
|
|
|
/* 设置密码 */
|
|
|
|
|
|
url.setPassword("@#cidw!@123456");
|
|
|
|
|
|
|
|
|
|
|
|
/* 设置端口号,一般为21 */
|
|
|
|
|
|
url.setPort(21);
|
|
|
|
|
|
|
|
|
|
|
|
/* 装载本地文件 */
|
|
|
|
|
|
QFile file(filePath);
|
|
|
|
|
|
file.open(QIODevice::ReadOnly);
|
|
|
|
|
|
/* 读取本地文件数据 */
|
|
|
|
|
|
QByteArray data = file.readAll();
|
|
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
|
|
|
|
QNetworkRequest request(url);
|
|
|
|
|
|
/* 上传数据,上传成功后会在远端创建文件 */
|
|
|
|
|
|
QNetworkReply* reply = manager.put(request, data);
|
|
|
|
|
|
|
|
|
|
|
|
QEventLoop eventLoop;
|
|
|
|
|
|
QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
|
|
|
|
|
|
/* 进入等待,但事件循环依然进行 */
|
|
|
|
|
|
eventLoop.exec();
|
|
|
|
|
|
|
|
|
|
|
|
if (reply->error() != QNetworkReply::NoError) {
|
|
|
|
|
|
qDebug() << "Error: " << reply->errorString();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QJsonObject allObj,cmdBody,temp;
|
|
|
|
|
|
QJsonArray tempArray;
|
|
|
|
|
|
if(fileName.contains(".json")){
|
|
|
|
|
|
allObj.insert("cmd", "90");
|
|
|
|
|
|
temp["fileName"] = fileName;
|
|
|
|
|
|
if(type >= 0)
|
|
|
|
|
|
temp["content"] = type;
|
|
|
|
|
|
tempArray.append(temp);
|
|
|
|
|
|
allObj.insert("cmdBody",tempArray);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
allObj.insert("cmd", "46");
|
|
|
|
|
|
allObj.insert("type", type);
|
|
|
|
|
|
temp["fileName"] = fileName;
|
|
|
|
|
|
allObj.insert("cmdBody",temp);
|
|
|
|
|
|
}
|
|
|
|
|
|
qDebug() << allObj << endl;
|
|
|
|
|
|
QNetworkRequest req;
|
|
|
|
|
|
QString sUrl = QString("http://%1/cgi-bin/General.cgi/").arg(IP);
|
|
|
|
|
|
|
|
|
|
|
|
req.setUrl(sUrl);
|
|
|
|
|
|
g_NetMgr->PostJson(req,allObj);
|
|
|
|
|
|
}
|