(21)uniGUI for C++ builder下如何使用IdFTP发送文件
(中行雷威2018.9.8)
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群。)
【阅读倡议】
1、有问题请留言;
2、没问题请点赞;
3、看连载请加群;
4、下源码请加群;
【开发工具】
1、C++Builder10.2.3tokyo
2、FMSoft_uniGUI_Complete_Professional_1.10.0build1472(正版)
本例子将详细讲解如何使用IdFTP控件从web服务器的文件根目录下向一个ftp服务器发送文件。本教程的源代码请到我的QQ群共享文件A02-源代码里下载。
一、界面设计
在主界面摆放几个控件,用于设定目标FTP访问参数,再摆放一个UniEdit5用于设置要传送的文件名称,web文件默认根目录默认为项目下的D:\testIdFTP\Win32\Debug\files。再摆放一个UniBitBtn按钮用于连接、发送、断开FTP服务器,为显示传送进度,再放一个UniProgressBar控件。
二、功能实现
1、Main.h
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <uniGUIForm.hpp>
#include <uniGUIRegClasses.hpp>
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniEdit.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
#include "uniLabel.hpp"
#include "uniProgressBar.hpp"
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdFTP.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
#include "uniMemo.hpp"
//---------------------------------------------------------------------------
class TMainForm : public TUniForm
{
__published: // IDE-managed Components
TUniEdit *UniEdit1;
TUniEdit *UniEdit2;
TUniEdit *UniEdit3;
TUniEdit *UniEdit4;
TUniLabel *UniLabel1;
TUniLabel *UniLabel2;
TUniLabel *UniLabel3;
TUniLabel *UniLabel4;
TUniBitBtn *UniBitBtn1;
TIdFTP *IdFTP1;
TUniEdit *UniEdit5;
TUniLabel *UniLabel5;
TUniProgressBar *UniProgressBar1;
void __fastcall IdFTP1AfterPut(TObject *Sender);
void __fastcall IdFTP1Work(TObject *ASender, Idcomponent::TWorkMode AWorkMode, __int64 AWorkCount);
//此处需要增加指定Idcomponent::TWorkMode变量类型,与VCL程序不同
void __fastcall UniBitBtn1Click(TObject *Sender);
void __fastcall UniBitBtn2Click(TObject *Sender);
private: // User declarations
__int64 getSize,fileLength,fileHandle;//定义几个变量,分别为已经获取的文件大小、文件总大小、文件句柄
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
TMainForm *MainForm(void);
//---------------------------------------------------------------------------
#endif
2、Main.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop
#include "Main.h"
#include "MainModule.h"
#include "ServerModule.h" //添加包含头文件,引用web根目录时涉及
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniEdit"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "uniLabel"
#pragma link "uniProgressBar"
#pragma link "uniMemo"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm(void)
{
return( (TMainForm *)UniMainModule()->GetFormInstance(__classid(TMainForm)));
}
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void TA8EC7D05A50C4517AB0BD3119104CC9D__RegisterFormClass() {
Uniguivars::RegisterAppFormClass(__classid(TMainForm));
Uniguiregclasses::CPPInit();
}
#pragma startup TA8EC7D05A50C4517AB0BD3119104CC9D__RegisterFormClass
void __fastcall TMainForm::IdFTP1AfterPut(TObject *Sender)
{
//发送结束提示
UniProgressBar1->Position=0;//设置进度条颜色进度显示
UniProgressBar1->Text=String(0)+"%";//设置进度条文本进度显示
ShowMessageN("发送完毕!");
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::IdFTP1Work(TObject *ASender, Idcomponent::TWorkMode AWorkMode,
__int64 AWorkCount)
{
//FTP发送过程更新已经传送的文件长度
getSize=AWorkCount;//已经发送的字节数
UniSession->Synchronize();//刷新进度条显示
if(fileLength>0)
{
UniProgressBar1->Position=100*getSize/fileLength;
UniProgressBar1->Text=String(100*getSize/fileLength)+"%";
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//发送文件按钮
IdFTP1->Host=UniEdit1->Text;
IdFTP1->Port=UniEdit2->Text.ToInt();
IdFTP1->Username=UniEdit3->Text;
IdFTP1->Password=UniEdit4->Text;
IdFTP1->TransferTimeout=60000;//miliSecond
IdFTP1->ConnectTimeout=60000;
IdFTP1->ListenTimeout=10000;
IdFTP1->ReadTimeout=60000;
//求文件大小
fileHandle=FileOpen(UniServerModule()->FilesFolderPath+UniEdit5->Text,fmOpenRead);
fileLength=FileSeek(fileHandle,0,2);
FileClose(fileHandle);
if(!IdFTP1->Connected())
{
try
{
IdFTP1->Connect();
}
catch(...)
{
ShowMessage("链接FTP版本服务器失败!");
return;
}
}
//
IdFTP1->Passive=true;
//IdFTP1->Passive=false;
IdFTP1->TransferType=ftBinary;
//IdFTP1->TransferType=ftASCII;
IdFTP1->TransferMode(dmStream);
//IdFTP1->TransferMode(dmDeflate);
//IdFTP1->ChangeDir("\\");
//IdFTP1->ChangeDir("/");
UniProgressBar1->Position=0;//初始化进度条位置
UniProgressBar1->Text="0%";//初始化进度条显示
getSize=0;//初始化已经获取的大小
//
try
{
IdFTP1->Put(UniServerModule()->FilesFolderPath+UniEdit5->Text);//发送文件
//UniServerModule()->FilesFolderPath为web根目录D:\testIdFTP\Win32\Debug\files
}
catch(...)
{
ShowMessage("向FTP版本服务器发送文件失败!");
return;
}
//
try
{
IdFTP1->Disconnect();
}
catch(...)
{
}
}
三、运行效果
编译后访问http://127.0.0.1:8077,点击按钮,如果文件大小在10M内,片刻之后将提示“发送成功”,但是进度表根本不动作,为啥呢?因为你没有设置MainModule窗口的EnableSynchronousOperations=True,设置一下就大功告成了。