我有一个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;
谢谢!
答案 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;
...
从多方面进行测试,现在工作正常:)