使用临时安全凭证使用Delphi将文件上载到Amazon S3

时间:2016-10-25 15:09:31

标签: delphi amazon-web-services amazon-s3

我有一个AWS S3帐户,并获得了SecretAccessKey,SessionToken,Expiration,AccessKeyId项目。我想以最简单的方式将一些文件上传到云端。

已阅读有关授权标题(http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)的一些文档,但仍然不了解如何构建它们))

另外,看到了Indy的另一个例子,所以,请帮助我用这些项目构建授权头:SecretAccessKey,SessionToken,Expiration,AccessKeyId。可以使用“在单个块中传输有效负载”模式+“签名有效负载选项”。

  FS := TFileStream.Create('c:\myfile.txt', fmOpenRead or fmShareDenyWrite);
  try
    IdHTTP1.Request.CustomHeaders.Values['Authorization'] := ...; // please help
    IdHTTP1.Request.BasicAuthentication := False;
    IdHTTP1.Request.Date := ...;   //what should I enter here?
    IdHTTP1.Request.Expect := '100-continue';
    IdHTTP1.Request.ProtocolVersion := pv1_1;
    ...
    IdHTTP1.Put('http://'+BucketName+'.s3.amazonaws.com/myfile.txt', FS);
  finally
    FS.Free;
  end;

谢谢!

2 个答案:

答案 0 :(得分:2)

以下是使用云组件将文件上传到Amazon的例行程序:

function UploadFile(File: TBytes; FileName: string; Bucket: string): boolean;
var Service: TAmazonStorageService;
    ConAmazon: TAmazonConnectionInfo;
begin
  try
    ConAmazon := TAmazonConnectionInfo.Create(nil);
    ConAmazon.AccountKey := 'Dih71bG09****************';
    ConAmazon.AccountName := 'AKIA***********';
    ConAmazon.QueueEndpoint := 'queue.amazonaws.com';
    ConAmazon.StorageEndpoint := 's3-eu-west-1.amazonaws.com';
    ConAmazon.TableEndpoint := 'sdb.amazonaws.com';
    ConAmazon.UseDefaultEndpoints := False;
    Service := TAmazonStorageService.Create(ConAmazon);
    Result := Service.UploadObject(Bucket, FileName, File, TRUE, nil, nil, amzbaPrivate, nil);
  finally
    ConAmazon.Free;
    Service.Free;
  end;
end;

答案 1 :(得分:1)

好的,所以,最后我们已经解决了这个问题:

应该使用来自Delphi10.1柏林的1.Data.Cloud。它支持Amazon AWS4安全标准。 2.应该通过添加以下代码来修补TAmazonStorageService.InitHeaders:在标头中启用临时会话令牌:

...    
Result.Values['x-amz-security-token'] := //your session_token string; 
...

从多方面进行测试,现在工作正常:)