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. java intent 传递集合对象_Intent之对象传递(Parcelable传递对象和对象集合)
  2. 9.QML Qt Quick Controls 2中常用的界面形式——并排式界面(SwipeView)
  3. 机器学习知识点(三十四)机器学习类学习资源
  4. Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集
  5. python opencv 录制视频_OpenCV Python 录制视频
  6. Java集合—HashMap底层原理
  7. IPC--三---共享内存
  8. dart系列之:dart优秀的秘诀-隔离机制
  9. Lintcode: Unique Paths
  10. scrapy框架的理解
  11. html5 客户端数据缓存机制,深入理解HTML5离线缓存机制
  12. 了解机器学习框架CoreML
  13. (20120731)Android中的各种对话框总结(dialog)
  14. babel-loader jsx SyntaxError:意外令牌[重复]
  15. c语言常用图形函数库,easyx安装过程及c语言常用图形库函数全解.ppt
  16. 今天又是一个全新的开始...
  17. 网页怎么看不到css,怎么查看网页的CSS代码?如何阅读?
  18. 还在为满意的渐变色发愁吗?10+个网站帮你解决烦恼
  19. 滴滴运营A/Btest城市运营分析
  20. 初中计算机ps教程,初中信息技术《Photoshop 初探——基本操作》教学设计

热门文章

  1. python3菜鸟教程
  2. mschart控件_使用MSChart控件绘制图表。
  3. “终端服务临时客户端许可证过期”的解决方法
  4. MVC架构下,使用NPOI读取.DOCX文档中表格的内容
  5. 手把手教你开发图片识别(QT篇)
  6. 怎么查看java的源码
  7. SketchUp最适用新手的二十多款SU插件
  8. nexus的下载与安装和启动
  9. 思考的乐趣:Matrix67数学笔记
  10. 预测大盘最准确的指标_通达信大盘预测指标,通达信副图指标,需要写一个关于大盘每日成交量的指标高手请进啊...