Delphi非常容易的实现FTP文件的上传与下载,搭建一个文档管理平台非常方便,可以将记录存储到数据库,文件存储在指定的目录中去。


Unit1;
interface
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,IdTCPClient, IdFTP;typeTForm1 = class(TForm)IdFTP1: TIdFTP;Button1: TButton;Memo1: TMemo;Edit1: TEdit;Button2: TButton;Label1: TLabel;Button3: TButton;OpenDialog1: TOpenDialog;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;const AStatusText: String);private{ Private declarations }public{ Public declarations }end;
varForm1: TForm1;
implementation
uses IdFTPList, IdFTPCommon;
{$R *.dfm}
{
本程序是一个ftp   demo程序,我用windows信息服务在本机建立了一个ftp服务,
本机IP:192.168.10.99
用户名:cc
密码:1
}
procedure TForm1.Button1Click(Sender: TObject);
vartr : Tstrings;
begin   //连接tr := TStringlist.Create;IdFTP1.Host := '192.168.10.99'; //FTP服务器地址IdFTP1.Username := 'user'; //FTP服务器用户名IdFTP1.Password := 'user'; //FTP服务器密码IdFTP1.Connect();   //连接到ftpEdit1.Text := IdFTP1.RetrieveCurrentDir;//得到初始目录IdFTP1.ChangeDir('client'); //进入到client子目录//IdFTP1.ChangeDir('..'); //回到上一级目录IdFTP1.List(tr); //得到client目录下所有文件列表Memo1.Lines.Assign(tr);tr.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
vartt :TIdFTPListItems;t : TIdFTPListItem;i : integer;tfname : String;
begin   //下载Label1.Caption := IdFTP1.DirectoryListing.Items[0].FileName;IdFTP1.TransferType := ftBinary; //指定为二进制文件   或文本文件ftASCIIfor i:=0 to IdFTP1.DirectoryListing.Count-1 dobegintt := IdFTP1.DirectoryListing; //得到当前目录下文件及目录列表t := tt.Items; //得到一个文件相关信息Label1.Caption :=t.Text;   //取出一个文件信息内容tfname := t.FileName;showmessage(t.OwnerName+'   '+t.GroupName+'   '+t.FileName+'   '+t.LinkedItemName);if IdFTP1.DirectoryListing.Items.ItemType = ditFile then //如果是文件beginIdFTP1.Get(tfname,'d:\FTPtest\'+tfname,True,True); //下载到本地,并为覆盖,且支持断点续传end;end;
end;
procedure TForm1.Button3Click(Sender: TObject);
varfi : string;
begin   //上传if OpenDialog1.Execute thenbeginfi := OpenDialog1.FileName;IdFTP1.Put('f:\测试文档样本.rar','测试文档样本.rar');//上传,end;
end;
procedure TForm1.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;const AStatusText: String);
begin{case   AStatus ofhsResolving   : showmessage('hsResolving');hsConnecting: showmessage('hsConnecting');hsConnected: showmessage('hsConnected');hsDisconnecting: showmessage('hsDisconnecting');hsDisconnected: showmessage('hsDisconnected');hsStatusText: showmessage('hsStatusText');  ftpTransfer: showmessage('文件传送完毕。');ftpReady: showmessage('准备传送文件....');ftpAborted: showmessage('传送失败');end;         }//showmessage(AStatusText);
end;
end.

实际操作中有可能调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。

ftp的passive模式

主要是不了解ftp的passive模式和port模式的区别。这里记录一下。

和passive模式对应的叫做port模式,也叫做standard模式,也叫主动模式。

每个ftp客户端和服务端建立连接需要建立两个连接,一个连接用于命令传输,一个连接用于数据传输。

命令传输不管主动模式还是被动模式,都是客户端主动连接服务端建立的。

但是数据传输就不同了。

主动模式的主动说的是服务端主动。当要进行数据传输的时候,客户端先向服务端告知一个端口,然后在客户端开启端口listen。由服务端主动连接这个端口,建立数据传输通道。

被动模式的被动说的也是服务端。当要进行数据传输的时候,服务端告知客户端一个端口,然后在服务端开启端口listen,由客户端主动连接这个端口,服务端被动接受连接,建立数据传输通道。

Port和Passive有什么不同
这两种连接方式最大的不同在于是否服务端主动发起连接。由于防火墙,安全等策略,很多情况下根本不允许服务端主动发起连接。所以在很多情况下会建议使用被动模式(Passive)。

被动模式就要求服务端开启端口,这个端口是可以指定的

MaxInstances 30
PassivePorts 8040 8070
这样就指定了同时允许有30个连接,其中的服务器开启的数据传输端口为8040 - 8070。

Delphi XE实现FTP上传下载文件相关推荐

  1. python get 下载 目录_python实现支持目录FTP上传下载文件的方法

    本文实例讲述了python实现支持目录FTP上传下载文件的方法.分享给大家供大家参考.具体如下: 该程序支持ftp上传下载文件和目录.适用于windows和linux平台. #!/usr/bin/en ...

  2. python上传本地文件到ftp_python实现的简单FTP上传下载文件实例

    本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env pyth ...

  3. android ftp同步程序,ftp同步 安卓,安卓手机ftp上传下载文件功能同步视频照片

    手机拍照越来方便,手机里的照片也越积越多,手机运行缓慢,本文利用安卓的每步FTP服务APP来自动实现手机视频照片的同步,释放手机被占用的存储空间.在机顶盒上运行每步FTP服务,机顶盒USB口连接U盘做 ...

  4. bat定时进行ftp上传下载文件

    bat进行ftp上传下载文件 参考文章: https://blog.csdn.net/yongzai666/article/details/86488761 背景: 由于公司某个系统原本硬盘损坏 , ...

  5. ftp上传-下载文件通用工具类,已实测

    话不多说直接上代码 package com.springboot.demo.utils;import lombok.extern.slf4j.Slf4j; import org.apache.comm ...

  6. java ftp上传文件_jaVA使用FTP上传下载文件的问题

    为了实现 FTP上传下载,大概试了两个方法 sun.net.ftp.FtpClient org.apache.commons.net 一开始使用sun.net.ftp.FtpClient,结果发现唯一 ...

  7. ftp上传下载文件详解

    首先导入包 import org.apache.commons.NET.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; FTPCli ...

  8. ftp: connect: 没有到主机的路由_Qt之FTP上传/下载文件操作

    ​一个简单的Ftp客户端文件上传/下载操作示例. 上传文件 QNetworkAccessManager manager; QUrl url; /* 设置通讯协议 */ url.setScheme(&q ...

  9. linux ftp上传下载文件,Linux下ftp命令上传下载文件

    命令行下连接ftp服务器 方式一: 默认端口 ftp hostname 方式二: 指定端口 [ec2-user@ip-99-240-80-144 ~]$ ftp ftp> open 99.240 ...

  10. ftp上传文件服务器报550错误_java ftp下载文件,Java 实现ftp上传下载文件

    最近项目中需要实现将文件先存放到ftp上,需要的时候再从ftp上下载,做的过程中碰到了问题,发现中文文件名的无法上传到ftp上,ftp上的中文文件名的文件下载不下来,几番折腾,终于搞定了,记录一下备忘 ...

最新文章

  1. 数据泄露报告称,1/5 的外部数据泄露事件涉及政府背景(附下载)
  2. pytorch 自定义参数不更新
  3. ARM的嵌入式Linux移植体验之操作系统
  4. openjdk_从CLI监视OpenJDK
  5. BGP——AS—PATH正则表达式(实列讲解+配置)
  6. POJ 2431 Expedition 优先队列
  7. Linux c开发工程师的面试题,C+工程师常见的面试题总结
  8. Leetcode每日一题:4.寻找两个有序数组的中位数
  9. ElementUI 按需引入坑爹的点记录
  10. java简单计算器课程设计_简单计算器JAVA课程设计
  11. 如何用Python实现电影售票系统
  12. WindRiver WorkBench创建、编译vxWorks APP工程
  13. html视频怎么改大小,对视频大小、比例进行修改
  14. 卡诺模型案例分析_通过KANO模型来协调优先级排序(附实例)
  15. java项目账户充值提现_充值和提现的业务流程是怎样的?
  16. 古剑奇谭显示服务器维修,《古剑奇谭网络版》角色转服功能说明公告
  17. 吃字母------线程同步与互斥的学习
  18. CornerNet Guassian radius高斯半径的确定-数学公式详解
  19. CAD网页Web端显示开发为什么要以WebGIS的思路来开发?
  20. CQOI2020 退役记

热门文章

  1. DevExpress WinForm控件入门指南——数据管理控件
  2. MySQL 官网下载各版本连接驱动
  3. 最适合Java初学者练手的项目【JavaSE项目-图书管理系统】
  4. firefox最新版的firebug、firepath功能替代
  5. visio 2010图形安装包
  6. C#租房管理系统(课程设计)
  7. MVpArms集成框架快速开发
  8. VB2010网络通信服务器
  9. 百度地图 城市中心点坐标
  10. 根据地理坐标查询地标 城市名称 街道名称 地标建筑