2
0

Quick.Amazon.pas 18 KB

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