UploaderTask.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. FIdHTTP := TIdHTTP.Create(nil);
  110. FIdHTTP.Request.ContentType := 'multipart/form-data';
  111. inherited Create(AYarn);
  112. end;
  113. destructor TFacesUploaderTask.Destroy;
  114. begin
  115. FFiles.Free;
  116. FIdHTTP.Free;
  117. inherited;
  118. end;
  119. procedure TFacesUploaderTask.DoCompleted;
  120. begin
  121. if Assigned(FOnCompleted) then
  122. FOnCompleted(Self);
  123. end;
  124. function TFacesUploaderTask.Run: Boolean;
  125. var
  126. FileStream: TIdMultiPartFormDataStream;
  127. i: Integer;
  128. begin
  129. try
  130. Result := False;
  131. for I := 0 to FFiles.Count - 1 do
  132. if FileExists(FFiles[i]) then
  133. begin
  134. if FThread.Terminated then
  135. Exit;
  136. FileStream := TIdMultiPartFormDataStream.Create;
  137. FileStream.AddFile('file1', FFiles[i], '');
  138. FIdHTTP.Post(FRemote, FileStream);
  139. FreeAndNil(FileStream);
  140. end;
  141. Result := True;
  142. FSuccess := True;
  143. except
  144. on E: Exception do
  145. begin
  146. if (FTime <= 0) and (not FThread.Terminated) then
  147. Result := True;
  148. Dec(FTime);
  149. FileStream.Free;
  150. Error(E.Message, 'TUploaderTask.Run');
  151. end;
  152. end;
  153. if Assigned(FileStream) then
  154. FileStream.Free;
  155. end;
  156. procedure TFacesUploaderTask.SetDate(const Value: TObject);
  157. begin
  158. FData := Value;
  159. end;
  160. procedure TFacesUploaderTask.SetOnCompleted(const Value: TNotifyEvent);
  161. begin
  162. FOnCompleted := Value;
  163. end;
  164. end.