3500/ftpclient.cpp

261 lines
8.2 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ftpclient.h"
#include <QEventLoop>
#include "NetMgr.h"
#include <QJsonArray>
#include <QJsonObject>
#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<QJsonObject>();
if(objec.contains("cmd"))
{
QJsonValue arrays_value = objec.take("cmd");
qDebug()<<"cmd ="<<arrays_value.toString();
if(arrays_value.toString() == "90" || arrays_value.toString() == "46" )
{
bool Status = objec.take("success").toBool();
QString strMessage = objec.take("message").toString();
if(Status){
sigReplyStatus(1);
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
}else{
QMessageBox::information(this, QStringLiteral("提示"), strMessage);
sigReplyStatus(0);
}
}
}
}
void FtpClient::finished(QNetworkReply* reply)
{
QNetworkReply::NetworkError error = reply->error();
qDebug() << "finished" << error <<endl;
delete m_ftpUrl;
m_ftpUrl = NULL;
if(m_fileName != ""){
//QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("保存成功!"));
QJsonObject allObj,cmdBody,temp;
QJsonArray tempArray;
if(m_fileName.contains(".json")){
allObj.insert("cmd", "90");
temp["fileName"] = m_fileName;
if(m_Type >= 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);
}