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; }