UploaderTask.pas 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. unit UploaderTask;
  2. interface
  3. uses
  4. Windows, IdHTTP, SysUtils, Classes, IdSchedulerOfThreadPool, IdTask, IdThread,
  5. IdYarn, IdMultipartFormData;
  6. type
  7. TUploaderTask = class(TIdTask)
  8. private
  9. FThread: TIdThread;
  10. FRemote, FLocal: string;
  11. FIdHTTP: TIdHTTP;
  12. FTime: Integer;
  13. FSuccess: Boolean;
  14. public
  15. constructor Create(ARemote, ALocal: string; AYarn: TIdYarn);
  16. destructor Destroy; override;
  17. procedure AfterRun; override;
  18. // procedure BeforeRun; override;
  19. function Run: Boolean; override;
  20. end;
  21. TFacesUploaderTask = class(TIdTask)
  22. private
  23. FThread: TIdThread;
  24. FRemote: string;
  25. FFiles: TStrings;
  26. FIdHTTP: TIdHTTP;
  27. FTime: Integer;
  28. FSuccess: Boolean;
  29. FOnCompleted: TNotifyEvent;
  30. FData: TObject;
  31. procedure SetOnCompleted(const Value: TNotifyEvent);
  32. procedure SetDate(const Value: TObject);
  33. protected
  34. procedure DoCompleted;
  35. public
  36. constructor Create(ARemote: string; const AFiles: TStrings; AYarn: TIdYarn);
  37. destructor Destroy; override;
  38. procedure AfterRun; override;
  39. procedure BeforeRun; override;
  40. function Run: Boolean; override;
  41. property OnCompleted: TNotifyEvent read FOnCompleted write SetOnCompleted;
  42. property Success: Boolean read FSuccess;
  43. property Data: TObject read FData write SetDate;
  44. end;
  45. implementation
  46. uses
  47. ShareUtils, LoggerImport, IdURI, Forms, MainFrm, IdSchedulerOfThread;
  48. { TUploaderTask }
  49. procedure TUploaderTask.AfterRun;
  50. begin
  51. FreeAndNil(Self);
  52. end;
  53. constructor TUploaderTask.Create(ARemote, ALocal: string; AYarn: TIdYarn);
  54. begin
  55. FRemote := ARemote;
  56. FLocal := ALocal;
  57. FThread := TIdYarnOfThread(AYarn).Thread;
  58. inherited Create(AYarn);
  59. end;
  60. destructor TUploaderTask.Destroy;
  61. begin
  62. inherited;
  63. end;
  64. function TUploaderTask.Run: Boolean;
  65. var
  66. FileStream: TIdMultiPartFormDataStream;
  67. begin
  68. try
  69. Result := False;
  70. FileStream := TIdMultiPartFormDataStream.Create;
  71. FileStream.AddFile('file1', FLocal, '');
  72. FIdHTTP := TIdHTTP.Create(nil);
  73. FIdHTTP.Request.ContentType := 'multipart/form-data';
  74. FIdHTTP.Post(FRemote, FileStream);
  75. Result := True;
  76. FSuccess := True;
  77. except
  78. on E: Exception do
  79. begin
  80. if (FTime <= 0) and (not FThread.Terminated) then
  81. Result := True;
  82. Dec(FTime);
  83. FileStream.Free;
  84. FreeAndNil(FIdHTTP);
  85. Error(E.Message, 'TUploaderTask.Run');
  86. end;
  87. end;
  88. FileStream.Free;
  89. FreeAndNil(FIdHTTP);
  90. end;
  91. { TFacesUploaderTask }
  92. procedure TFacesUploaderTask.AfterRun;
  93. begin
  94. if not FThread.Terminated then
  95. FThread.Synchronize(DoCompleted);
  96. Free;
  97. end;
  98. procedure TFacesUploaderTask.BeforeRun;
  99. begin
  100. inherited;
  101. end;
  102. constructor TFacesUploaderTask.Create(ARemote: string; const AFiles: TStrings; AYarn: TIdYarn);
  103. begin
  104. FRemote := ARemote;
  105. FFiles := TStringList.Create;
  106. if Assigned(AFiles) then
  107. FFiles.AddStrings(AFiles);
  108. FThread := TIdYarnOfThread(AYarn).Thread;
  109. inherited Create(AYarn);
  110. end;
  111. destructor TFacesUploaderTask.Destroy;
  112. begin
  113. FFiles.Free;
  114. inherited;
  115. end;
  116. procedure TFacesUploaderTask.DoCompleted;
  117. begin
  118. if Assigned(FOnCompleted) then
  119. FOnCompleted(Self);
  120. end;
  121. function TFacesUploaderTask.Run: Boolean;
  122. var
  123. FileStream: TIdMultiPartFormDataStream;
  124. i: Integer;
  125. begin
  126. if FFiles.Count = 0 then
  127. begin
  128. Result := False;
  129. Exit;
  130. end;
  131. try
  132. FIdHTTP := TIdHTTP.Create(nil);
  133. FileStream := TIdMultiPartFormDataStream.Create;
  134. FIdHTTP.Request.ContentType := 'multipart/form-data';
  135. Result := True;
  136. for I := 0 to FFiles.Count - 1 do
  137. if FileExists(FFiles[i]) then
  138. begin
  139. if FThread.Terminated then
  140. Exit;
  141. FileStream.AddFile('file1', FFiles[i], '');
  142. FIdHTTP.Post(FRemote, FileStream);
  143. FreeAndNil(FileStream);
  144. end;
  145. Result := False;
  146. FSuccess := True;
  147. except
  148. on E: Exception do
  149. begin
  150. if (FTime <= 0) and (not FThread.Terminated) then
  151. Result := False;
  152. Dec(FTime);
  153. FileStream.Free;
  154. FIdHTTP.Free;
  155. Error(E.Message, 'TUploaderTask.Run');
  156. end;
  157. end;
  158. FileStream.Free;
  159. FIdHTTP.Free;
  160. end;
  161. procedure TFacesUploaderTask.SetDate(const Value: TObject);
  162. begin
  163. FData := Value;
  164. end;
  165. procedure TFacesUploaderTask.SetOnCompleted(const Value: TNotifyEvent);
  166. begin
  167. FOnCompleted := Value;
  168. end;
  169. end.