2
0

Quick.Amazon.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  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 : 09/03/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 StreamToArray(cStream : TStream) : TArray<Byte>;
  86. function ByteContent(DataStream: TStream): TBytes;
  87. public
  88. constructor Create; overload;
  89. constructor Create(amAccountName, amAccountKey : string); overload;
  90. destructor Destroy; override;
  91. property AccountName : string read fAccountName write SetAccountName;
  92. property AccountKey : string read fAccountKey write SetAccountKey;
  93. property AmazonProtocol : TAmazonProtocol read fAmazonProtocol write SetAmazonProtocol;
  94. property AWSRegion : TAmazonRegion read fAWSRegion write SetAWSRegion;
  95. function StorageURL(amBucket : string) : string;
  96. function PutObject(amBucket, cFilename, amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  97. function PutObject(amBucket : string; cStream : TStream; amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  98. function GetObject(amBucket, amObjectName, cFilenameTo : string; var amResponseInfo : TAmazonResponseInfo) : Boolean; overload;
  99. function GetObject(amBucket, amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : TMemoryStream; overload;
  100. function ExistsObject(amBucket, amObjectName : string; amRegion : TAmazonRegion) : Boolean;
  101. function DeleteObject(amBucket,amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  102. function ListObjects(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TAmazonObjects;
  103. function ListObjectsNames(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TStrings;
  104. function ExistsBucket(amBucketName : string) : Boolean;
  105. function ListBuckets(var amResponseInfo : TAmazonResponseInfo) : TStrings;
  106. function CreateBucket(amBucket : string; amBucketRegion : TAmazonRegion; amACLType : TAmazonACLAccess; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  107. function DeleteBucket(amBucket : string; amBucketRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  108. {$IFNDEF DELPHISYDNEY_UP}
  109. class function GetAWSRegion(Region: TAmazonRegion): string; overload;
  110. {$ENDIF}
  111. class function GetAWSRegion(const Region : string) : TAmazonRegion; overload;
  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.StreamToArray(cStream : TStream) : TArray<Byte>;
  182. var
  183. bs : TBytesStream;
  184. begin
  185. bs := TBytesStream.Create(Result);
  186. try
  187. bs.LoadFromStream(cStream);
  188. Result := bs.Bytes;
  189. finally
  190. bs.Free
  191. end;
  192. end;
  193. function TQuickAmazon.ByteContent(DataStream: TStream): TBytes;
  194. var
  195. Buffer: TBytes;
  196. begin
  197. if not Assigned(DataStream) then Exit(nil);
  198. SetLength(Buffer, DataStream.Size);
  199. // the content may have been read
  200. DataStream.Position := 0;
  201. if DataStream.Size > 0 then
  202. DataStream.Read(Buffer[0], DataStream.Size);
  203. Result := Buffer;
  204. end;
  205. function GetResponseInfo(amResponseInfo : TCloudResponseInfo) : TAmazonResponseInfo;
  206. begin
  207. Result.StatusCode := amResponseInfo.StatusCode;
  208. Result.StatusMsg := amResponseInfo.StatusMessage;
  209. end;
  210. function TQuickAmazon.StorageURL(amBucket : string) : string;
  211. begin
  212. Result := fconAmazon.StorageURL(amBucket)
  213. end;
  214. function TQuickAmazon.PutObject(amBucket, cFilename, amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  215. var
  216. AmazonS3 : TAmazonStorage;
  217. Content : TArray<Byte>;
  218. CloudResponseInfo : TCloudResponseInfo;
  219. begin
  220. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  221. if amBucket = '' then amBucket := '$root';
  222. try
  223. Content := FileToArray(cFilename);
  224. if amObjectName = '' then amObjectName := cFilename;
  225. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  226. CloudResponseInfo := TCloudResponseInfo.Create;
  227. try
  228. Result := AmazonS3.UploadObject(amBucket,amObjectName,Content,False,nil,nil,amACLType,CloudResponseInfo);
  229. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  230. finally
  231. CloudResponseInfo.Free;
  232. end;
  233. finally
  234. AmazonS3.Free;
  235. end;
  236. end;
  237. function TQuickAmazon.PutObject(amBucket : string; cStream : TStream; amObjectName : string; amACLType : TAmazonACLType; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  238. var
  239. AmazonS3 : TAmazonStorage;
  240. Content : TBytes;
  241. CloudResponseInfo : TCloudResponseInfo;
  242. begin
  243. amResponseInfo.StatusCode := 500;
  244. if amBucket = '' then amBucket := '$root';
  245. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  246. try
  247. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  248. try
  249. //AmazonS3.Timeout := fTimeout;
  250. CloudResponseInfo := TCloudResponseInfo.Create;
  251. try
  252. //CloudResponseInfo.Headers.AddPair();
  253. Content := ByteContent(cStream);
  254. Result := AmazonS3.UploadObject(amBucket,amObjectName,Content,False,nil,nil,amACLType,CloudResponseInfo);
  255. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  256. finally
  257. CloudResponseInfo.Free;
  258. end;
  259. finally
  260. AmazonS3.Free;
  261. SetLength(Content,0);
  262. Content := nil;
  263. end;
  264. except
  265. Result := False;
  266. end;
  267. end;
  268. function TQuickAmazon.GetObject(amBucket, amObjectName, cFilenameTo : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  269. var
  270. AmazonS3 : TAmazonStorage;
  271. fs : TFileStream;
  272. CloudResponseInfo : TCloudResponseInfo;
  273. //amParams : TAmazonGetObjectOptionals;
  274. begin
  275. Result := False;
  276. if amBucket = '' then amBucket := '$root';
  277. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  278. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  279. try
  280. //AmazonS3.Timeout := fTimeout;
  281. CloudResponseInfo := TCloudResponseInfo.Create;
  282. if FileExists(cFilenameTo) then fs := TFileStream.Create(cFilenameTo,fmOpenWrite)
  283. else fs := TFileStream.Create(cFilenameTo,fmCreate);
  284. try
  285. try
  286. AmazonS3.GetObject(amBucket,amObjectName,fs,CloudResponseInfo);
  287. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  288. if amResponseInfo.StatusCode = 200 then Result := True;
  289. except
  290. Result := False;
  291. end;
  292. finally
  293. fs.Free;
  294. CloudResponseInfo.Free;
  295. end;
  296. finally
  297. AmazonS3.Free;
  298. end;
  299. end;
  300. function TQuickAmazon.GetObject(amBucket, amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : TMemoryStream;
  301. var
  302. AmazonS3 : TAmazonStorage;
  303. CloudResponseInfo : TCloudResponseInfo;
  304. begin
  305. Result := TMemoryStream.Create;
  306. if amBucket = '' then amBucket := '$root';
  307. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  308. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  309. try
  310. //AmazonS3.Timeout := fTimeout;
  311. CloudResponseInfo := TCloudResponseInfo.Create;
  312. try
  313. try
  314. AmazonS3.GetObject(amBucket,amObjectName,Result,CloudResponseInfo);
  315. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  316. except
  317. Result := nil;
  318. end;
  319. finally
  320. CloudResponseInfo.Free;
  321. end;
  322. finally
  323. AmazonS3.Free;
  324. end;
  325. end;
  326. function TQuickAmazon.ExistsObject(amBucket, amObjectName : string; amRegion : TAmazonRegion) : Boolean;
  327. var
  328. amObject : string;
  329. amObjects : TStrings;
  330. ResponseInfo : TAmazonResponseInfo;
  331. begin
  332. Result := False;
  333. amObjects := ListObjectsNames(amBucket,amObjectName,amRegion,ResponseInfo);
  334. try
  335. if (ResponseInfo.StatusCode = 200) and (Assigned(amObjects)) then
  336. begin
  337. for amObject in amObjects do
  338. begin
  339. if amObject = amObjectName then
  340. begin
  341. Result := True;
  342. Break;
  343. end;
  344. end;
  345. end;
  346. finally
  347. amObjects.Free;
  348. end;
  349. end;
  350. function TQuickAmazon.DeleteObject(amBucket,amObjectName : string; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  351. var
  352. AmazonS3 : TAmazonStorage;
  353. CloudResponseInfo : TCloudResponseInfo;
  354. begin
  355. if amBucket = '' then amBucket := '$root';
  356. if amObjectName.StartsWith('/') then amObjectName := Copy(amObjectName,2,Length(amObjectName));
  357. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  358. try
  359. //AmazonS3.Timeout := fTimeout;
  360. CloudResponseInfo := TCloudResponseInfo.Create;
  361. try
  362. Result := AmazonS3.DeleteObject(amBucket,amObjectName,CloudResponseInfo);
  363. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  364. finally
  365. CloudResponseInfo.Free;
  366. end;
  367. finally
  368. AmazonS3.Free;
  369. end;
  370. end;
  371. function TQuickAmazon.ListObjects(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TAmazonObjects;
  372. var
  373. AmazonS3 : TAmazonStorage;
  374. amObject : TAmazonObject;
  375. i : Integer;
  376. amBucketResult : TAmazonBucketResult;
  377. CloudResponseInfo : TCloudResponseInfo;
  378. cNextMarker : string;
  379. amParams : TStrings;
  380. begin
  381. Result := TAmazonObjects.Create(True);
  382. cNextMarker := '';
  383. if amBucket = '' then amBucket := '$root';
  384. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  385. CloudResponseInfo := TCloudResponseInfo.Create;
  386. try
  387. //AmazonS3.Timeout := fTimeout;
  388. repeat
  389. amParams := TStringList.Create;
  390. try
  391. amParams.Values['prefix'] := amObjectsStartWith;
  392. if cNextMarker <> '' then amParams.Values['marker'] := cNextMarker;
  393. amBucketResult := AmazonS3.GetBucket(amBucket,amParams,CloudResponseInfo,amRegion);
  394. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  395. if Assigned(amBucketResult) then
  396. begin
  397. try
  398. Result.Capacity := amBucketResult.Objects.Count;
  399. for i := 0 to amBucketResult.Objects.Count-1 do
  400. begin
  401. amObject := TAmazonObject.Create;
  402. amObject.Name := amBucketResult.Objects[i].Name;
  403. amObject.Modified := StrToDateTime(amBucketResult.Objects[i].LastModified);
  404. amObject.Size := amBucketResult.Objects[i].Size;
  405. amObject.IsDeleted := amBucketResult.Objects[i].IsDeleted;
  406. Result.Add(amObject);
  407. end;
  408. finally
  409. amBucketResult.Free;
  410. end;
  411. cNextMarker := amBucketResult.Marker;
  412. end;
  413. finally
  414. amParams.Free;
  415. end;
  416. until (cNextMarker = '') or (amResponseInfo.StatusCode <> 200);
  417. finally
  418. AmazonS3.Free;
  419. CloudResponseInfo.Free;
  420. end;
  421. end;
  422. function TQuickAmazon.ListObjectsNames(amBucket : string; amObjectsStartWith : string; amRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : TStrings;
  423. var
  424. AmazonS3 : TAmazonStorage;
  425. i : Integer;
  426. amBucketResult : TAmazonBucketResult;
  427. CloudResponseInfo : TCloudResponseInfo;
  428. cNextMarker : string;
  429. amParams : TStrings;
  430. begin
  431. Result := TStringList.Create;
  432. cNextMarker := '';
  433. if amBucket = '' then amBucket := '$root';
  434. AmazonS3 := TAmazonStorage.Create(fconAmazon);
  435. CloudResponseInfo := TCloudResponseInfo.Create;
  436. try
  437. //AmazonS3.Timeout := fTimeout;
  438. repeat
  439. amParams := TStringList.Create;
  440. try
  441. if amObjectsStartWith <> '' then amParams.Values['prefix'] := amObjectsStartWith;
  442. if cNextMarker <> '' then amParams.Values['marker'] := cNextMarker;
  443. amBucketResult := AmazonS3.GetBucket(amBucket,amParams,CloudResponseInfo,amRegion);
  444. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  445. if Assigned(amBucketResult) then
  446. begin
  447. try
  448. Result.Capacity := amBucketResult.Objects.Count;
  449. for i := 0 to amBucketResult.Objects.Count-1 do Result.Add(amBucketResult.Objects[i].Name);
  450. finally
  451. amBucketResult.Free;
  452. end;
  453. cNextMarker := amBucketResult.Marker;
  454. end;
  455. finally
  456. amParams.Free;
  457. end;
  458. until (cNextMarker = '') or (amResponseInfo.StatusCode <> 200);
  459. finally
  460. AmazonS3.Free;
  461. CloudResponseInfo.Free;
  462. end;
  463. end;
  464. function TQuickAmazon.ExistsBucket(amBucketName : string) : Boolean;
  465. var
  466. amBucket : string;
  467. amBuckets : TStrings;
  468. ResponseInfo : TAmazonResponseInfo;
  469. begin
  470. Result := False;
  471. amBuckets := ListBuckets(ResponseInfo);
  472. try
  473. if (ResponseInfo.StatusCode = 200) and (Assigned(amBuckets)) then
  474. begin
  475. for amBucket in amBuckets do
  476. begin
  477. if amBucket = amBucketName then
  478. begin
  479. Result := True;
  480. Break;
  481. end;
  482. end;
  483. end;
  484. finally
  485. amBuckets.Free;
  486. end;
  487. end;
  488. function TQuickAmazon.ListBuckets(var amResponseInfo : TAmazonResponseInfo) : TStrings;
  489. var
  490. AmazonS3 : TAmazonStorageService;
  491. CloudResponseInfo : TCloudResponseInfo;
  492. Buckets : TStrings;
  493. i : Integer;
  494. begin
  495. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  496. Result := TStringList.Create;
  497. try
  498. //AmazonS3.Timeout := fTimeout;
  499. CloudResponseInfo := TCloudResponseInfo.Create;
  500. try
  501. Buckets := AmazonS3.ListBuckets(CloudResponseInfo);
  502. try
  503. Result.Capacity := Buckets.Count;
  504. for i := 0 to Buckets.Count -1 do
  505. begin
  506. Result.Add(Buckets.Names[i]);
  507. end;
  508. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  509. finally
  510. Buckets.Free;
  511. end;
  512. finally
  513. CloudResponseInfo.Free;
  514. end;
  515. finally
  516. AmazonS3.Free;
  517. end;
  518. end;
  519. function TQuickAmazon.CreateBucket(amBucket : string; amBucketRegion : TAmazonRegion; amACLType : TAmazonACLAccess; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  520. var
  521. AmazonS3 : TAmazonStorageService;
  522. CloudResponseInfo : TCloudResponseInfo;
  523. begin
  524. Result := False;
  525. if amBucket = '' then Exit;
  526. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  527. try
  528. CloudResponseInfo := TCloudResponseInfo.Create;
  529. try
  530. Result := AmazonS3.CreateBucket(amBucket,amACLType,amBucketRegion,CloudResponseInfo);
  531. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  532. finally
  533. CloudResponseInfo.Free;
  534. end;
  535. finally
  536. AmazonS3.Free;
  537. end;
  538. end;
  539. function TQuickAmazon.DeleteBucket(amBucket : string; amBucketRegion : TAmazonRegion; var amResponseInfo : TAmazonResponseInfo) : Boolean;
  540. var
  541. AmazonS3 : TAmazonStorageService;
  542. CloudResponseInfo : TCloudResponseInfo;
  543. begin
  544. Result := False;
  545. if amBucket = '' then Exit;
  546. AmazonS3 := TAmazonStorageService.Create(fconAmazon);
  547. try
  548. CloudResponseInfo := TCloudResponseInfo.Create;
  549. try
  550. Result := AmazonS3.DeleteBucket(amBucket,CloudResponseInfo,amBucketRegion);
  551. amResponseInfo := GetResponseInfo(CloudResponseInfo);
  552. finally
  553. CloudResponseInfo.Free;
  554. end;
  555. finally
  556. AmazonS3.Free;
  557. end;
  558. end;
  559. class function TQuickAmazon.GetAWSRegion(const Region : string) : TAmazonRegion;
  560. begin
  561. Result := TAmazonStorageService.GetRegionFromString(Region);
  562. end;
  563. {$IFNDEF DELPHISYDNEY_UP}
  564. class function TQuickAmazon.GetAWSRegion(Region: TAmazonRegion): string;
  565. begin
  566. Result := TAmazonStorageService.GetRegionString(Region);
  567. end;
  568. {$ENDIF}
  569. end.