Ⅰ delphi ftp下載文件問題
Delphi FTP例子源碼
unit TransferThread;
////////////////////////////////////////////////////////////////////////////////
// 模塊說明: FTP傳輸核心模塊類
// 功能: 指定一個下載(上傳)的日期或文件名,系統執行傳輸功能(支持續傳)
// 備註:該模塊屬於傳輸類的一個子線程模塊.
////////////////////////////////////////////////////////////////////////////////
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ComCtrls,StdCtrls,IniFiles,IdIntercept, IdLogBase, IdLogEvent, IdAntiFreezeBase,
IdAntiFreeze, IdFTPList,IdBaseComponent,IdGlobal,IdComponent, IdTCPConnection, IdTCPClient,IdFTPCommon,
IdFTP;
type
TTransferThread = class(TObject)
private
{ Private declarations }
//進度顯示
FProgressbar:TProgressbar;
//上傳核心組件
FFTP:TIdFTP;
//上傳列表內部類
FCombobox:TCombobox;
//上傳信息顯示
FLabel:TLabel;
//FTP地址
FFTP_STR_HOST:String;
//FTP用戶名
FFTP_STR_USN:String;
//FTP用戶密碼
FFTP_STR_PWD:String;
//FTP埠
FFTP_STR_PORT:String;
//FTP上傳標記
FFTP_STR_UTAG:String;
//FTP下載標記
FFTP_STR_DTAG:String;
//FTP指定的文件夾
FFTP_STR_FLODER:STring;
//傳輸文件大小
FFTP_LWD_BYTES:LongWord;
//傳輸開始時間
FFTP_DT_BEGINTIME:TDateTime;
//傳輸速度
FFTP_DUB_SPEED:Double;
//是否刪除源文件.
FFTP_BOL_DEL:Boolean;
//是否正在傳輸文件
FFTP_BOL_ISTRANSFERRING:Boolean;
//類內部通用對話框函數
function MsgBox(Msg:string;iValue:integer):integer;
//獲取用戶當前的Windows臨時文件夾
function GetWinTempPath:String;
//根據日期生成的日期文件名
function DateToFileName(DateTime:TDateTime):String;
//根據上傳/下載標記生成完整的文件名
function GetFileFullName(sTag:String;DateTime:TDateTime):String;
protected
//傳輸核心函數
function TransferKernel(iTag:Integer;sFile:string;bDelSFile:boolean=False):boolean;
//傳輸組件的WorkBegin事件
procere FFTPOnWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
//傳輸組件的WorkEnd事件
procere FFTPOnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
//傳輸組件的Work事件
procere FFTPOnWork(Sender: TObject; AWorkMode: TWorkMode;const AWorkCount: Integer);
public
//構造函數
constructor Create;
//析構函數
destructor Destroy;
//進度條控制項屬性
property Progressbar:TProgressbar read FProgressbar write FProgressbar default nil;
//列表控制項屬性
property Combobox:TCombobox read FCombobox write FCombobox default nil;
//只讀的FTP核心組件
property FTP:TidFTP read FFTP;
//標簽控制項
property oLabel:TLabel read FLabel write FLabel default nil;
//列表方法(該方法需要指定Combobox,否則無效)
procere List;
//依據日期下載文件
procere DownLoad(dDate:TDateTime);overload;
//依據文件名下載文件
procere DownLoad(sFileName:String);overload;
//依據日期上傳文件
procere UpLoad(dDate:TDateTime);overload;
//依據文件名上傳文件
procere UpLoad(sFileName:String);overload;
// procere Execute; override;
end;
implementation
constructor TTransferThread.Create;
var
FFini:TIniFile;
FFilePath:String;
begin
//完成FTP相關參數的讀取.
FFTP_BOL_ISTRANSFERRING:=False;
Try
FFilePath:=ExtractFilePath(APPlication.exeName)+'setup.ini';
FFini:=TIniFile.Create(FFilePath);
FFTP_STR_HOST:=FFini.ReadString('文件傳輸','伺服器地址','');
FFTP_STR_PORT:=FFini.ReadString('文件傳輸','伺服器埠','');
FFTP_STR_USN:=FFini.ReadString('文件傳輸','用戶名','');
FFTP_STR_PWD:=FFini.ReadString('文件傳輸','密碼','');
FFTP_STR_FLODER:=FFini.ReadString('文件傳輸','文件夾','');
FFTP_STR_UTAG:=FFini.ReadString('文件傳輸','上傳標識碼','');
FFTP_STR_DTAG:=FFini.ReadString('文件傳輸','上傳標識碼','');
FFTP_BOL_DEL:=FFini.ReadBool('文件傳輸','刪源文件',FALSE);
FFIni.Free;
Except
MsgBox('讀取FTP連接配置信息失敗!請檢查您的Setup.ini文件.',MB_OK+MB_ICONERROR);
Exit;
Abort;
End;
//設置FTP相關參數
Try
FFTP:=TIdFTP.Create(nil);
FFTP.Host:=FFTP_STR_HOST;
FFTP.Port:=strtoint(FFTP_STR_PORT);
FFTP.UserName:=FFTP_STR_USN;
FFTP.Password:=FFTP_STR_PWD;
FFTP.TransferType:=ftASCII;
//事件驅動
FFTP.OnWork:=FFTPOnWork;
FFTP.OnWorkBegin:=FFTPOnWorkBegin;
FFTP.OnWorkEnd:=FFTPOnWorkEnd;
FFTP.Connect(True,-1);
Except
MsgBox('連接遠程FTP伺服器失敗!'#10#13'1.伺服器地址錯誤,或伺服器不可用.'#10#13'2.用戶名或密碼不正確.'#10#13'3.FTP服務埠設置不正確.',MB_OK+MB_ICONERROR);
Exit;
Abort;
End;
end;
function TTransferThread.DateToFileName(DateTime: TDateTime): String;
var
Year, Month, Day:Word;
sYear,sMonth,sDay:String;
begin
DecodeDate(DateTime, Year, Month, Day); //日期
sYear:=inttostr(Year);
sMonth:=inttostr(Month);
sDay:=inttostr(Day);
//年
case Length(sYear) of
4: sYear:=sYear;
3: sYear:='0'+sYear;
2: sYear:='00'+sYear;
1: sYear:='000'+sYear;
else
sYear:='';
end;
//月
case Length(sMonth) of
2: sMonth:=sMonth;
1: sMonth:='0'+sMonth;
else
sMonth:='';
end;
//日
case Length(sDay) of
2: sDay:=sDay;
1: sDay:='0'+sDay;
else
sDay:='';
end;
if (sYear='') or (sMonth='') or (sDay='') then
begin
Result:='';
Exit;
end;
if (sYear<>'') and (sMonth<>'') and (sDay<>'') then
begin
Result:=sYear+sMOnth+sDay;
end;
end;
destructor TTransferThread.Destroy;
begin
FProgressbar:=nil;
FCombobox:=nil;
FLabel:=nil;
FFTP.Quit;
FFTP.Free;
end;
procere TTransferThread.DownLoad(dDate: TDateTime);
begin
if Not FFTP_BOL_ISTRANSFERRING then
begin
TransferKernel(1,GetFileFullName(FFTP_STR_DTAG,dDate),FFTP_BOL_DEL);
end;
end;
procere TTransferThread.DownLoad(sFileName: String);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(1,sFileName,FFTP_BOL_DEL);
end;
procere TTransferThread.FFTPOnWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
var
S,E: String;
H, M, Sec, MS: Word;
TotalTime: TDateTime;
DLTime: Double;
begin
TotalTime := Now - FFTP_DT_BEGINTIME; //總用時
DecodeTime(TotalTime, H, M, Sec, MS); //取出時\分\秒\毫秒
Sec := Sec + M * 60 + H * 3600; //轉換成秒
DLTime := Sec + MS / 1000; //最終的下載時間
E:= Format(' 使用時間:%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);
if DLTime > 0 then
//每秒的平均速度:XX K/s
FFTP_DUB_SPEED := {(AverageSpeed + }(AWorkCount / 1024) / DLTime{) / 2};
if FFTP_DUB_SPEED > 0 then
begin
Sec := Trunc(((FFTP_LWD_BYTES - AWorkCount) / 1024) / FFTP_DUB_SPEED);
S := Format(' 剩餘時間:%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);
S:='速度: ' + FormatFloat('0.00 KB/秒',FFTP_DUB_SPEED) + S + E ;
end
else
S:='';
if (FLabel<>nil) and (assigned(FLabel)) then
begin
FLabel.AutoSize:=True;
FLabel.Caption:=S;
FLabel.Update;
end;
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
FProgressBar.Position:=AWorkCount; //進度顯示
FProgressBar.Update;
end;
end;
procere TTransferThread.FFTPOnWorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
FFTP_BOL_ISTRANSFERRING:=True;
FFTP_DT_BEGINTIME:=Now; //開始時間
FFTP_DUB_SPEED:=0.0; //初始化速率
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
if AWorkCountMax>0 then
begin
FProgressBar.Max:=AWorkCountMax;
FFTP_LWD_BYTES:=FProgressBar.Max;
end
else
FProgressBar.Max:=FFTP_LWD_BYTES;
end;
end;
procere TTransferThread.FFTPOnWorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
FFTP_BOL_ISTRANSFERRING:=False;
FFTP_DUB_SPEED:=0.00;
if (FLabel<>nil) and (assigned(FLabel)) then
begin
FLabel.AutoSize:=True;
FLabel.Caption:='';
FLabel.Update;
end;
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
FProgressBar.Position:=0;
end;
end;
function TTransferThread.GetFileFullName(sTag:String;DateTime:TDateTime):String;
begin
Result:=sTag+DateToFileName(DateTime)+'FD.HXD';
end;
function TTransferThread.GetWinTempPath: String;
var
TempDir:array [0..255] of char;
begin
GetTempPath(255,@TempDir);
Result:=strPas(TempDir);
end;
procere TTransferThread.List;
var
Dir_List:TStringList;
FoundFolder:Boolean;
iCount:Integer;
begin
if (FCombobox=nil) or (Not Assigned(FCombobox)) then
begin
Exit;
Abort;
end;
Dir_List:=TStringList.Create; //創建字元串列表類
Try
if Not FFTP.Connected then FFTP.Connect;
FFTP.ChangeDir('/');//根目錄 //到伺服器的根目錄
FFTP.List(Dir_List,'',True); //獲取目錄列表
FoundFolder:=False;
FFTP.TransferType:=ftASCII; //更改傳輸類型(ASCII類型)
for iCount:=0 to Dir_List.Count-1 do
begin
if FFTP.DirectoryListing.Items[iCount].ItemType=ditDirectory then
begin
if Dir_List.IndexOf(FFTP_STR_FLODER)= -1 then //判斷該文件夾不存在
begin
//如果不存繼續循環查找.
Continue;
end
else
begin
//如果存在,則直接退出循環
FoundFolder:=True;
Break;
end;
end;
end;
if FoundFolder then //判斷該文件夾不存在
begin
FFTP.MakeDir(FFTP_STR_FLODER); //不存在,則創建一個新的文件夾
end;
FFTP.ChangeDir(FFTP_STR_FLODER);
FFTP.List(Dir_List,'*.HXD',False);
if Dir_List.Count>0 then
begin
FCombobox.Items:=Dir_List;
end;
Finally
Dir_List.Free;
End;
end;
function TTransferThread.MsgBox(Msg: string; iValue: integer): integer;
begin
Result:=MessageBox(application.Handle,pChar(Msg),'系統信息',iValue+MB_APPLMODAL);
end;
function TTransferThread.TransferKernel(iTag: Integer; sFile: string;
bDelSFile: boolean): boolean;
var
sTmpPath:String;
Dir_List:TStringList;
FoundFolder:Boolean;
iCount:Integer;
begin
sTmpPath:=GetWinTempPath; //獲取本地系統臨時目錄
Dir_List:=TStringList.Create; //創建字元串列表類
Try
if Not FFTP.Connected then FFTP.Connect;
FFTP.ChangeDir('/');//根目錄 //到伺服器的根目錄
FFTP.TransferType:=ftASCII; //更改傳輸類型(ASCII類型)
FFTP.List(Dir_List,'',True); //獲取目錄列表
FoundFolder:=False;
for iCount:=0 to Dir_List.Count-1 do
begin
if FFTP.DirectoryListing.Items[iCount].ItemType=ditDirectory then //是目錄
begin
if Dir_List.IndexOf(FFTP_STR_FLODER)= -1 then //判斷該文件夾不存在
begin
//如果不存繼續循環查找.
Continue;
end
else
begin
//如果存在,則直接退出循環
FoundFolder:=True;
Break;
end;
end;
end;
if FoundFolder then //判斷該文件夾不存在
begin
FFTP.MakeDir(FFTP_STR_FLODER); //不存在,則創建一個新的文件夾
end;
//更改傳輸類型
FFTP.TransferType:=ftBinary;
Try
//找到相應的目錄,則更換路徑.
FFTP.ChangeDir(FFTP_STR_FLODER);
//0為上傳
if iTag=0 then
begin
Try
FFTP.Put(sTmpPath+sFile,sFile);
Except
MsgBox('上傳文件失敗!原因如下:'#13#10'1.伺服器沒有開啟寫文件的許可權!'#10#13'2.程序發生異常,請重新上傳!',MB_OK+MB_ICONERROR);
Abort;
End;
FFTP_LWD_BYTES:=FFTP.Size(sFile);
if bDelSFile then //刪除本地源文件
begin
DeleteFile(sTmpPath+sFile);
end;
Result:=True;
FFTP.Disconnect;
end;
//1為下載
if iTag=1 then
begin
//文件已經存在
Try
FFTP_LWD_BYTES:=FFTP.Size(sFile);
if FileExists(sTmpPath+sFile) then
begin
case MsgBox('文件已經存在,要續傳嗎?'#13#10'是--續傳'#10#13'否--覆蓋'#13#10'取消--取消操作',MB_YESNOCANCEL+MB_ICONINFORMATION) of
IDYES: begin
FFTP_LWD_BYTES:=FFTP_LWD_BYTES-FileSizeByName(sTmpPath+sFile);
//參數說明: 源文件,目標文件,是否覆蓋,是否觸發異常(True為不觸發)。
FFTP.Get(sFile,sTmpPath+sFile,False,True);
end;
IDNO: begin
FFTP.Get(sFile,sTmpPath+sFile,True);
end;
IDCANCEL:
begin
FFTP_BOL_ISTRANSFERRING:=False;
end;
end;
end
else //文件不存在
begin
FFTP.Get(sFile,sTmpPath+sFile,True);
end;
Except
MsgBox('上傳文件失敗!原因如下:'#13#10'1.伺服器沒有開啟寫文件的許可權!'#10#13'2.程序發生異常,請重新上傳!',MB_OK+MB_ICONERROR);
Abort;
End;
if bDelSFile then //刪除遠程源文件
begin
FFTP.Delete(sFile);
end;
FFTP.Disconnect;
end;
Except
FFTP.Quit;
Result:=False;
End;
Finally
Dir_List.Free;
End;
end;
procere TTransferThread.UpLoad(dDate: TDateTime);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(0,GetFileFullName(FFTP_STR_DTAG,dDate),FFTP_BOL_DEL);
end;
procere TTransferThread.UpLoad(sFileName: String);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(0,sFileName,FFTP_BOL_DEL);
end;
end.
Ⅱ FTP加密傳輸基本概念
所謂道高一尺魔高一丈,萬一公鑰在發送給瀏覽器的路上被劫持然後偷換了呢?偷換公鑰後,瀏覽器發送的數據伺服器肯定是沒法解密的,但是可以被偷換公鑰的壞人解密,因為他有這個假公鑰對應的私鑰啊。這就會導致敏感信息——比如最常下手的就是銀行賬號的密碼——被壞人掌握,然後造成不必要的損失。
為了解決這個問題,就搞出來一個SSL證書的認證。就是瀏覽器收到公鑰後先去這些收錢的認證機構確認一下,具體就是把公鑰算一個hash值,然後跟收錢機構登記的hash值對比一下,一樣那就沒被篡改,如果不一樣就說明你的電腦需要安殺毒軟體或者換一個wifi了。
Ⅲ delphi7 用delphi實現文件的FTP批量傳遞有沒有比較好的辦法在傳遞的時候講所有提交的文件重命名
FTP分為兩端:伺服器端+客戶端。如果用delphi編程,既可以兩者都可以自己編寫,也可以伺服器端用現在的軟體,客戶端自己寫代碼。
從你的問題來看,傳輸的時候將文件名重命名,據我的理解,傳輸的過程中是無法更名的,可以考慮在傳輸開始前、結束後進行重命名。
比如:
如果是下載數據,當數據下載前或下載後都可以進行文件更名操作。
如果是上傳,可以在上傳之前就將文件進行更名,更名後再上傳。
Ⅳ 如何對FTP存檔進行加密
windows用戶 安裝Secure FTP或者 Flash FXP
Secure FTP的使用方法如下:
步驟1:啟動Secure FTP,點擊工具欄上的紅綠燈按鈕打開連接對話框,如圖3所示,在「hostname」中填入Serv-U FTP Server伺服器的IP地址,在下面兩欄中分別填入FTP帳戶名和密碼。
步驟2:切換到「Secutity」標簽,點擊「Secutity」欄下的下拉框,可以發現它支持兩種連接方式:普通的連接和implicit SSL連接,不支持explicit SSL連接(如果您一定要使用這種連接,您可以使用Secure FTP的命令行版本,它支持所有的連接方式),這里我們選擇「implicit SSL」項,並勾選「Data Encryption」項。完成後點擊「connect」即開始連接伺服器。由於是SSL連接,所以連接時間明顯比普通連接要長.當第一次使用時,還會彈出一個接受伺服器證書的對話框,點擊「Grant Always」按鈕接受即可。
Flash FXP比較方便 就不說了
Ⅳ 如何為FTP伺服器加密
第一步首先在A計算機上安裝sniffer嗅探工具,並啟動該程序。在sniffer軟體中通過上方的「matrix」(矩陣)按鈕啟動監測界面,打開監測界面後我們就可以開始監測網路中的數據包了。通過菜單欄的「capture(捕獲)→start(開始)」啟動。在檢測數據包窗口中我們點左下角的objects(對象)標簽,然後選擇station(狀態),這樣將把當前網路中所有通信都顯示在窗口中。
至此我們就通過sniffer工具將員工在FTP伺服器上的用戶名和密碼嗅探出來,該方法在員工和安裝了sniffer的計算機處在同一個子網的情況下有效。
Ⅵ 如何在FTP上加密向FTP上指定文件夾上傳文件及文件夾時這些內容均被自動加密,其他人都可以看到
這個FTP伺服器做不到,像word excel你可以自己設個密碼,其他類型的就沒辦法了,用加密工具加密也只在本地電腦有效。
Ⅶ ftp如何加密訪問
1、FTP里的文件夾訪問的話,本身就是需要一定的許可權,而這個許可權,就是所要訪問的文件夾的FTP管理員給予的賬戶和密碼。
2、如果想設置FTP伺服器上的文件夾加密,可以用文件夾加密工具來給其加密,但是有許可權的訪問FTP的賬戶下載它就不需要密碼了。下載下來後,打開的時候,設置的加密功能就體現出來了。
3、FTP工具很多,可以試試serv-U,也可以試試 zFTPServer,Quick Easy FTP Server 等。文件夾加密工具可以用:文件夾加密超級大師,易通文件夾加密,神盾文件夾加密工具,隱身俠等,根據實際需求。
Ⅷ 怎樣將上傳ftp中的文件加密
不想給他們看,怎樣給那些文件加密:
網路搜索最好的加密軟體GLSCC中文版,
唯一有雙重加密離線保護,好用很穩定,不會出現你這樣的問題。
將上傳ftp中的文件加密
Ⅸ Delphi中,怎麼使用FTP主動下傳文件
提供個思路吧!
1、可以利用FTP方式,在伺服器駕設一個FTP伺服器,在DEPHI中只要用FTP控制項就可以直接傳送!,ftp上傳可以去度娘查……相當多
2、利用//192.168.0.1方式 ,這種方式等同於!
Ⅹ FTP用的傳輸是加密的傳輸嗎
是的ftp輸入加密傳輸,在接收時我們需要有許可權才能夠接收