function UploadToFTP(file: string ; PathSrv : string): Boolean;
var
server, port, user , password: string;
SR : TSearchRec;
begin
Result := True;
FEventLogger := TEventLogger.Create('Upload FTP');
if file <> '' then
begin
try
server := FServer;
port := FPort;
user := FUserName;
password:= FPassword;
FindFirst(file, faArchive, SR);
try // try except
idftp1.Host:= server;
idftp1.Port := StrToInt(port);
idftp1.Username:= user;
idftp1.Password:= password;
idftp1.Connect();
idftp1.Put(file,PathSrv+SR.Name);
except on E: Exception do begin
Result:= False;
FEventLogger.LogMessage('Exception : ' + E.Message , EVENTLOG_ERROR_TYPE , 0, 2);
WriteToLog('Exception: '+ file+' error message: '+ E.Message);
end;
end;
finally
end;
end;
end;
所以我有這個功能,它可以在有時很慢的網絡上對一些大文件進行ftp上傳。我測試了它本地化,它工作正常,但在緩慢的網絡中,我在99%的時間裏得到了這個錯誤。使用Indy時的網絡問題
The specified network name is no longer available.
這是一個非常奇怪的行爲,因爲FTP位於沒有斷開連接問題的服務器上。我也試着看,並開始文件上傳,並且在拋出這個錯誤之前它幾乎完成了所有的上傳。因此,例如,如果我有一個100MB的文件,那麼99MB的上傳會引發錯誤。
任何想法是什麼導致這個錯誤,或我能做什麼?
還時不時我有一個其他錯誤
Socket Error # 10054
Connection reset by peer.
提,我試圖使用Filezilla上傳這個文件,它的工作原理,所以這個問題是在代碼的某個地方,我可能會錯過一些東西。
你使用哪個Delphi,甚至更好哪個版本的Indy使用?我懷疑這可能與一些超時有關,但我想這應該引發一個不同的錯誤。 – SilverWarior
確保您正在使用具有TIdFTP.NATKeepAlive屬性的Indy的最新版本,並在大量傳輸期間啓用它。這將有助於解決由於在傳輸過程中命令套接字閒置時間過長而造成的超時問題。 –
@RemyLebeau我已將NATKeepAlive屬性添加到我的函數中。我稍後會嘗試,看看是否有任何改進,但我不認爲這將解決我的主要錯誤指定的網絡名稱不再可用。 Becouse我可以很好地傳輸每一個數據量,除了(從我的猜測)最後一組字節或類似的東西。 – CiucaS