2015-04-07 60 views
0
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上傳這個文件,它的工作原理,所以這個問題是在代碼的某個地方,我可能會錯過一些東西。

+0

你使用哪個Delphi,甚至更好哪個版本的Indy使用?我懷疑這可能與一些超時有關,但我想這應該引發一個不同的錯誤。 – SilverWarior

+3

確保您正在使用具有TIdFTP.NATKeepAlive屬性的Indy的最新版本,並在大量傳輸期間啓用它。這將有助於解決由於在傳輸過程中命令套接字閒置時間過長而造成的超時問題。 –

+0

@RemyLebeau我已將NATKeepAlive屬性添加到我的函數中。我稍後會嘗試,看看是否有任何改進,但我不認爲這將解決我的主要錯誤指定的網絡名稱不再可用。 Becouse我可以很好地傳輸每一個數據量,除了(從我的猜測)最後一組字節或類似的東西。 – CiucaS

回答

1

您使用的是Symantec Endpoint Protection或KIS(Kaspersky Internet Security)嗎?看看here,herehere

指定的網絡名稱不再可用」是由Symantec Endpoint Protection 11.0引起的,因此Symantec已將其識別爲已知問題。

順便說一句,在你的代碼中,不要忘記在完成上傳文件後調用.Disconnect()。

+0

我已經避免使用.Disconnect來查看這是否是我的代碼中的問題...您可以看到最終沒有代碼行(這是我放置斷開連接的位置)。不,我讀過,FPT服務器上沒有Symantec,也沒有客戶機。 – CiucaS