{ ============================================================================== 方法名稱:GetFtpinfo 引用相依: 方法描述:向伺服器請求案件上傳所需的 FTP 連線資訊。核心邏輯: 1. 發送包含案件編號與動作代碼的 HTTP POST 請求至後台 Servlet。 2. 解析伺服器回傳結果,若回傳 'nodata' 則維持 tsNone 模式;若回傳成功, 則根據標籤判斷是否啟用 FTP 模式 (tsFtp)。 3. 若為 FTP 模式,會進一步解析並呼叫 DecodeFtpInfo 對包含連線協定、IP、 Port、帳號及密碼的加密字串進行解密,並存入系統全域變數中。 ============================================================================== } Function TCB_IMGPSScanX.GetFtpinfo(CaseID,Action:String):Boolean; var SendData : String; Procedure DecodeFtpInfo(EncryStr:String); var FtpStr : String; ftpinfoList : TStringlist; begin if EncryStr = '' then Exit; ftpinfoList := TStringlist.Create; try FtpStr := En_DecryptionStr_Base64('D',EncryStr,MpsKey); SplitString('!@!',FtpStr,ftpinfoList); if ftpinfoList[0] = 'ftps' then FFtpProtocol := fpftps else if ftpinfoList[0] = 'ftp' then FFtpProtocol := fpftp; FFtpIP := ftpinfoList[1]; FFtpPort := strtoint(ftpinfoList[2]); FFtpID := ftpinfoList[3]; FFtpPwd := ftpinfoList[4]; finally ftpinfoList.Free; end; end; begin Result := True; SendData:='product='+FWork_no+'&case_no='+CaseID+'&department='+FUserUnit+'&action='+Action; If not ProcessServlet_FormData(HTTPSClient,FURL+'service/imgpsc/IMGPSC02/ftps',SendData,FReWrite,Memo1,False) Then begin HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason; Result := False; Exit; end; IF (memo1.Lines.Strings[0] = '1') Then begin if memo1.Lines.Strings[1]='nodata' then //nodata 為正常可繼續的判斷 begin TransMode := tsNone; Result := True; Exit; end else begin HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1]; Result := False; Exit; end; end Else if Pos('',Memo1.Lines.Text) > 0 then begin HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'); Result := False; Exit; end else if (memo1.Lines.Strings[0] <> '0') then//不認識的字串 begin HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[0]; Result := False; Exit; end; TransMode := tsHttp; FFtpExtraPath := ''; if memo1.Lines.Strings[0] = '0' then begin if memo1.Lines.Strings[2] = 'Y' then //要使用FTP TransMode := tsFtp; if memo1.Lines.Count > 3 then begin FFtpExtraPath := memo1.Lines.Strings[3]; DecodeFtpInfo(memo1.Lines.Strings[4]); end; end; end; { ============================================================================== 方法名稱:SetFtpInfo 引用相依:SetFtpInfo, IIS_Ftp 方法描述:將 FTP 連線參數與事件回呼設定至 FTP 傳輸元件 (IIS_Ftp)。此方法會將先 前取得並解碼的連線資訊(如 FTP IP、帳號、密碼、路徑、連接埠)指派給 IIS_Ft p 物件,並根據協定類型設定是否開啟 SSL/TLS 以及被動模式 (Passive)。此 外,也會關聯各項事件處理器(如 SSLError, CertificateValidate, TextData Line 等),以監控傳輸過程中的通訊狀態。 ============================================================================== } Procedure TCB_IMGPSScanX.SetFtpInfo; //餵入FTP資訊 begin IIS_Ftp.Display1 := Display1; IIS_Ftp.FTPSClient1 := FTPSClient1; IIS_Ftp.ElMemoryCertStorage := ElMemoryCertStorage; IIS_Ftp.Display1 := Display1; IIS_Ftp.Ftpip := FFtpIP; IIS_Ftp.Ftpuserid := FFtpID; IIS_Ftp.FtpPwd := FFtpPwd; IIS_Ftp.FtpPath := FFtpRootPath; IIS_Ftp.FtpPort := FFtpPort; IIS_Ftp.FtpSSL := True; IIS_Ftp.FtpPassive := True; if FFtpProtocol = fpftp then IIS_Ftp.FtpSSL := False; IIS_Ftp.FtpEncryptDataChannel := true; FTPSClient1.OnControlReceiveAsString := IIS_Ftp.EventHandlers.ControlReceiveAsString; FTPSClient1.OnControlSendAsString := IIS_Ftp.EventHandlers.ControlSendAsString; FTPSClient1.OnSSLError := IIS_Ftp.EventHandlers.SSLError; FTPSClient1.OnCertificateValidate := IIS_Ftp.EventHandlers.CertificateValidate; FTPSClient1.OnTextDataLine := IIS_Ftp.EventHandlers.TextDataLine; {Showmessage(Format('Ftpip:%s'+#13 +'Ftpid:%s'+#13 +'Ftppwd:%s'+#13 +'Ftppath:%s'+#13 +'Ftpport:%s'+#13 ,[FFtpIP,FFtpid,FFtpPwd,Ftppath,inttostr(Ftpport)]));} end; { ============================================================================== 方法名稱:FtpCaseComplete 引用相依:FtpCaseComplete, ProcessServlet_FormData 方法描述:通知後台伺服器 FTP 案件上傳已完成。方法會將包含案件狀態的上傳數據發送 至特定的 Servlet 介面。邏輯包含檢查 HTTP 通訊是否成功、解析伺服器回傳 的結果代碼,並處理可能的登入過期(Session Timeout)情況。若執行失敗,會將 錯誤原因記錄至 HttpErrStr,供後續 UI 顯示錯誤訊息。 ============================================================================== } Function TCB_IMGPSScanX.FtpCaseComplete(SendData:String):Boolean; begin Result := True; If not ProcessServlet_FormData(HTTPSClient,FURL+'service/imgpsc/IMGPSC02/caseupload',SendData,FReWrite,Memo1,False) Then begin HttpErrStr := _Msg('錯誤代碼:')+inttostr(HttpError.HttpErrorCode)+','+HttpError.HttpReason; Result := False; Exit; end; IF (memo1.Lines.Strings[0] = '1') or (memo1.Lines.Strings[0] <> '0') Then begin HttpErrStr := _Msg('錯誤原因:')+memo1.Lines.Strings[1]; Result := False; Exit; end Else if Pos('',Memo1.Lines.Text) > 0 then begin HttpErrStr := _Msg('錯誤原因:')+_Msg('閒置過久或被登出,請重新登入'); Result := False; Exit; end; end;