日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi XE实现FTP上传下载文件

發布時間:2023/12/9 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi XE实现FTP上传下载文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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上传下载文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。