(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-源代码里下载。

一、界面设计

(21)uniGUI for C++ builder下如何使用IdFTP发送文件

在主界面摆放几个控件,用于设定目标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,设置一下就大功告成了。