Quick.Amazon.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. { ***************************************************************************
  2. Copyright (c) 2015-2021 Kike Pérez
  3. Unit : Quick.Amazon
  4. Description : Amazon object operations
  5. Author : Kike Pérez
  6. Version : 1.4
  7. Created : 18/11/2016
  8. Modified : 18/11/2021
  9. This file is part of QuickLib: https://github.com/exilon/QuickLib
  10. ***************************************************************************
  11. Licensed under the Apache License, Version 2.0 (the "License");
  12. you may not use this file except in compliance with the License.
  13. You may obtain a copy of the License at
  14. http://www.apache.org/licenses/LICENSE-2.0
  15. Unless required by applicable law or agreed to in writing, software
  16. distributed under the License is distributed on an "AS IS" BASIS,
  17. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. See the License for the specific language governing permissions and
  19. limitations under the License.
  20. *************************************************************************** }
  21. unit Quick.Amazon;
  22. {$i QuickLib.inc}
  23. interface
  24. uses
  25. Classes,
  26. System.SysUtils,
  27. System.Generics.Collections,
  28. IPPeerClient,
  29. Data.Cloud.CloudAPI,
  30. Data.Cloud.AmazonAPI,
  31. Quick.Commons;
  32. const
  33. AWSRegionSet : array of string = [
  34. 'eu-west-1',
  35. 'eu-west-2',
  36. 'eu-west-3',
  37. 'eu-central-1',
  38. 'us-east-1',
  39. 'us-east-2',
  40. 'us-west-1',
  41. 'us-west-2',
  42. 'ap-east-1',
  43. 'ap-south-1',
  44. 'ap-southeast-1',
  45. 'ap-southeast-2',
  46. 'ap-northeast-1',
  47. 'ap-northeast-2',
  48. 'ap-northeast-3',
  49. 'ca-central-1',
  50. 'sa-east-1',
  51. 'us-east-1', // deprecated
  52. 'eu-west-1', // deprecated
  53. 'cn-north-1',
  54. 'cn-northwest-1',
  55. 'eu-north-1',
  56. 'me-south-1'];
  57. type
  58. TAmazonProtocol = (amHTTP,amHTTPS);
  59. TAmazonStorage = TAmazonStorageService;
  60. TAmazonACLAccess = TAmazonACLType;
  61. TAmazonRegion = Data.Cloud.AmazonAPI.TAmazonRegion;
  62. TAmazonObject = class
  63. Name : string;
  64. Modified : TDateTime;
  65. Size : Int64;
  66. IsDeleted : Boolean;
  67. end;
  68. TAmazonObjects = class(TObjectList<TAmazonObject>);
  69. TAmazonResponseInfo = record
  70. StatusCode : Integer;
  71. StatusMsg : string;
  72. end;
  73. TQuickAmazon = class
  74. private
  75. fconAmazon : TAmazonConnectionInfo;
  76. fAccountName : string;
  77. fAccountKey : string;
  78. fAWSRegion : TAmazonRegion;
  79. fAmazonProtocol : TAmazonProtocol;
  80. procedure SetAccountName(amAccountName : string);
  81. procedure SetAccountKey(amAccountKey : string);
  82. procedure SetAmazonProtocol(amProtocol : TAmazonProtocol);
  83. procedure SetAWSRegion(Value : TAmazonRegion);
  84. function FileToArray(cFilename : string) : TArray<Byte>;
  85. function ByteContent(DataStream: TStream): TBytes;
  86. public
  87. constructor Create; overload;
  88. constructor Create(amAccountName, amAccountKey : string); overload;
  89. destructor Destroy; override;
  90. property AccountName : string read fAccountName write SetAccountName;
  91. property AccountKey : string read fAccountKey write SetAccountKey;
  92. property AmazonProtocol : TAmazonProtocol read fAmazonProtocol write SetAmazonProtocol;
  93. property AWSRegion : TAmazonRegion read fAWSRegion write SetAWSRegion;
  94. function StorageURL(amBucket : string) : string;
  95. function PutObject(amBucket, cFilename, amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  96. function PutObject(amBucket : string; cStream : TStream; amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  97. function GetObject(amBucket, amObjectName, cFilenameTo : string; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  98. function GetObject(amBucket, amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : TMemoryStream; overload;
  99. function ExistsObject(amBucket, amObjectName : string; amRegion : TAmazonRegion) : Boolean;
  100. function DeleteObject(amBucket,amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  101. function ListObjects(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TAmazonObjects;
  102. function ListObjectsNames(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TStrings;
  103. function ExistsBucket(amBucketName : string) : Boolean;
  104. function ListBuckets(var amResponseInfo : TAmazonResponseInfo) : TStrings;
  105. function CreateBucket(amBucket : string; amBucketRegion : TAmazonRegion; amACLType : TAmazonACLAccess; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  106. function DeleteBucket(amBucket : string; amBucketRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  107. {$IFNDEF DELPHISYDNEY_UP}
  108. class function GetAWSRegion(Region: TAmazonRegion): string; overload;
  109. {$ELSE}
  110. class function GetAWSRegion(const Region : string) : TAmazonRegion; overload;
  111. {$ENDIF}
  112. end;
  113. implementation
  114. constructor TQuickAmazon.Create;
  115. begin
  116. inherited;
  117. fconAmazon := TAmazonConnectionInfo.Create(nil);
  118. fAmazonProtocol := amHTTP;
  119. fconAmazon.UseDefaultEndpoints := False;
  120. end;
  121. constructor TQuickAmazon.Create(amAccountName, amAccountKey : string);
  122. begin
  123. Create;
  124. SetAccountName(amAccountName);
  125. SetAccountKey(amAccountKey);
  126. end;
  127. destructor TQuickAmazon.Destroy;
  128. begin
  129. if Assigned(fconAmazon) then fconAmazon.Free;
  130. inherited;
  131. end;
  132. procedure TQuickAmazon.SetAWSRegion(Value : TAmazonRegion);
  133. begin
  134. fAWSRegion := Value;
  135. //fconAmazon.StorageEndpoint := Format('s3-%s.amazonaws.com',[GetAWSRegion(Value)]);
  136. //fconAmazon.StorageEndpoint := Format('s3.%s.amazonaws.com',[GetAWSRegion(Value)]);
  137. {$IFDEF DELPHISYDNEY_UP}
  138. if not StrInArray(Value,AWSRegionSet) then raise Exception.CreateFmt('%s is not a valid region for AmazonS3!',[Value]);
  139. fconAmazon.Region := Value;
  140. {$ELSE}
  141. fconAmazon.StorageEndpoint := Format('s3.%s.amazonaws.com',[GetAWSRegion(Value)]);
  142. {$ENDIF}
  143. end;
  144. procedure TQuickAmazon.SetAccountName(amAccountName : string);
  145. begin
  146. if fAccountName <> amAccountName then
  147. begin
  148. fAccountName := amAccountName;
  149. fconAmazon.AccountName := amAccountName;
  150. end;
  151. end;
  152. procedure TQuickAmazon.SetAccountKey(amAccountKey : string);
  153. begin
  154. if fAccountKey <> amAccountKey then
  155. begin
  156. fAccountKey := amAccountKey ;
  157. fconAmazon.AccountKey := amAccountKey;
  158. end;
  159. end;
  160. procedure TQuickAmazon.SetAmazonProtocol(amProtocol: TAmazonProtocol);
  161. begin
  162. if fAmazonProtocol <> amProtocol then
  163. begin
  164. fAmazonProtocol := amProtocol;
  165. if amProtocol = amHTTP then fconAmazon.Protocol := 'http'
  166. else fconAmazon.Protocol := 'https';
  167. end;
  168. end;
  169. function TQuickAmazon.FileToArray(cFilename : string) : TArray<Byte>;
  170. var
  171. fs : TFileStream;
  172. bs : TBytesStream;
  173. begin
  174. fs := TFileStream.Create(cFilename, fmOpenRead);
  175. try
  176. Result := ByteContent(fs);
  177. finally
  178. fs.Free;
  179. end;
  180. end;
  181. function TQuickAmazon.ByteContent(DataStream: TStream): TBytes;
  182. var
  183. Buffer: TBytes;
  184. begin
  185. if not Assigned(DataStream) then Exit(nil);
  186. SetLength(Buffer, DataStream.Size);
  187. // the content may have been read
  188. DataStream.Position := 0;
  189. if DataStream.Size > 0 then
  190. DataStream.Read(Buffer[0], DataStream.Size);
  191. Result := Buffer;
  192. end;
  193. function GetResponseInfo(amResponseInfo : TCloudResponseInfo) : TAmazonResponseInfo;
  194. begin
  195. Result.StatusCode := amResponseInfo.StatusCode;
  196. Result.StatusMsg := amResponseInfo.StatusMessage;
  197. end;
  198. function TQuickAmazon.StorageURL(amBucket : string) : string;
  199. begin
  200. Result := fconAmazon.StorageURL(amBucket)
  201. end;
  202. function TQuickAmazon.PutObject(amBucket, cFilename, amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  203. var
  204. AmazonS3 : TAmazonStorage;
  205. Content : TArray<Byte>;
  206. CloudResponseInfo : TCloudResponseInfo;
  207. begin
  208. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  209. if amBucket = '' then amBucket := '$root';
  210. try
  211. Content := FileToArray(cFilename);
  212. if amObjectName = '' then amObjectName := cFilename;
  213. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  214. CloudResponseInfo := TCloudResponseInfo.Create;
  215. try
  216. Result := AmazonS3.UploadObject(amBucket,amObjectName,Content,False,nil,nil,amACLType,CloudResponseInfo{$IFDEF DELPHIRX11_UP},fAWSRegion{$ENDIF});
  217. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  218. finally
  219. CloudResponseInfo.Free;
  220. end;
  221. finally
  222. AmazonS3.Free;
  223. end;
  224. end;
  225. function TQuickAmazon.PutObject(amBucket : string; cStream : TStream; amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  226. var
  227. AmazonS3 : TAmazonStorage;
  228. Content : TBytes;
  229. CloudResponseInfo : TCloudResponseInfo;
  230. begin
  231. amResponseInfo.StatusCode := 500;
  232. if amBucket = '' then amBucket := '$root';
  233. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  234. try
  235. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  236. try
  237. //AmazonS3.Timeout := fTimeout;
  238. CloudResponseInfo := TCloudResponseInfo.Create;
  239. try
  240. //CloudResponseInfo.Headers.AddPair();
  241. Content := ByteContent(cStream);
  242. Result := AmazonS3.UploadObject(amBucket,amObjectName,Content,False,nil,nil,amACLType,CloudResponseInfo{$IFDEF DELPHIRX11_UP},fAWSRegion{$ENDIF});
  243. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  244. finally
  245. CloudResponseInfo.Free;
  246. end;
  247. finally
  248. AmazonS3.Free;
  249. SetLength(Content,0);
  250. Content := nil;
  251. end;
  252. except
  253. Result := False;
  254. end;
  255. end;
  256. function TQuickAmazon.GetObject(amBucket, amObjectName, cFilenameTo : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  257. var
  258. AmazonS3 : TAmazonStorage;
  259. fs : TFileStream;
  260. CloudResponseInfo : TCloudResponseInfo;
  261. //amParams : TAmazonGetObjectOptionals;
  262. begin
  263. Result := False;
  264. if amBucket = '' then amBucket := '$root';
  265. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  266. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  267. try
  268. //AmazonS3.Timeout := fTimeout;
  269. CloudResponseInfo := TCloudResponseInfo.Create;
  270. if FileExists(cFilenameTo) then fs := TFileStream.Create(cFilenameTo,fmOpenWrite)
  271. else fs := TFileStream.Create(cFilenameTo,fmCreate);
  272. try
  273. try
  274. AmazonS3.GetObject(amBucket,amObjectName,fs,CloudResponseInfo{$IFDEF DELPHIRX11_UP},fAWSRegion{$ENDIF});
  275. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  276. if amResponseInfo.StatusCode = 200 then Result := True;
  277. except
  278. Result := False;
  279. end;
  280. finally
  281. fs.Free;
  282. CloudResponseInfo.Free;
  283. end;
  284. finally
  285. AmazonS3.Free;
  286. end;
  287. end;
  288. function TQuickAmazon.GetObject(amBucket, amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : TMemoryStream;
  289. var
  290. AmazonS3 : TAmazonStorage;
  291. CloudResponseInfo : TCloudResponseInfo;
  292. begin
  293. Result := TMemoryStream.Create;
  294. if amBucket = '' then amBucket := '$root';
  295. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  296. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  297. try
  298. //AmazonS3.Timeout := fTimeout;
  299. CloudResponseInfo := TCloudResponseInfo.Create;
  300. try
  301. try
  302. AmazonS3.GetObject(amBucket,amObjectName,Result,CloudResponseInfo{$IFDEF DELPHIRX11_UP},fAWSRegion{$ENDIF});
  303. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  304. except
  305. Result := nil;
  306. end;
  307. finally
  308. CloudResponseInfo.Free;
  309. end;
  310. finally
  311. AmazonS3.Free;
  312. end;
  313. end;
  314. function TQuickAmazon.ExistsObject(amBucket, amObjectName : string; amRegion : TAmazonRegion) : Boolean;
  315. var
  316. amObject : string;
  317. amObjects : TStrings;
  318. ResponseInfo : TAmazonResponseInfo;
  319. begin
  320. Result := False;
  321. amObjects := ListObjectsNames(amBucket,amObjectName,amRegion,ResponseInfo);
  322. try
  323. if (ResponseInfo.StatusCode = 200) and (Assigned(amObjects)) then
  324. begin
  325. for amObject in amObjects do
  326. begin
  327. if amObject = amObjectName then
  328. begin
  329. Result := True;
  330. Break;
  331. end;
  332. end;
  333. end;
  334. finally
  335. amObjects.Free;
  336. end;
  337. end;
  338. function TQuickAmazon.DeleteObject(amBucket,amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  339. var
  340. AmazonS3 : TAmazonStorage;
  341. CloudResponseInfo : TCloudResponseInfo;
  342. begin
  343. if amBucket = '' then amBucket := '$root';
  344. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  345. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  346. try
  347. //AmazonS3.Timeout := fTimeout;
  348. CloudResponseInfo := TCloudResponseInfo.Create;
  349. try
  350. Result := AmazonS3.DeleteObject(amBucket,amObjectName,CloudResponseInfo);
  351. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  352. finally
  353. CloudResponseInfo.Free;
  354. end;
  355. finally
  356. AmazonS3.Free;
  357. end;
  358. end;
  359. function TQuickAmazon.ListObjects(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TAmazonObjects;
  360. var
  361. AmazonS3 : TAmazonStorage;
  362. amObject : TAmazonObject;
  363. i : Integer;
  364. amBucketResult : TAmazonBucketResult;
  365. CloudResponseInfo : TCloudResponseInfo;
  366. cNextMarker : string;
  367. amParams : TStrings;
  368. begin
  369. Result := TAmazonObjects.Create(True);
  370. cNextMarker := '';
  371. if amBucket = '' then amBucket := '$root';
  372. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  373. CloudResponseInfo := TCloudResponseInfo.Create;
  374. try
  375. //AmazonS3.Timeout := fTimeout;
  376. repeat
  377. amParams := TStringList.Create;
  378. try
  379. amParams.Values['prefix'] := amObjectsStartWith;
  380. if cNextMarker <> '' then amParams.Values['marker'] := cNextMarker;
  381. amBucketResult := AmazonS3.GetBucket(amBucket,amParams,CloudResponseInfo,amRegion);
  382. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  383. if Assigned(amBucketResult) then
  384. begin
  385. try
  386. Result.Capacity := amBucketResult.Objects.Count;
  387. for i := 0 to amBucketResult.Objects.Count-1 do
  388. begin
  389. amObject := TAmazonObject.Create;
  390. amObject.Name := amBucketResult.Objects[i].Name;
  391. amObject.Modified := StrToDateTime(amBucketResult.Objects[i].LastModified);
  392. amObject.Size := amBucketResult.Objects[i].Size;
  393. amObject.IsDeleted := amBucketResult.Objects[i].IsDeleted;
  394. Result.Add(amObject);
  395. end;
  396. finally
  397. amBucketResult.Free;
  398. end;
  399. cNextMarker := amBucketResult.Marker;
  400. end;
  401. finally
  402. amParams.Free;
  403. end;
  404. until (cNextMarker = '') or (amResponseInfo.StatusCode <> 200);
  405. finally
  406. AmazonS3.Free;
  407. CloudResponseInfo.Free;
  408. end;
  409. end;
  410. function TQuickAmazon.ListObjectsNames(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TStrings;
  411. var
  412. AmazonS3 : TAmazonStorage;
  413. i : Integer;
  414. amBucketResult : TAmazonBucketResult;
  415. CloudResponseInfo : TCloudResponseInfo;
  416. cNextMarker : string;
  417. amParams : TStrings;
  418. begin
  419. Result := TStringList.Create;
  420. cNextMarker := '';
  421. if amBucket = '' then amBucket := '$root';
  422. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  423. CloudResponseInfo := TCloudResponseInfo.Create;
  424. try
  425. //AmazonS3.Timeout := fTimeout;
  426. repeat
  427. amParams := TStringList.Create;
  428. try
  429. if amObjectsStartWith <> '' then amParams.Values['prefix'] := amObjectsStartWith;
  430. if cNextMarker <> '' then amParams.Values['marker'] := cNextMarker;
  431. amBucketResult := AmazonS3.GetBucket(amBucket,amParams,CloudResponseInfo,amRegion);
  432. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  433. if Assigned(amBucketResult) then
  434. begin
  435. try
  436. Result.Capacity := amBucketResult.Objects.Count;
  437. for i := 0 to amBucketResult.Objects.Count-1 do Result.Add(amBucketResult.Objects[i].Name);
  438. finally
  439. amBucketResult.Free;
  440. end;
  441. cNextMarker := amBucketResult.Marker;
  442. end;
  443. finally
  444. amParams.Free;
  445. end;
  446. until (cNextMarker = '') or (amResponseInfo.StatusCode <> 200);
  447. finally
  448. AmazonS3.Free;
  449. CloudResponseInfo.Free;
  450. end;
  451. end;
  452. function TQuickAmazon.ExistsBucket(amBucketName : string) : Boolean;
  453. var
  454. amBucket : string;
  455. amBuckets : TStrings;
  456. ResponseInfo : TAmazonResponseInfo;
  457. begin
  458. Result := False;
  459. amBuckets := ListBuckets(ResponseInfo);
  460. try
  461. if (ResponseInfo.StatusCode = 200) and (Assigned(amBuckets)) then
  462. begin
  463. for amBucket in amBuckets do
  464. begin
  465. if amBucket = amBucketName then
  466. begin
  467. Result := True;
  468. Break;
  469. end;
  470. end;
  471. end;
  472. finally
  473. amBuckets.Free;
  474. end;
  475. end;
  476. function TQuickAmazon.ListBuckets(var amResponseInfo : TAmazonResponseInfo) : TStrings;
  477. var
  478. AmazonS3 : TAmazonStorageService;
  479. CloudResponseInfo : TCloudResponseInfo;
  480. Buckets : TStrings;
  481. i : Integer;
  482. begin
  483. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  484. Result := TStringList.Create;
  485. try
  486. //AmazonS3.Timeout := fTimeout;
  487. CloudResponseInfo := TCloudResponseInfo.Create;
  488. try
  489. Buckets := AmazonS3.ListBuckets(CloudResponseInfo);
  490. try
  491. Result.Capacity := Buckets.Count;
  492. for i := 0 to Buckets.Count -1 do
  493. begin
  494. Result.Add(Buckets.Names[i]);
  495. end;
  496. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  497. finally
  498. Buckets.Free;
  499. end;
  500. finally
  501. CloudResponseInfo.Free;
  502. end;
  503. finally
  504. AmazonS3.Free;
  505. end;
  506. end;
  507. function TQuickAmazon.CreateBucket(amBucket : string; amBucketRegion : TAmazonRegion; amACLType : TAmazonACLAccess; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  508. var
  509. AmazonS3 : TAmazonStorageService;
  510. CloudResponseInfo : TCloudResponseInfo;
  511. begin
  512. Result := False;
  513. if amBucket = '' then Exit;
  514. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  515. try
  516. CloudResponseInfo := TCloudResponseInfo.Create;
  517. try
  518. Result := AmazonS3.CreateBucket(amBucket,amACLType,amBucketRegion,CloudResponseInfo);
  519. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  520. finally
  521. CloudResponseInfo.Free;
  522. end;
  523. finally
  524. AmazonS3.Free;
  525. end;
  526. end;
  527. function TQuickAmazon.DeleteBucket(amBucket : string; amBucketRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  528. var
  529. AmazonS3 : TAmazonStorageService;
  530. CloudResponseInfo : TCloudResponseInfo;
  531. begin
  532. Result := False;
  533. if amBucket = '' then Exit;
  534. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  535. try
  536. CloudResponseInfo := TCloudResponseInfo.Create;
  537. try
  538. Result := AmazonS3.DeleteBucket(amBucket,CloudResponseInfo,amBucketRegion);
  539. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  540. finally
  541. CloudResponseInfo.Free;
  542. end;
  543. finally
  544. AmazonS3.Free;
  545. end;
  546. end;
  547. {$IFNDEF DELPHISYDNEY_UP}
  548. class function TQuickAmazon.GetAWSRegion(Region: TAmazonRegion): string;
  549. begin
  550. Result := TAmazonStorageService.GetRegionString(Region);
  551. end;
  552. {$ELSE}
  553. class function TQuickAmazon.GetAWSRegion(const Region : string) : TAmazonRegion;
  554. begin
  555. Result := TAmazonStorageService.GetRegionFromString(Region);
  556. end;
  557. {$ENDIF}
  558. end.