www.gusucode.com > QFTP传输 > QFTP_02_07.cpp

    #include "QFTP_02_07.h"
#include <stdio.h>
#include <stdlib.h>
#include <QTextStream>
#include <string>
#include <curl/curl.h>
#include <curl/easy.h>
#include <QInputDialog>
QFTP_02_07::QFTP_02_07(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	connect(ui.PBLoad, &QPushButton::clicked, this, &QFTP_02_07::LoadInfo);
	connect(ui.PBLoad, &QPushButton::clicked, this, &QFTP_02_07::ShowListOfFTP);
	connect(ui.PBQuit, &QPushButton::clicked, this, &QFTP_02_07::QUit);
	connect(ui.PBQuit, &QPushButton::clicked, this, &QFTP_02_07::ShowListOfFTP);
	//2s响应一次
	QTimer *timer=new QTimer(this);
	timer->start(2000);
	connect(timer, &QTimer::timeout, this, &QFTP_02_07::StateOfFTP);


}
int get_file_size(FILE *file)
{
	int size = 0;
	fseek(file, 0L, SEEK_END);
	size = ftell(file);
	fseek(file, 0L, SEEK_SET);
	return size;
}

CURL *curl_init()
{
	curl_global_init(CURL_GLOBAL_DEFAULT);
	CURL *curl = curl_easy_init();
	if (NULL == curl)
	{
		fprintf(stderr, "Init curl failed.\n");
		exit(1);
	}
	return curl;
}

void curl_set_upload_opt(CURL *curl, const char *url, const char *user_key, FILE *file)
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_READDATA, file);
	curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
	curl_easy_setopt(curl, CURLOPT_INFILESIZE, get_file_size(file));
	curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
	//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}

void curl_set_download_opt(CURL *curl, const char *url, const char *user_key, FILE *file)
{
	curl_easy_setopt(curl, CURLOPT_URL, url);
	curl_easy_setopt(curl, CURLOPT_USERPWD, user_key);
	curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
	//	curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
}

void curl_exit(CURL *curl)
{
	curl_easy_cleanup(curl);
	curl_global_cleanup();
}

size_t write_response(void *ptr, size_t size, size_t nmemb, void *data)
{

	FILE *writehere = (FILE *)data;
	return fwrite(ptr, size, nmemb, writehere);
}

CURLcode curl_perform(CURL *curl)
{
	CURLcode ret = curl_easy_perform(curl);
	if (ret != 0)
	{
		fprintf(stderr, "Perform curl failed.\n");
		curl_exit(curl);
		exit(1);
	}
	return ret;
}

void QFTP_02_07::LoadInfo()
{
	QString qstrtempMainFrame;
	if (!qstrtempMainFrame.isEmpty())
	{
		qstrtempMainFrame.clear();
	}
	mqstrUserName = ui.LEUserName->text().trimmed();
	mqstrPassWord = ui.LEPassword->text().trimmed();
	qstrtempMainFrame = ui.LEHost->text().trimmed();
	if (qstrtempMainFrame.contains("//")&&qstrtempMainFrame.contains(":"))
	{
		QStringList qlistF = qstrtempMainFrame.split("//");
		if (qlistF.size() == 2 && qlistF[1].contains(":"))
		{
			QStringList qlist = qlistF[1].split(":");
			mqstrHost = qlist[0];//  xxx.xx.xx.xxx
			mqstrPort = qlist[1];
		}
	}
	else
	{
		mqstrHost = ui.LEHost->text().trimmed();
		mqstrPort = ui.LEPort->text().trimmed();
	}
	ftp->connectToHost(mqstrHost, mqstrPort.toInt());
	mstrHost = ("ftp://"+mqstrHost+"/").toStdString();
	mstrUsername_Key = (mqstrUserName + ":" + mqstrPassWord).toStdString();
	ftp->login(mqstrUserName, mqstrPassWord);
}

void QFTP_02_07::QUit()
{
	ftp->close();
	mstrHost.clear();
	mstrUsername_Key.clear();
}

void QFTP_02_07::StateOfFTP()
{
	QString qstrState;
	switch (ftp->state())
	{
	case QFtp::Unconnected:
		qstrState = QString::fromLocal8Bit("没有连接到主机");
		break;
	case QFtp::HostLookup:
		qstrState = QString::fromLocal8Bit("正在进行主机名查找");
		break;
	case QFtp::Connecting:
		qstrState = QString::fromLocal8Bit("正在尝试连接到主机");
		break;
	case QFtp::Connected:
		qstrState = QString::fromLocal8Bit("已实现与主机的连接");
		break;
	case QFtp::LoggedIn:
		qstrState = QString::fromLocal8Bit("已实现连接和用户登录");
		break;
	case QFtp::Closing:
		qstrState = QString::fromLocal8Bit("正在关闭连接");
		break;
	default:
		break;
	}
	ui.statusBar->showMessage(qstrState, 200);

}

void QFTP_02_07::ShowListOfFTP()
{
	ui.treeWidget->clear();
	CURL *curl;
	CURLcode res;
	FILE *ftpfile;
	ftpfile = fopen("ftplist.txt", "wb"); //存储列表信息
	curl = curl_easy_init();
	if (curl&&mstrHost!="") {
		curl_easy_setopt(curl, CURLOPT_URL, mstrHost.c_str());
		curl_easy_setopt(curl, CURLOPT_USERPWD, mstrUsername_Key.c_str());
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
		res = curl_easy_perform(curl);
		/* Check for errors */
		if (res != CURLE_OK)
			fprintf(stderr, "curl_easy_perform() failed: %s\n",
			curl_easy_strerror(res));
		/* always cleanup */
		curl_easy_cleanup(curl);}
	fclose(ftpfile);
	QFile ftplist("ftplist.txt");
	while (!ftplist.open(QIODevice::ReadOnly))
	{
		return;
	}
	QTextStream QSin(&ftplist);
//	QSin.setCodec(QTextCodec::codecForName("utf-8"));//防止中文乱码
	while (!QSin.atEnd())
	{
		QString qstrA = QSin.readLine();
		qstrA.replace(QRegExp("[\\s]+"), " ");//把所有的多余的空格转为一个空格
		QStringList qlist = qstrA.split(" ");
		if (qlist.size()!=9||qlist[8].contains("..")||qlist[8]==".")
		{
			//QMessageBox::information(NULL, "ERROR", "", QMessageBox::Close);
		}
		else
		{
			QTreeWidgetItem *item = new QTreeWidgetItem;
			item->setText(0, qlist[8]);
			if (qlist[8].contains("."))
			{
				item->setText(1, qlist[4]);
			}
			else
			{
				item->setText(1, "");
			}
			item->setText(2,QString::number(Month_to_data(qlist[5]))+"/"+qlist[6]+" "+qlist[7]);
			item->setText(3, qlist[2]);
			ui.treeWidget->addTopLevelItem(item);
		}
	}
	ftplist.close();
	//清空文件
 	ftplist.open(QIODevice::Truncate);
	ftplist.close();
 	ftplist.open(QIODevice::WriteOnly);
 	ftplist.close();
	//contextMenuEvent( event);
}

void QFTP_02_07::contextMenuEvent(QContextMenuEvent *event)
{
	Q_UNUSED(event);  
	if (ui.treeWidget->topLevelItemCount()<0)
	{
		return;
	}
	QMenu menu;   
	menu.addAction(QString::fromLocal8Bit("下载"), this, &QFTP_02_07::downfile); 
	menu.addAction(QString::fromLocal8Bit("上传"), this, &QFTP_02_07::upfile);
	menu.addAction(QString::fromLocal8Bit("新建文件夹") , this, &QFTP_02_07::newDir);
	menu.addAction(QString::fromLocal8Bit("打开文件夹"), this, &QFTP_02_07::opendir);
	menu.addAction(QString::fromLocal8Bit("重命名"), this, &QFTP_02_07::refilename);
 	menu.addAction(QString::fromLocal8Bit("删除文件"), this, &QFTP_02_07::removefile);
 	menu.addAction(QString::fromLocal8Bit("刷新"), this, &QFTP_02_07::ShowListOfFTP);
	menu.addAction(QString::fromLocal8Bit("返回上一级"), this, &QFTP_02_07::back);
	menu.exec(QCursor::pos());
}

void QFTP_02_07::newDir()
{
	QString dirname = QInputDialog::getText(NULL, QString::fromLocal8Bit("新建文件夹"), QString::fromLocal8Bit("输入新文件夹名称,仅支持英文"));
	if (mqstrNowpath == "")
	{
		ftp->mkdir(dirname);
	}
	else
	{
		ftp->cd(mqstrNowpath);
		ftp->mkdir(dirname);
	}
	QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);
}

void QFTP_02_07::refilename()
{
	pCurrentItem = ui.treeWidget->currentItem();
	QString oldname = pCurrentItem->text(0);
	QString newname = QInputDialog::getText(NULL, QString::fromLocal8Bit("重命名"), QString::fromLocal8Bit("输入新名称,仅支持英文"));
	if (oldname.contains("."))
	{
		QStringList qlist = oldname.split(".");
		if (mqstrNowpath == "")
		{
			ftp->rename(oldname, newname + "." + qlist[qlist.size() - 1]);
		}
		else
		{
			ftp->cd(mqstrNowpath);
			ftp->rename(oldname, newname + "." + qlist[qlist.size() - 1]);
		}
	}
	else
	{
		if (mqstrNowpath == "")
		{
			ftp->rename(oldname, newname);
		}
		else
		{
			ftp->cd(mqstrNowpath);
			ftp->rename(oldname, newname);
		}
	}
	QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);

}


void QFTP_02_07::removefile()
{
	pCurrentItem = ui.treeWidget->currentItem();
	QString qstra = pCurrentItem->text(0);
	if (!qstra.contains("."))
 	{
	 		ftp->cd(mqstrNowpath);
	 		ftp->rmdir(qstra);
 	}
	if (mqstrNowpath=="")
	{
		ftp->remove(qstra);
	}
	else
	{
		ftp->cd(mqstrNowpath);
		ftp->remove(qstra);
	}
QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);
}

void QFTP_02_07::opendir()
{
	pCurrentItem = ui.treeWidget->currentItem();
	QString qstra = pCurrentItem->text(0);
	if (qstra.contains("."))
	{
		return;
	}
	else
	{
		mqstrNowpath =mqstrNowpath+ "/" + qstra;
		mstrHost = mstrHost + (qstra+"/").toStdString();
	}
	QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);
}

void QFTP_02_07::back()
{
	if (mqstrNowpath=="")
	{
		return;
	}
	else
	{
		QStringList qlistpath=mqstrNowpath.split("/");
		QString qstrnewpath = "";
		for (int i=1;i<qlistpath.size()-1;i++)
		{
			qstrnewpath = qstrnewpath+"/" + qlistpath[i];
		}
		mqstrNowpath = qstrnewpath;
		mstrHost = ("ftp://" + mqstrHost + qstrnewpath + "/").toStdString();
	}
	QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);
}

void QFTP_02_07::downfile()
{
	pCurrentItem = ui.treeWidget->currentItem();
	QString qstra = pCurrentItem->text(0);
	if (!qstra.contains("."))
	{
		return;
	}
	QString savefilename = QFileDialog::getSaveFileName(this, tr("Save File"),qstra);
	QByteArray csavefilename = savefilename.toLocal8Bit();
	QByteArray cqstra = qstra.toLocal8Bit();
	std::string  strsavefile = std::string(csavefilename);
	std::string strdownfilepath = mstrHost + std::string(cqstra);
	FTP_OPT ftp_down;
	ftp_down.url = (char*)strdownfilepath.c_str();
	ftp_down.user_key = (char*)mstrUsername_Key.c_str();
	ftp_down.file = (char*)strsavefile.c_str();
	if (FTP_DOWNLOAD_SUCCESS == ftp_download(ftp_down))
		QMessageBox::information(NULL, QString::fromLocal8Bit("下载"), QString::fromLocal8Bit("下载完成"), QMessageBox::Ok);
	
}

 void QFTP_02_07::upfile()
 {
 	QString upfilename = QFileDialog::getOpenFileName(this, tr("Open file"));
 	QStringList qlist = upfilename.split("/");
 	QString qstra = qlist[qlist.size() - 1];
	QByteArray csupfilename = upfilename.toLocal8Bit();
	QByteArray cqstra = qstra.toLocal8Bit();
 	std::string strupfilepath = mstrHost + std::string(cqstra);
 	std::string strupfilename = std::string(csupfilename);
 	FTP_OPT ftp_up;
 	ftp_up.url = (char*)strupfilepath.c_str();
 	ftp_up.user_key = (char*)mstrUsername_Key.c_str();
 	ftp_up.file = (char*)strupfilename.c_str();
 	if (FTP_UPLOAD_SUCCESS == ftp_upload(ftp_up))
 		QMessageBox::information(NULL, QString::fromLocal8Bit("上传"), QString::fromLocal8Bit("上传成功"), QMessageBox::Ok);
	QTimer::singleShot(100, this, &QFTP_02_07::ShowListOfFTP);
 }

FTP_STATE ftp_upload(const FTP_OPT ftp_option)
{
	FTP_STATE state;
	CURL *curl;;
	FILE *fp = fopen(ftp_option.file, "rb");
	if (NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

	curl = curl_init();
	curl_set_upload_opt(curl, ftp_option.url, ftp_option.user_key, fp);
	if (CURLE_OK == curl_perform(curl))
		state = FTP_UPLOAD_SUCCESS;
	else
		state = FTP_UPLOAD_FAILED;

	curl_exit(curl);
	fclose(fp);
	return state;
}

FTP_STATE ftp_download(const FTP_OPT ftp_option)
{
	FTP_STATE state;
	CURL *curl;
	FILE *fp = fopen(ftp_option.file, "wb");
	if (NULL == fp)
	{
		fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
		return FTP_UPLOAD_FAILED;
	}

	curl = curl_init();
	curl_set_download_opt(curl, ftp_option.url, ftp_option.user_key, fp);
	if (CURLE_OK == curl_perform(curl))
		state = FTP_DOWNLOAD_SUCCESS;
	else
		state = FTP_DOWNLOAD_FAILED;

	curl_exit(curl);
	fclose(fp);
	return state;
}

int Month_to_data(QString str)
{
	QString qstrA; 
	QStringList qlist = { "Jua", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
	for (int i=0;i<qlist.size();i++)
	{
		if (str==qlist[i])
		{
			return i + 1;
		}
	}
	return -1;
}