#include "ftpclient.h" #include #include "NetMgr.h" #include #include #include "global.h" FtpClient *g_FtpClient = NULL; FtpClient::FtpClient(QWidget *parent) : QWidget(parent) { m_ftpManager = new QNetworkAccessManager(this); m_inputFile = NULL; m_fileName = ""; m_Type = -1; //connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*))); 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 */) { m_ftpManager->disconnect(SIGNAL(finished(QNetworkReply*))); connect(m_ftpManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*))); //connect(m_ftpManager, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError))); m_ftpUrl = new QUrl(fileAddr); m_ftpUrl->setPort(Port); } void FtpClient::slotNetMgr(QString sAddr, const QVariant &msg) { QJsonObject objec = msg.value(); if(objec.contains("cmd")) { QJsonValue arrays_value = objec.take("cmd"); qDebug()<<"cmd ="<error(); qDebug() << "finished" << error <= 0) temp["content"] = m_Type; tempArray.append(temp); allObj.insert("cmdBody",tempArray); }else{ allObj.insert("cmd", "46"); allObj.insert("type", m_Type); temp["fileName"] = m_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); m_fileName = ""; m_Type = -1; //QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!")); } if(m_inputFile != NULL) { emit sigDownloadStatus(); m_inputFile->flush(); m_inputFile->close(); delete m_inputFile; m_inputFile = NULL; downloadReply->deleteLater(); 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; case QNetworkReply::ContentNotFoundError: QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("文件不存在!")); break; default: QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("异常错误")); break; } } void FtpClient::UpLoadFile(const QString fileSource, const QString fileName,int type) { if(fileSource.isEmpty()) { return; } m_fileName = fileName; m_Type = type; QFile file(fileSource); if(!file.exists()) { QMessageBox::warning(this, QStringLiteral("警告"), QStringLiteral("上传的文件不存在")); return; } customLogMessageHandler(QtDebugMsg,fileName); 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); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(CheckReplyStatus(QNetworkReply::NetworkError))); QEventLoop loop; connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); reply->deleteLater(); file.close(); } void FtpClient::DownLoad(const QString fileSource, const QString fileDest) { if(fileSource.isEmpty() || fileDest.isEmpty()) { return; } 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); 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))); QEventLoop loop; connect(downloadReply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); } void FtpClient::downloadProgress(qint64 byteSend, qint64 byteTotal) { m_inputFile->write(downloadReply->read(byteSend)); qDebug() << byteSend << byteTotal << endl; emit sigDownloadProcess(byteSend,byteTotal); } 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); }