php 企业网站 后台图片上传免费源码大全无用下载
- 作者: 多梦笔记
- 时间: 2026年02月17日 09:41
当前位置: 首页 > news >正文
php 企业网站 后台图片上传,免费源码大全无用下载,四川建设公共查询平台,网页和网站做哪个好用吗一、前言 主要功能如下#xff1a; 1.实现文件夹的下载和删除#xff0c;网上很多资料都是单独对某个路径的文件操作的#xff0c;并不能对文件夹操作 2.实现目标机中含中文名称自动转码#xff0c;有些系统编码方式不同#xff0c;下载出来的文件会乱码 3.实现ftp功能…一、前言 主要功能如下 1.实现文件夹的下载和删除网上很多资料都是单独对某个路径的文件操作的并不能对文件夹操作 2.实现目标机中含中文名称自动转码有些系统编码方式不同下载出来的文件会乱码 3.实现ftp功能保活在正常使用时ftp如果挂载超过5分钟会自动断开 4.实现ftp复位重连ftp是官方在qt5舍弃的因为有bug登录失败时再次登录就会出现问题这里也是通过一些方法避免了这个问题每次登录可重新判断网络和账号密码信息 此资源为qt5.7的代码cpp文件和相关main函数和结构体定义h文件需要嵌入到自己的程序中修改一下类接口调用部分并不是一个独立的程序。只要你是真正的软件工程师10000000%能正常使用。 此资源中没有实现的功能如下 没有做上传功能因为项目没有使用用于数据存储设备定期通过软件导出硬盘下某个总数据的文件夹不同日期的数据修改起来会很简单同下载方式差不太多。 没有做目录的进入退出功能这个功能也很简单网上也有很多demo 二、环境 windows qt5.7 下载资源温馨提示有费用但是保值 三、正文 首先请看VCR哈哈 注意速度与网络环境有关网络条件差的当文件量特别多时可能会出现卡顿、延迟等现象 下面附上一些关键的核心代码 1.复位登录重连方法 //连接设备按键 void appdataoutput::on_btnConn_clicked() {//判断账号密码输入栏是否为空进行错误提示if(ui-lineEdit_name-text().isEmpty()||ui-lineEdit_passwd-text().isEmpty()){massage_dialog(1,提示,设备账户或密码不能为空,1,30);return;}resetFTP();//复位FTPclearControls();//清除信息//判断是否已经登录如果已经登录了就不需要重复登录if (m_ftp-state() ! QFtp::LoggedIn){ui-textEdit-append(————————);ui-textEdit-append(正在连接,请确保网络链路正常连通…);m_ftp-connectToHost(sIP, 21);//设置IP和端口m_ftp-login(ui-lineEdit_name-text(),ui-lineEdit_passwd-text());//登录账号密码}else if(m_ftp-state() ! QFtp::Connecting)massage_dialog(1,提示,已连接未登录,1,30);elsemassage_dialog(1,提示,已登录无需重复登录\n如有异常请退出重新进入,1,30); } //复位FTP void appdataoutput::resetFTP() {m_ftp-state();m_ftp-abort();m_ftp-deleteLater();m_ftp nullptr;m_ftp new QFtp(this);connect(m_ftp, SIGNAL(dataTransferProgress(qint64, qint64)),SLOT(S_upDateProgress(qint64, qint64))); // 进度条显示connect(m_ftp, SIGNAL(commandStarted(int)), this,SLOT(ftpCommandStarted(int))); //命令启动connect(m_ftp, SIGNAL(commandFinished(int, bool)),SLOT(ftpcommandFinish(int, bool))); //命令完成connect(m_ftp, SIGNAL(stateChanged(int)), this,SLOT(ftpStateChanged(int)));//状态改变connect(m_ftp, SIGNAL(listInfo(const QUrlInfo)), this,SLOT(addToList(const QUrlInfo))); // 添加文件项connect(m_ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));//完成 } 就是每次登录把之前的ftp关闭掉重新启动 2.保活方法 ///timer定时器初始化 ftp保活QTimer *time1new QTimer(this);time1-start(1201000);//2分钟执行一次不发送ftp命令 5分钟自动断开connect(time1,QTimer::timeout,{if(m_FTPconnectflag2){//判断是否连接成功QByteArray keepfileQDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss zzz).toLatin1();m_ftp-put(keepfile,toSpecialEncoding(m_keeppath));//向目标设备写入数据定期保持ftp活跃避免自动关闭qDebug()发送程序保活QString(keepfile);}}); 在初始化时创建定时器定时判断是否连接成功连接成功状态下定期向ftp中上传一个文件。 m_FTPconnectflag变量跟随ftp连接状态动态改变 3.编码中英文切换 //转码 从目标机器编码转window中文 QString ftpDownloadDir::fromSpecialEncoding(const QString inputStr) { #ifdef FTP_to_windowQTextCodec codec QTextCodec::codecForName(GBK);//UTF-8return codec-toUnicode(inputStr.toLatin1()); #elsereturn inputStr.toLatin1();//linux A40i连接需要使用此方式 #endif } //转码 从window中文转目标机器编码 QString ftpDownloadDir::toSpecialEncoding(const QString inputStr) { #ifdef FTP_to_windowQTextCodec* codec QTextCodec::codecForName(GBK);//UTF-8return QString::fromLatin1(codec-fromUnicode(inputStr)); #elsereturn QString::fromLatin1(QTextCodec::codecForName(UTF-8)-fromUnicode(inputStr));//linux A40i连接需要使用此方式 #endif } 在目标机中有的是gbk编码有的是utf8编码在window下面是utf8编码需要把ftp中读取的文件夹或文件含中文编码的转换为window能够识别的在进入目标机子目录使用cd命令时需要将中文在转回机器编码 4.文件夹遍历下载ftp操作函数 /FTP状态槽函数/ //进度条 void appdataoutput::S_upDateProgress(qint64 _used, qint64 _total) {auto percent (qreal)_used / _total * 100; // qDebug()QString(appdataoutput进度%1%).arg(QString::number(percent,f,2)); // ui-progressBar-setValue(percent); } //命令启动 void appdataoutput::ftpCommandStarted(int tem) { // qDebug()ftpCommandStartedm_ftp-currentCommand();if (m_ftp-currentCommand() QFtp::ConnectToHost) {ui-textEdit-append(【start】连接目标设备…);}if (m_ftp-currentCommand() QFtp::Login) {ui-textEdit-append(【start】登录目标设备…);}if (m_ftp-currentCommand() QFtp::Get) {ui-textEdit-append(【start】下载程序…);}if (m_ftp-currentCommand() QFtp::Put) { // ui-textEdit-append(【start】上传程序…);qDebug()【start】上传程序…;}if (m_ftp-currentCommand() QFtp::Remove) {ui-textEdit-append(【start】删除程序…);}if (m_ftp-currentCommand() QFtp::Close) {ui-textEdit-append(【start】关闭设备连接…);} } //ftp 连接状态更改 void appdataoutput::ftpStateChanged(int state) {if (state QFtp::Unconnected) {if(m_FTPconnectflag0)//FTP连接登录状态 0:未登录 1:连接成功 2登录成功ui-textEdit-append(【change】未连接目标设备请检查网络是否正常连接请检查目标设备FTP端口是否开启);else if(m_FTPconnectflag1)//FTP连接登录状态 0:未登录 1:连接成功 2登录成功ui-textEdit-append(【change】未登录目标设备请检查目标设备账号密码是否正确);else{ui-textEdit-append(【change】与目标设备连接断开);m_FTPconnectflag0;//FTP连接登录状态 0:未登录 1:连接成功 2登录成功}ui-btnConn-setEnabled(true);//使能连接按键ui-lineEdit_name-setEnabled(true);//使能用户名输入栏ui-lineEdit_passwd-setEnabled(true);//使能密码输入栏}if (state QFtp::HostLookup) {ui-textEdit-append(【change】正在查找目标设备);}if (state QFtp::Connecting) {ui-textEdit-append(【change】正在连接目标设备);}if (state QFtp::Connected) {ui-textEdit-append(【change】已经连接目标设备);}if (state QFtp::LoggedIn) {ui-textEdit-append(【change】已登录目标设备);}if (state QFtp::Closing) {ui-textEdit-append(【change】连接正在关闭);} } //命令完成 void appdataoutput::ftpcommandFinish(int tmp, bool error) {// 防止编译器对未使用变量的警告Q_UNUSED(tmp);//登录状态if (m_ftp-currentCommand() QFtp::ConnectToHost) {if (error) {ui-textEdit-append(QString(【finish】连接目标设备出现错误%1).arg(m_ftp-errorString()));}else {m_FTPconnectflag1;//FTP连接登录状态 0:未登录 1:连接成功 2登录成功ui-textEdit-append(【finish】连接目标设备成功);}}else if (m_ftp-currentCommand() QFtp::Login) {if (error) {ui-textEdit-append(QString(【finish】登录出现错误%1).arg(m_ftp-errorString()));}else {m_FTPconnectflag2;//FTP连接登录状态 0:未登录 1:连接成功 2登录成功ui-textEdit-append(【finish】登录目标设备成功可下载导出历史数据文件);ui-btnConn-setEnabled(false);//失能登录按键ui-lineEdit_name-setEnabled(false);//失能用户名输入栏ui-lineEdit_passwd-setEnabled(false);//失能密码输入栏m_ftp-cd(toSpecialEncoding(m_historypath));//进入到数据存储路径,否则在默认路径root文件夹下。进入路径后执行m_ftp-list()会多次进入addToList所以cd函数禁止放入在refreshed中}}else if (m_ftp-currentCommand() QFtp::Close){ui-textEdit-append(【finish】已经关闭目标设备连接);}//功能状态else if (m_ftp-currentCommand() QFtp::Get){if (error) {ui-textEdit-append(QString(【finish】下载出现错误%1).arg(m_ftp-errorString()));}else{ui-textEdit-append(【finish】已经完成下载);} // refreshed();}else if (m_ftp-currentCommand() QFtp::Put){if (error) { // ui-textEdit-append(QString(【finish】上传出现错误%1).arg(m_ftp-errorString()));qDebug()QString(【finish】上传出现错误%1).arg(m_ftp-errorString());m_ftp-abort();}else{ // ui-textEdit-append(【finish】已经完成上传);qDebug()【finish】已经完成上传;}}else if (m_ftp-currentCommand() QFtp::Rename){ui-textEdit-append(【finish】文件重命名成功); // refreshed();}else if (m_ftp-currentCommand() QFtp::Mkdir){ui-textEdit-append(【finish】新建文件夹成功); // refreshed();}else if (m_ftp-currentCommand() QFtp::Remove){ui-textEdit-append(【finish】程序文件删除成功); // refreshed();}else if (m_ftp-currentCommand() QFtp::Rmdir){ui-textEdit-append(【finish】文件夹删除成功); // refreshed();}else if (m_ftp-currentCommand() QFtp::Cd){if (error) {ui-textEdit-append(QString(【finish】进入目录出现错误%1).arg(m_ftp-errorString()));}else{ui-textEdit-append(【finish】进入目录成功);refreshed();}}else if (m_ftp-currentCommand() QFtp::List){if (error) {qDebug()QString(【finish】刷新目录出现错误%1).arg(m_ftp-errorString());}else{qDebug()QString(【finish】刷新目录成功);if(m_FTPconnectflag2){//判断ftp是否正常连接断开时不执行内部内容只有连接时才执行里面内容tableWidget_refuse(ui-tableWidget);//刷新表格//获取整个历史数据目录大小if(m_sata_status)//硬盘状态正常则获取硬盘数据总大小download_ftpdir(1,0,m_satapath,m_satahistorydir,);//查询根目录文件大小}}} } //完成ftp功能 void appdataoutput::ftpDone(bool error) {if(error){qDebug()QString(【Done】FTP操作出现错误%1).arg(m_ftp-errorString());}else{qDebug()QString(【Done】FTP操作完成);} } //刷新槽函数 void appdataoutput::addToList(const QUrlInfo urlInfo) {QString fileSize; // 用于存储文件大小根据文件大小字节设置文件在树列表的单位if (urlInfo.size() 0 urlInfo.size() 1024){fileSize QString::number(urlInfo.size()) Byte;}else if (urlInfo.size() 1024 urlInfo.size() 1024 * 1024){fileSize QString::number(urlInfo.size() / 1024.0, f, 2) KB;}else if (urlInfo.size() 1024 * 1024 urlInfo.size() 1024 * 1024 * 1024){fileSize QString::number(urlInfo.size() / 1024 / 1024.0, f, 2) MB;}else if (urlInfo.size() 1024 * 1024 * 1024){fileSize QString::number(urlInfo.size() / 1024 / 1024 / 1024.0, f, 2) GB;}QString dirurlInfo.isDir() ? 文件夹 : 文件;QString namefromSpecialEncoding(urlInfo.name());//转码中文需要根据系统区分编码qDebug()dirnamefileSizeurlInfo.lastModified().addSecs(3600*8).toString(yyyy-MM-dd hh:mm:ss)urlInfo.owner()urlInfo.group();//赋值逐项查询的列表信息HistoryList listdata;listdata.namefromSpecialEncoding(urlInfo.name());//转码将目标机的url编码转换为能够识别中文的编码 #ifdef FTP_to_windowlistdata.timeurlInfo.lastModified(); #elselistdata.timeurlInfo.lastModified().addSecs(3600*8); #endiflistdata.isdirurlInfo.isDir();//是否为文件夹true文件夹false文件listdata.numdir0;//文件夹数量若是文件夹后面会更新listdata.numfile1;//文件数量若是文件夹后面会更新listdata.allbyteurlInfo.size();//文件夹总大小 字节若是文件夹后面会更新listdata.timenewlistdata.time;//最新数据文件时间若是文件夹后面会更新if(dir文件){//文件直接显示查询的大小listdata.sizefileSize;m_satadata.append(listdata);//数据缓存等待list刷新完毕之后进入done函数刷新表格}else if((dir文件夹) (name!.) (name! ..)){//判断是文件夹计算大小 //目录.或..不刷新显示if(m_sata_status){//硬盘状态正常则获取硬盘数据总大小download_ftpdir(1,0,m_historypath,listdata.name,);//查询各个根目录下子文件大小listdata.size计算中…;}elselistdata.size硬盘错误;m_satadata.append(listdata);//数据缓存等待list刷新完毕之后进入done函数刷新表格}if(listdata.nameloop.sh){m_sata_statusfalse;//当路径搜索到loop.sh说明没有进入到硬盘路径进入到了默认的root路径ui-label_path-setText(数据存储路径m_historypath !!!路径异常经检查硬盘是否未安装或损坏);ui-textEdit-append(【刷新】硬盘识别失败未进入到硬盘路径请检查硬盘状态);}} 5.最核心的子ftp操作函数在父类ftp中要下载某个文件或文件夹将路径传入到此函数中会创建新的类开启新的ftp去执行某个文件或文件夹下面所有的文件下载删除等 //下载路径下的文件夹暂时只能下载文件夹内容。不能单独下载文件 //flag: 0:空闲 1:下载单个文件夹 2下载2个及以上文件夹 //mode: 0获取指定目录文件夹大小不下载 1下载指定目录文件夹到本机 2删除指定目录文件夹 3:下载指定文件 4删除指定文件 //path_MBJ 目标机源文件下载根目录 //固定不变 //dir_MBJ 要下载的源文件夹名称 //固定不变 //path_BJ 客户端保存路径 //固定不变 void appdataoutput::download_ftpdir(char flag,char mode,QString path_MBJ,QString dir_MBJ,QString path_BJ) {m_FTPdownloadflagflag;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹FtpItem dirdown;dirdown.ftpmodemode;//ftp工作模式 0获取指定目录文件夹大小不下载 1下载指定目录文件夹到本机dirdown.srcRootDirpath_MBJ;//目标机源文件下载根目录 //固定不变dirdown.srcDirNamedir_MBJ;//要下载的源文件夹名称 //固定不变dirdown.saveRootDirpath_BJ;//客户端保存路径 //固定不变QUrl ftpurl;//ftp的登录信息用于给独立的下载文件功能类提供登录信息ftpurl.setHost(sIP);ftpurl.setPort(21);ftpurl.setUserName(ui-lineEdit_name-text());ftpurl.setPassword(ui-lineEdit_passwd-text());dirdown.urlftpurl;//ftp登录信息ftpDownloadDir aaanew ftpDownloadDir(dirdown/,this*/);aaa-setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面则彻底释放资源aaa-downloadDir();//开始下载//下载进度下载操作才会返回connect(aaa,ftpDownloadDir::updateprogress,{//刷新实时返回的子文件项目进度ui-progressBar_now-setRange(0,bytesTotal);ui-progressBar_now-setValue(bytesSent);auto percent (qreal)bytesSent / bytesTotal * 100;ui-progressBar_now-setFormat(QString(%1%).arg(QString::number(percent,f,0)));});connect(aaa,ftpDownloadDir::updateprogress1,{//刷新当前下载项目的进度 刷新全部下载项目的进度//计算刷新当前下载项目的进度tableWidget_progress(ui-tableWidget,dir_MBJ,filenum);//更新表格文件大小内容//计算刷新全部下载项目的进度if(m_FTPdownloadflag1){//总体进度为单个文件夹int numberfilenum*100/m_download_filenum;ui-progressBar_all-setFormat(QString(%1%).arg(number));//设置显示ui-progressBar_all-setValue(number);//设置总体进度}else if(m_FTPdownloadflag2){//总体进度为多个文件int overnum0;for(int i0;im_satadata.size();i){//继续遍历寻找待下载文件夹if(m_satadata[i].downflag3){overnumm_satadata[i].numfile;}}int number(overnumfilenum)*100/m_download_filenum;ui-progressBar_all-setFormat(QString(%1%).arg(number));//设置显示ui-progressBar_all-setValue(number);//设置总体进度}});//下载完毕下载操作才会返回connect(aaa,ftpDownloadDir::downloaddone,{qDebug()downloaddone下载完毕:res.allsizieQString::number(res.allbyte)res.faildirpathlist;if(res.faildirpathlist.size()0){ui-listWidget-setVisible(true);//设置下载错误列表显示ui-listWidget-addItems(res.faildirpathlist);}QString printdownQString(【下载】文件/夹(%1),内部文件夹%2个,文件%3个,成功%4个,失败%5个,总大小%6(%7字节)).arg(dir_MBJ).arg(QString::number(res.numdir)).arg(QString::number(res.numfile)).arg(QString::number(res.iSeccessNum)).arg(QString::number(res.iFailNum)).arg(res.allsizie).arg(QString::number(res.allbyte));ui-textEdit-append(printdown);if(m_FTPdownloadflag1){//下载单个文件m_FTPdownloadflag0;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹massage_dialog(1,提示,QString(已下载(%1)数据文件).arg(dir_MBJ),1,30);}else if(m_FTPdownloadflag2){//下载2个及以上文件夹QStringList dirnamelist;dirnamelist.clear();for(int i0;im_satadata.size();i)dirnamelist.append(m_satadata[i].name);int numiddirnamelist.indexOf(dir_MBJ);//获取下载完毕的序号m_satadata[numid].downflag3;//下载队列 0不下载 1等待下载 2下载中 3下载完毕QCheckBox m_checkbox ui-tableWidget-findChildQCheckBox(t_checkBox_QString::number(numid));m_checkbox-setChecked(false);//下载完后取消选择for(int i0;im_satadata.size();i){//继续遍历寻找待下载文件夹if(m_satadata[i].downflag1){//有等待下载的m_satadata[i].downflag2;//下载队列 0不下载 1等待下载 2下载中 3下载完毕qDebug()下载数据m_satadata[i].name,下载到m_downpath;if(m_satadata[i].isdir)download_ftpdir(2,1,m_historypath,m_satadata[i].name,m_downpath);//下载文件夹else download_ftpdir(2,3,m_historypath,m_satadata[i].name,m_downpath);//下载文件break;//跳出循环只下载第一个符合条件的后续还有的话就等待下载完毕后判断状态循环下载}if(i(m_satadata.size()-1)){//判断最后一个数据仍然没退出循环则代表最后一个下载数据完毕qDebug()全部文件下载完毕;m_FTPdownloadflag0;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹QString allfilename;for(int j0;jm_satadata.size();j){if(m_satadata[j].downflag3){//获取所有下载完毕的文件名allfilename.append(m_satadata[j].name,);}}allfilenameallfilename.mid(0,allfilename.size()-1);//去掉最后一个 逗号for(int j0;jm_satadata.size();j)//清除下载队列m_satadata[j].downflag0;//下载队列 0不下载 1等待下载 2下载中 3下载完毕massage_dialog(1,提示,QString(已下载(%1)数据文件).arg(allfilename),1,30);}}}writeLog(printdown);//日志记录});//下载错误下载操作才会返回connect(aaa,ftpDownloadDir::downloadfailed,{qDebug()downloadfailed下载错误:;ui-textEdit-append(QString(【下载】错误连接断开));m_FTPdownloadflag0;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹writeLog(【下载】错误连接断开);//日志记录});//读取文件大小读取操作才会返回connect(aaa,ftpDownloadDir::downloadsize,{qDebug()downloadsize读取大小:res.allsizieQString::number(res.allbyte);if(dir_MBJm_satahistorydir){//判断是获取整个硬盘历史数据文件大小ui-progressBar_disk-setFormat(QString(%1(%2Byte)).arg(res.allsizie).arg(res.allbyte));ui-textEdit-append(QString(【刷新】硬盘数据大小%1(%2Byte)).arg(res.allsizie).arg(res.allbyte));}else{tableWidget_update(ui-tableWidget,dir_MBJ,res);//更新表格文件大小内容}m_FTPdownloadflag0;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹});//文件夹删除删除操作才会返回connect(aaa,ftpDownloadDir::deletedir,{qDebug()deletedir删除文件:dir_MBJ;ui-textEdit-append(QString(【删除】文件/夹(%1)).arg(dir_MBJ));massage_dialog(1,提示,QString(已删除(%1)数据文件).arg(dir_MBJ),1,30);m_FTPdownloadflag0;//FTP下载状态 0:空闲 1:下载单个文件 2下载2个及以上文件夹refreshed();//刷新writeLog(QString(【删除】文件/夹(%1)).arg(dir_MBJ));//日志记录}); } 这个函数不同的mode执行不同的功能对应的信号槽返回也不同有下载成功的有下载失败的有进度条的有删除的有获取大小的。 可以说appdataoutput就是主菜单ftpDownloadDir才是真正的功能操作。 四、结语 觉得有用的话就去下载吧
- 上一篇: php 家政网站深圳优秀网站建设公司
- 下一篇: php 企业网站多少钱wordpress 禁止缩略图
相关文章
-
php 家政网站深圳优秀网站建设公司
php 家政网站深圳优秀网站建设公司
- 站长
- 2026年02月17日
-
php 茶叶网站免费招商信息发布平台
php 茶叶网站免费招商信息发布平台
- 站长
- 2026年02月17日
-
php asp网站开发网站商品图片怎么做
php asp网站开发网站商品图片怎么做
- 站长
- 2026年02月17日
-
php 企业网站多少钱wordpress 禁止缩略图
php 企业网站多少钱wordpress 禁止缩略图
- 站长
- 2026年02月17日
-
php 网站301石家庄又开始封小区了
php 网站301石家庄又开始封小区了
- 站长
- 2026年02月17日
-
php 网站后台管理系统google网站搜索
php 网站后台管理系统google网站搜索
- 站长
- 2026年02月17日
